МАРСОХОД

Open Source Hardware Project

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

Выделение момента изменения сигналов.

Вот простая задача: выделение момента изменения длительного сигнала.
Я выделил ее в отдельную статью, потому, что это весьма часто используемый технический прием. Такие вещи приходится писать довольно часто и уже почти не задумываешься над ними.

Идея в общем очень простая. Есть длительный сигнал signal. С некоторой частотой clk запоминаем его значение в регистре prev_signal. Потом сравниваем текущее значение сигнала signal и его предыдущее значение prev_signal. На основании этого "сравнения" выдаем результат.

Выделяем момент фронта.

Фрагмент кода на языке Verilog выглядит вот так:


reg prev_signal;
always @(posedge clk)
 prev_signal <= signal;

wire front_edge;
assign front_edge = ~prev_signal & signal;


Вот что получается при синтезе этого кода (смотрю программой Altera Quartus II RTLViewer):

Выделение фронта сигнала

Временная диаграмма поясняет принцип работы:

Выделение фронта сигнала - временная диаграмма

Теперь определяем момент спада сигнала.

Код на Verilog примерно такой же:


reg prev_signal;
always @(posedge clk)
 prev_signal <= signal;

wire back_edge;
assign back_edge  =  prev_signal & ~signal;


Из этого кода получается вот такая логика:

Выделение момента спада сигнала

Ну и вот "времянка":

Выделение момента спада сигнала - временная диаграмма

Выделяем моменты и фронта и спада.

Точно так же мы можем найти и все моменты изменения сигнала:


reg prev_signal;
always @(posedge clk)
 prev_signal <= signal;

wire both_edges;
assign both_edges =  prev_signal ^ signal;


Соответствующая схема:

Выделение фронтов и спадов сигнала

И ее временная диаграмма:

Выделение моментафронта -  спада сигнала

Вроде бы все просто? Да так и есть! Но еще раз повторюсь - эти "шаблоны" кода используются в разных проектах довольно часто.

 

 

Комментарии  

+2 #10 nckm 26.03.2014 11:39
Цитирую Владимир Хлуденьков:
Здравствуйте. Скажите, можно ведь сразу написать

always @(posedge clk or negedge clk)?

сомневаюсь, что так получится..
+1 #9 Владимир Хлуденьков 26.03.2014 06:56
Здравствуйте. Скажите, можно ведь сразу написать

always @(posedge clk or negedge clk)?
+1 #8 nfader 26.12.2013 04:22
Данная конструкция не подходит для выделения фронта сигнала, находящегося в другом тактовом домене. Сначала надо привязать signal к тактовому домену clk. Это описано в статье "Синхронизатор сигнала для CDC на Verilog".
+1 #7 Ra3wum 08.08.2013 20:39
Цитирую A.P.:
а почему бы просто не использовать конструкцию вида always@(posedge signal) или negedge signal ?

Данная конструкция скорее всего приведёт к несинтезируемом у или непредсказуемо работающему автомату.
Предложенное же здесь решение очень удобно и позволяет зафиксировать изменение на входе в нужный момент.
Автору статьи большое спасибо, у меня под Actel-ом именно в таком виде нормально заработал самописный последовательны й интерфейс.
0 #6 vadisat 02.08.2013 20:02
Я уже писал на форуме что эти конструкции по невыясненным причинам работают непостоянно и некоректно, я стал использовать конструкции на сдвиговом регистре
+6 #5 Pe3ucTop 02.08.2013 09:43
Отвечу за автора статьи:
Это требование синхронной логики, при исипользовании:
Цитирую A.P.:
... конструкцию вида always@(posedge signal) или negedge signal ?

мы получаем асинхронный сигнал относительно тактового сигнала.
Вообщем Тригер синхронизирует сигнал, а вот логика делает его актуальным только на следующий такт частоты, и только на один.
Т.е. в синхронных дизайнах always@ или к CLK или RST , с остальными сигналами работают как с данными.
+4 #4 ohmjke 02.08.2013 02:17
Присоединяюсь к вопросу!
+4 #3 A.P. 26.07.2011 09:44
а почему бы просто не использовать конструкцию вида always@(posedge signal) или negedge signal ?
+3 #2 nckm_ 11.07.2011 05:49
Цитирую Chettuser:
А как сделать чтобы при 5-10 нс не было задержки both_edge относительно такта?
У меня версия 9.1 (ModelSim не пользуюсь пока - слишком сложно для меня).

не очень понятен вопрос - задержка всегда есть на один такт. Время задержки зависит от тактовой частоты
+2 #1 Chettuser 10.07.2011 08:49
А как сделать чтобы при 5-10 нс не было задержки both_edge относительно такта?
У меня версия 9.1 (ModelSim не пользуюсь пока - слишком сложно для меня).

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


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


GitHub YouTube Twitter
Вы здесь: Начало Verilog Выделение момента изменения сигналов.