МАРСОХОД

Open Source Hardware Project

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

Триггер

Визуальные соответствия между написанным на Verilog коде и синтезируемой в аппаратуре логикой

Просто триггер (flip-flop).

Это просто регистр или триггер - он запоминает входные данные со входа d и подает их на выход q. Запоминание происходит в момент, когда сигнал тактовой частоты clk переходит из нуля в единицу (то есть в момент фронта сигнала clk). На языке описания аппаратуры Verilog это выглядит вот так:


reg q;
always @(posedge clk)
   q <= d;
  

  триггер

Обратите внимание, на временных диаграммах значение на выходе меняется только в момент фронта тактовой частоты:

временные сигналы триггера

 

Триггер чувствительный к отрицательному фронту сигнала тактовой частоты.

Триггер / регистр может быть активным не только по фронту (posedge), но и по спаду сигнала тактовой частоты - на языке Verilog это поведение описывается словом negedge. В схемотехническом описании у регистра появляется небольшой кружочек на сигнале clk символизирующий инвертор.


reg q;
always @(negedge clk)
   q <= d;
  

триггер чувствительный к отрицательному фронту тактовой частоты

Теперь сигнал на выходе меняется только по спаду тактовой частоты:

временная диаграмма сигналов у триггера 

Триггер с асинхронным сбросом.

Ассинхронный, значит не связанный с тактовой частотой. Ассинхронные сброс или установка применяются в основном только для инициализации триггеров / регистров схемы в исходное состояние перед началом работы:


reg q;

always @(posedge clk or posedge reset)
if(reset)
    q <= 1'b0;
else
    q <= d;
 
 


триггер с ассинхронным сбросом

Сигнал асинхронного сброса (или установки) имеет высший приоритет:

временная диаграмма сигналов триггера с ассинхронным сбросом 

Триггер с синхронным сбросом

На первый взляд, вот этот код на Verilog ничем не отличается от кода регистра с ассинхронным сбросом, который мы рассмотрели чуть выше. Тем не менее, отличие кардинальное. В списке чувствительности always теперь нет "posedge reset".


reg q;

always @(posedge clk)
if(reset)
  q <= 1'b0;
else
  q <= d;
  
  


Результат реализации в железе тоже теперь совершенно иной: на входе появился мультиплексор выбирающий из входного сигнала d или значения "ноль" в зависимости от входного сигнала reset.

триггер с синхронным сбросом 

Регистр с синхронным сбросом можно представить себе как регистр с мультиплексором на входе.

временная диаграмма сигналов триггера с синхронным сбросом

Триггер со входом разрешения записи

Запись в регистр происходит только в те фронты сигнала тактовой частоты, во время которых сигнал enable установлен. На Verilog это можно написать вот так:


reg q;

always @(posedge clk)
 if(enable)
   q <= d;


flop_clk_en

Триггер со входом разрешения записи Enable

Вход разрешения записи "в железе" может быть реализован разными способами. Например, сигнал тактовой частоты может подаваться через гейт, вот так:  real_clk = clk & enable. Вторая реализация может быть, например в виде входного мультиплексора, который выбирает для записи либо новое значение d, либо предыдущее, уже запомненное q.

Временная диаграмма сигналов триггера со входом разрешения записи Enable 

Регистр со входом разрешения записи и асинхронным сбросом

Опишем его на Verilog вот так:


always @(posedge clk or posedge reset)
 if(reset)
  q <= 1'b0;
 else
 if
(enable)
  q <= d;


Триггер со входом разрешения записи и ассинхронным сбросом

Триггер со входом разрешения записи и ассинхронным сбросом

Компилятор / синтезатор может по разному реализовать такой регистр, но поведение его в обоих случаях одинаково:

Временная диаграмма сигналов триггера со входом Enable и ассинхронным сбросом

Триггер с разрешением записи с синхронной установкой и асинхронным сбросом.

Вот такое довольно мудреное описание на языке Verilog в аппаратуре может вылиться в простой регистр плюс мультиплексор.


reg q;

always @(posedge clk or posedge reset)
 if(reset)
   q <= 1'b0;
 else
 if
(enable)
 begin
   if
(set)
     q <= 1'b1;
   else
     q <= d;

 end


Триггер с сигналами Enable, Set, Reset

Такая схема запоминает входное значение, либо единицу по фронту тактовой частоты clk, но только если сигнал разрешения записи enable установлен.

Временная диаграмма сигналов триггера с синхронной установкой и ассинхронным сбросом 

Триггер с разрешением записи с синхронной установкой и асинхронным сбросом, но сигнал установки имеет безусловный приоритет.

Вот такой код на Verilog дает приоритет сигналу set перед сигналом enable:  


reg q;

always @(posedge clk or posedge reset)
 if(reset)
   q <= 1'b0;
 else
 if
