Триггер

Визуальные соответствия между написанным на 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.

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

 


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