МАРСОХОД

Open Source Hardware Project

Язык описания аппаратуры Verilog HDL

Синхронизатор сигнала для CDC на Verilog

В языке 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 видна получившаяся эквивалентная схема:
Синхронизатор Clock Domain Cross

Как раз это то, что нужно.
Асинхронный сигнал фиксируется по фронту 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-триггере сигнал является асинхронным к тактовой частоте. Подробно о проблеме метастабильности триггера написано вот здесь.

 

 

Комментарии  

0 #14 Женя Борн 23.11.2016 12:49
А как правильно описывать constraints для такой цепи?
+1 #13 tfwbbt 03.12.2014 10:52
Цитирую DragonSmile:

Вот как раз "защёлкнуться" в такое состояние триггер не сможет. В триггере есть положительная обратная связь, которая достаточно быстро переведёт его либо в "0", либо в "1". В любом случае состояние на входе изначально было неопределённым, так что обработка такого сигнала некорректна!
Другое дело после обработки мажоритарной логикой. Если сигнал на входе схемы всё таки перешёл в устойчивое состояние - на выходе последнего триггера при любом раскладе будет корректный сигнал.
А если сигнал на входе меняется слишком быстро - тут уж ничего не поможет!


Я делаю примерно также, только обычно я ставлю отдельно синхронизатор из 2х DFF, а уже после него фильтр-антидреб езг, плюс если есть входы типа триггер шмитта (есть в maxii) их тоже ставлю, помогает, если сигнал на ножке ПЛИС имеет плохие фронты.

Прошу прощенья, сразу не смог понять, о чем вы вообще :oops:
0 #12 DragonSmile 28.11.2014 16:10
Цитирую tfwbbt:
Ваше решение в этом плане ничем не лучше. Ну или объясните, чем лучше.

Сначала об исходной идее. При неопределённом состоянии на входе первый триггер переключится в устойчивое состояние с заметной задержкой, если считать, что она меньше периода синхросигнала - проблема "неопределённог о состояния" будет решена. Но будет усугублена проблема "иголок".
При использовании трёх триггеров с мажоритарной логикой решаются ОБЕ проблемы, потому что и сигнал на выходе первого триггера успеет установиться, и "иголка" не пройдёт.
0 #11 DragonSmile 28.11.2014 15:59
Цитирую tfwbbt:
Я не спорю, что ваш вариант "надежный", но у меня подозрения, что он "не помогает".
Вы вот говорите об "иголках" на выходе комбинаторной логики, это конечно все так. Но статья о том, что при изменении сигнала на входе D триггера в момент фронта (плюс-минус) триггер может защелкнуться в состояние, которое не является "0" или "1".

Вот как раз "защёлкнуться" в такое состояние триггер не сможет. В триггере есть положительная обратная связь, которая достаточно быстро переведёт его либо в "0", либо в "1". В любом случае состояние на входе изначально было неопределённым, так что обработка такого сигнала некорректна!
Другое дело после обработки мажоритарной логикой. Если сигнал на входе схемы всё таки перешёл в устойчивое состояние - на выходе последнего триггера при любом раскладе будет корректный сигнал.
А если сигнал на входе меняется слишком быстро - тут уж ничего не поможет!
0 #10 tfwbbt 28.11.2014 14:19
Глючные решения - это безусловно плохо. :-)
Прошу прощения, если мои комментарии звучат агрессивно, это не специально :sigh:

Я уже даже не знаю, как объяснить. Антибиотики надежно выкашивают бактерии, только если у вас грипп - они вам не помогут.

Я не спорю, что ваш вариант "надежный", но у меня подозрения, что он "не помогает".
Вы вот говорите об "иголках" на выходе комбинаторной логики, это конечно все так. Но статья о том, что при изменении сигнала на входе D триггера в момент фронта (плюс-минус) триггер может защелкнуться в состояние, которое не является "0" или "1". Состояние неустойчиво и может рассосаться до следующего такта clk, поэтому 2-ой триггер и помогает. Состояние самого триггера, а не какая-то иголка на входе. Ваше решение в этом плане ничем не лучше. Ну или объясните, чем лучше.
0 #9 DragonSmile 28.11.2014 13:29
Цитирую tfwbbt:
Это вообще ни при чем. То, что вы описали - это просто пример gated clock. Типичный причем.