(set)
   q <= 1'b1;
 else
 if
(enable)
   q <= d;


Триггер с разрешением записи и синхронной установкой

В данном примере по сигналу set и фронту тактовой частоты clk регистр всегда будет устанавливаться в единицу, не зависимо от сигнала enable. Ну а уж если set не установлен, то новое значение сигнала d будет записано или нет в зависимости от enable.

сигналы триггера с приоритетом записи

 

Комментарии  

0 #8 DragonSmile 28.11.2014 13:34
Цитирую tfwbbt:
Гарантирую я сам себе, как автор проекта :lol:
А в части задержки - гарантирует утилита TimeQuest, которой я, к несчастью, не очень умею пользоваться :oops:


Уточняю, как "автор простейших одноразовых проектов". Дело хозяйское, но для серьёзной работы такая метода совершенно непригодна (что, к счастью, прекрасно знают разработчики макроячеек ПЛИС).
И только такой подход, гарантирующий появление данных на выходе макроячеек без задержек, позволяет получать предсказуемые результаты по групповым задержкам в схеме. Плюс, разумеется, требуются специальные меры по распределению тактовых сигналов по всем макроячейкам на кристалле ПЛИС.
-2 #7 tfwbbt 28.11.2014 12:38
Цитирую DragonSmile:

Ключевое слово ЕСЛИ. Кто гарантирует, что сигнал enable не пришёл с "тупого" блока логики? И кто гарантирует, что задержка, вносимая элементом И не приведёт к ошибкам в работе логики, использующей выходной сигнал триггера?
Именно поэтому в макроячейках ПЛИС к тактовым сигналам триггеров ничего лишнего не добавляют!

Гарантирую я сам себе, как автор проекта :lol:
А в части задержки - гарантирует утилита TimeQuest, которой я, к несчастью, не очень умею пользоваться :oops:
0 #6 DragonSmile 27.11.2014 21:13
Цитирую tfwbbt:


Конфликта не возникнет, если у нас enable тоже может измениться только по фронту clk.
Но вообще данная реализация относится к bad coding practice, и квартус выдаст предупреждение о наличии gated clock.


Ключевое слово ЕСЛИ. Кто гарантирует, что сигнал enable не пришёл с "тупого" блока логики? И кто гарантирует, что задержка, вносимая элементом И не приведёт к ошибкам в работе логики, использующей выходной сигнал триггера?
Именно поэтому в макроячейках ПЛИС к тактовым сигналам триггеров ничего лишнего не добавляют!
0 #5 tfwbbt 27.11.2014 18:28
Цитирую DragonSmile:
"Вход разрешения записи "в железе" может быть реализован разными способами. Например, сигнал тактовой частоты может подаваться через гейт, вот так: real_clk = clk & enable."

Нельзя так делать, потому что это приведёт к ошибочному срабатыванию из-за гонок фронтов.

1) фронт clk при L на enable
триггер не срабатывает, что правильно
2) с небольшой задержкой H на enable
и вот тут триггер переключается, хотя не должен!


Конфликта не возникнет, если у нас enable тоже может измениться только по фронту clk.
Но вообще данная реализация относится к bad coding practice, и квартус выдаст предупреждение о наличии gated clock.
0 #4 DragonSmile 27.11.2014 16:04
"Вход разрешения записи "в железе" может быть реализован разными способами. Например, сигнал тактовой частоты может подаваться через гейт, вот так: real_clk = clk & enable."

Нельзя так делать, потому что это приведёт к ошибочному срабатыванию из-за гонок фронтов.

1) фронт clk при L на enable
триггер не срабатывает, что правильно
2) с небольшой задержкой H на enable
и вот тут триггер переключается, хотя не должен!
+1 #3 nckm 02.06.2013 17:21
Цитирую yazovskikh-nikolay:
Спасибо автору за эту статью. С временными диаграммами - это замечательно. Для начинающего - это клад. В Pdf формате и всю статью иметь у себя в качестве справочного источника было - бы прекрасно. Вопрос: использование не блокирующего символа q

не очень понятен вопрос, q - ведь всего лишь имя регистра.
+2 #2 yazovskikh-nikolay 02.06.2013 03:11
Спасибо автору за эту статью. С временными диаграммами - это замечательно. Для начинающего - это клад. В Pdf формате и всю статью иметь у себя в качестве справочного источника было - бы прекрасно. Вопрос: использование не блокирующего символа q
+2 #1 BooZe 09.11.2012 08:27
Обязательно ли использовать posedge reset в списке чувствительност и always блока (для сброса триггеров с асинхронным сбросом) или можно обойтись только именем сигнала сброса (reset)?

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


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


GitHub YouTube Twitter
Вы здесь: Начало Verilog Триггер