Список чувствительности
Часть раздела Основы путешествия по 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Символ * автоматически включает все сигналы, считываемые в блоке.
Вариант 2: Конкретные сигналы
always @(a or b) begin
out = a & b; // Выполняется при изменении a или b
endЕсли вы забудете сигнал, вы получите защелку (непреднамеренную память).
Вариант 3: Триггер по фронту (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 → защелка (latch) |
always @(posedge clk or reset) | Отсутствует posedge для reset |
always @(clk) | Следует использовать posedge clk для триггеров (flip-flops) |
Задание
Что нужно сделать:
- Добавьте правильный список чувствительности (sensitivity list), чтобы этот триггер заработал. Блок должен срабатывать по переднему фронту
clk.
Шпаргалка
Список чувствительности следует за @ и определяет, когда выполняется блок always:
always @(sensitivity_list) begin
// выполняется при изменении перечисленных сигналов
end| Тип | Синтаксис | Срабатывает, когда |
|---|---|---|
| Все сигналы | always @(*) | Любой считываемый сигнал изменяется |
| Конкретные сигналы | always @(a or b) | Изменяется a или b |
| Передний фронт | always @(posedge clk) | Передний фронт clk |
| Несколько фронтов | always @(posedge clk or posedge reset) | Срабатывает любой из фронтов |
Используйте @(*) для комбинационной логики; используйте posedge/negedge для последовательностной логики:
// Комбинационная логика
always @(*) begin
out = a & b;
end
// Последовательностная логика (триггер с асинхронным сбросом)
always @(posedge clk or posedge reset) begin
if (reset) q <= 0;
else q <= d;
endРаспространенные ошибки: пропуск сигнала в конкретном списке приводит к созданию защелки (latch); написание always @(clk) вместо always @(posedge clk) для триггеров; пропуск posedge перед reset в списке с несколькими фронтами.
Попробуйте сами
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