В статье же речь о другом. Рекомендую посмотреть таки ссылку в конце.

Ваше решение с мажоритарной логикой это по сути фильтр по длительности импульса. Он как минимум будет не лучше этого решения, а как максимум будет просто бесполезен.


Я предложил надёжно работающий вариант. Ключевое слово - надёжный. Кого устраивают хламовые, глючные решения - их личное дело...
0 #8 tfwbbt 28.11.2014 12:25
Цитирую DragonSmile:

Вот именно. "Иголка" на входе первого триггера может рассосаться (она может появиться, если синхросигнал формируется счётчиком с асинхронным сбросом), а вот второй триггер её растянет вплоть до следующего тактового импульса. А третий просто ещё добавит задержку. Неудачное решение!

Это вообще ни при чем. То, что вы описали - это просто пример gated clock. Типичный причем.

В статье же речь о другом. Рекомендую посмотреть таки ссылку в конце.

Ваше решение с мажоритарной логикой это по сути фильтр по длительности импульса. Он как минимум будет не лучше этого решения, а как максимум будет просто бесполезен.
0 #7 DragonSmile 27.11.2014 21:02
Цитирую tfwbbt:
Да и вообще, предложили бы свое решение, а то ничего лучше цепочки из 2-х триггеров для избавления от этого потенциально неприятного явления я не видел :-)


Это другой вопрос :-)
Можно использовать к примеру три триггера, с блоком мажоритарной логики перед последним (состояние на выходе схемы выбирается "большинством голосов".
Правда появится задержка сигнала на два-три тактовых импульса, но для периодических сигналов это не всегда критично.
0 #6 DragonSmile 27.11.2014 21:01
Цитирую tfwbbt:
К приходу следующего фронта clk нестабильность в первом триггере может успеть рассосаться, триггер примет стабильное значение (какое - не уверен), и второй триггер защелкнет уже стабильный сигнал.
Гарантий, конечно, это не дает, но вероятность неблагоприятного исхода уменьшает. Именно поэтому используют цепочки из 2, а иногда и более триггеров.


Вот именно. "Иголка" на входе первого триггера может рассосаться (она может появиться, если синхросигнал формируется счётчиком с асинхронным сбросом), а вот второй триггер её растянет вплоть до следующего тактового импульса. А третий просто ещё добавит задержку. Неудачное решение!
0 #5 tfwbbt 27.11.2014 16:01
Да и вообще, предложили бы свое решение, а то ничего лучше цепочки из 2-х триггеров для избавления от этого потенциально неприятного явления я не видел :-)
0 #4 tfwbbt 27.11.2014 16:00
Цитирую DragonSmile:
И чем ЭТО решение лучше одного триггера? Второй триггер просто добавляет задержку, никакой проверки на стабильность входного сигнала нету...

К приходу следующего фронта clk нестабильность в первом триггере может успеть рассосаться, триггер примет стабильное значение (какое - не уверен), и второй триггер защелкнет уже стабильный сигнал.
Гарантий, конечно, это не дает, но вероятность неблагоприятног о исхода уменьшает. Именно поэтому используют цепочки из 2, а иногда и более триггеров.
0 #3 DragonSmile 27.11.2014 15:44
И чем ЭТО решение лучше одного триггера? Второй триггер просто добавляет задержку, никакой проверки на стабильность входного сигнала нету...
0 #2 tfwbbt 12.11.2014 12:18
Это и есть 2 последовательны х D-триггера.
0 #1 Filin 11.11.2014 08:17
Похоже на динамический D-триггер...

Добавить комментарий


Защитный код
Обновить


GitHub YouTube Twitter
Вы здесь: Начало Verilog Синхронизатор сигнала для CDC на Verilog