Список чувствительности
Часть раздела Основы путешествия по Verilog на Coddy — урок 48 из 90.
Список чувствительности указывает блоку always, когда выполняться. Он записывается в скобках после символа @.
Список чувствительности — это набор сигналов или событий, которые запускают блок always. Когда какой-либо сигнал в списке изменяется, блок выполняется.
Синтаксис:
always @(sensitivity_list) begin
// Код выполняется, когда сигналы в списке изменяются
endТипы списков чувствительности
| Тип | Синтаксис | Когда блок выполняется |
|---|---|---|
| Все сигналы (комбинационный) | always @(*) | При изменении любого внутреннего сигнала |
| Определенные сигналы | always @(a or b) | При изменении a или b |
| Фронт сигнала (последовательный) | always @(posedge clk) | По нарастающему фронту тактового сигнала |
| Несколько фронтов | always @(posedge clk or posedge reset) | По фронту тактового сигнала или фронту сброса |
Вариант 1: Все сигналы (*)
Самый безопасный и распространенный вариант для комбинационной логики.
always @(*) begin
out = a & b; // Выполняется при изменении a или b
endСимвол * автоматически включает все signals, считываемые в блоке.
Вариант 2: Конкретные сигналы
always @(a or b) begin
out = a & b; // Выполняется, когда a или b изменяются
endЕсли вы забудете сигнал, значение на `output` не обновится в симуляции при изменении этого сигнала — в результате симуляция больше не будет соответствовать синтезированному аппаратному обеспечению.
Вариант 3: Edge Trigger (posedge)
always @(posedge clk) begin
q <= d; // Выполняется по нарастающему фронту тактового сигнала
endИспользуйте posedge для нарастающего фронта, negedge — для спадающего фронта.
Вариант 4: Множественные фронты
always @(posedge clk or posedge reset) begin
if (reset)
q <= 0;
else
q <= d;
endЧастые ошибки
| Ошибка | Почему это неверно |
|---|---|
always @(a or b or c), но использует d | Отсутствует d → output устаревает в симуляции (расхождение симуляции и синтеза) |
always @(posedge clk or reset) | Отсутствует posedge для reset |
always @(clk) | Следует использовать posedge clk для flip-flop |
Задание
Что нужно сделать:
- Добавьте правильный список чувствительности, чтобы этот D-триггер работал корректно. Блок должен выполняться по нарастающему фронту (
posedge) сигналаclk.
Попробуйте сами
module flipflop (
input clk,
input d,
output reg q
);
always @(______) begin
q <= d;
end
endmoduleВ этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Основы
1Введение
Что такое VerilogHardware против SoftwareУровни абстракции проектированияВаш первый модульКомментарии4Операторы. Часть 1
Арифметические операторыОператор остатка от деленияОператоры сравненияПовторение: простая математикаПобитовые операторы7Оператор Assign и логические вентили
Непрерывное присваиваниеAssign с операторамиВстроенные примитивы вентилейВентили AND, OR, NOTВентили XOR, XNORИтоги: Схемы на логических вентилях10Принятие решений
Оператор ifКонструкция if - elseПовторение: простой компараторОператор caseОператоры casex и casezПовторение: проектирование ALU5Операторы. Часть 2
Логические операторыОператоры редукцииОператоры сдвигаОператор конкатенацииУсловный операторПовторение — Испытание по операторам3Системы счисления
Двоичное представлениеЧисла с заданным размеромЧисла без заданного размераОтрицательные числаСпециальные значения X и ZИтоги — форматы чисел6Модули
Структура модуляВходные и выходные портыПорты InoutИнстанцирование модуляПодключение портов по имениПодключение портов по порядкуИтоги: создание модуля9Процедурные блоки
Блок alwaysБлок initialСписок чувствительностиБлокирующее присваиваниеНеблокирующее присваиваниеИтоги: always против initial