Menu
Coddy logo textTech

Список чувствительности

Часть раздела Основы путешествия по 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)
challenge icon

Задание

Что нужно сделать:

  1. Добавьте правильный список чувствительности (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
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Основы