В языке Verilog HDL для описания синхронизаторов сигналов, пересекающих клоковый домен (CDC, Clock Domain Cross) используются очень простые конструкции. Это понятно, ведь синхронизатор это просто два (редко три) последовательных триггера.
module synchronizer(
input wire signal,
input wire clk,
output wire signal_sync
);
reg a,b;
always @(posedge clk)
begin
b<=a;
a<=signal;
end
assign signal_sync = b;
endmodule
После компиляции такого модуля средой Altera Quartus II в его RTL Viewer видна получившаяся эквивалентная схема:
Как раз это то, что нужно.
Асинхронный сигнал фиксируется по фронту clk в регистре a и существует вероятность, что после него сигнал будет некоторое время метастабильный. После фиксации в регистре b сигнал можно уже считать стабильным.
Часто синхронизатор не выделяют в отдельный модуль, а просто, где нужно, описывают его в тексте программы Verilog.
В виде сдвигового регистра:
reg [1:0]sync;
always @(posedge clk)
sync <= { sync[0], signal };
wire signal_sync;
assign signal_sync = sync[1];
Здесь в двухбитный регистр sync по фронту clk записывается 2х битное число: в старшем бите сигнал sync[0], а в младшем – signal. Это описание принципиально ни чем не отличается от первого, просто иная запись.
Синхронизатор нужно ставить там, где фиксируемый в D-триггере сигнал является асинхронным к тактовой частоте. Подробно о проблеме метастабильности триггера написано вот здесь.

Я делаю примерно также, только обычно я ставлю отдельно синхронизатор из 2х DFF, а уже после него фильтр-антидреб езг, плюс если есть входы типа триггер шмитта (есть в maxii) их тоже ставлю, помогает, если сигнал на ножке ПЛИС имеет плохие фронты.
Прошу прощенья, сразу не смог понять, о чем вы вообще
Сначала об исходной идее. При неопределённом состоянии на входе первый триггер переключится в устойчивое состояние с заметной задержкой, если считать, что она меньше периода синхросигнала - проблема "неопределённог о состояния" будет решена. Но будет усугублена проблема "иголок".
При использовании трёх триггеров с мажоритарной логикой решаются ОБЕ проблемы, потому что и сигнал на выходе первого триггера успеет установиться, и "иголка" не пройдёт.
Вот как раз "защёлкнуться" в такое состояние триггер не сможет. В триггере есть положительная обратная связь, которая достаточно быстро переведёт его либо в "0", либо в "1". В любом случае состояние на входе изначально было неопределённым, так что обработка такого сигнала некорректна!
Другое дело после обработки мажоритарной логикой. Если сигнал на входе схемы всё таки перешёл в устойчивое состояние - на выходе последнего триггера при любом раскладе будет корректный сигнал.
А если сигнал на входе меняется слишком быстро - тут уж ничего не поможет!
Прошу прощения, если мои комментарии звучат агрессивно, это не специально :sigh:
Я уже даже не знаю, как объяснить. Антибиотики надежно выкашивают бактерии, только если у вас грипп - они вам не помогут.
Я не спорю, что ваш вариант "надежный", но у меня подозрения, что он "не помогает".
Вы вот говорите об "иголках" на выходе комбинаторной логики, это конечно все так. Но статья о том, что при изменении сигнала на входе D триггера в момент фронта (плюс-минус) триггер может защелкнуться в состояние, которое не является "0" или "1". Состояние неустойчиво и может рассосаться до следующего такта clk, поэтому 2-ой триггер и помогает. Состояние самого триггера, а не какая-то иголка на входе. Ваше решение в этом плане ничем не лучше. Ну или объясните, чем лучше.
Я предложил надёжно работающий вариант. Ключевое слово - надёжный. Кого устраивают хламовые, глючные решения - их личное дело...
Это вообще ни при чем. То, что вы описали - это просто пример gated clock. Типичный причем.
В статье же речь о другом. Рекомендую посмотреть таки ссылку в конце.
Ваше решение с мажоритарной логикой это по сути фильтр по длительности импульса. Он как минимум будет не лучше этого решения, а как максимум будет просто бесполезен.
Это другой вопрос
Можно использовать к примеру три триггера, с блоком мажоритарной логики перед последним (состояние на выходе схемы выбирается "большинством голосов".
Правда появится задержка сигнала на два-три тактовых импульса, но для периодических сигналов это не всегда критично.
Вот именно. "Иголка" на входе первого триггера может рассосаться (она может появиться, если синхросигнал формируется счётчиком с асинхронным сбросом), а вот второй триггер её растянет вплоть до следующего тактового импульса. А третий просто ещё добавит задержку. Неудачное решение!
К приходу следующего фронта clk нестабильность в первом триггере может успеть рассосаться, триггер примет стабильное значение (какое - не уверен), и второй триггер защелкнет уже стабильный сигнал.
Гарантий, конечно, это не дает, но вероятность неблагоприятног о исхода уменьшает. Именно поэтому используют цепочки из 2, а иногда и более триггеров.