Menu
Coddy logo textTech

Always Block

Часть раздела Основы путешествия по Verilog на Coddy. Урок 46 из 90.

Процедурный блок — это блок кода, в котором операторы выполняются один за другим, последовательно, как в языках программирования, таких как C или Python. В Verilog есть два процедурных блока: initial (выполняется один раз) и always (выполняется непрерывно). Начнём с блока always.

Блок always выполняется непрерывно. Он повторяется бесконечно после начала симуляции. Он используется для описания аппаратных компонентов, которые должны продолжать работать, таких как триггеры, счётчики и комбинационная логика.

Базовый синтаксис:

always @(sensitivity_list) begin
  // Код, который выполняется повторно
end

Конструкция @(sensitivity_list) сообщает block, когда выполнять его. Без неё (и без задержки, такой как #5 внутри) block зациклился бы навсегда и остановил симуляцию.

Пример блока always: Counter

Вот пример того, как можно использовать блок always для создания счётчика.

module counter (
  input clk,
  output reg [3:0] count
);
  always @(posedge clk) count <= count + 1;
endmodule

Как работает этот код

ЧастьЗначение
alwaysЗапускает этот код repeatedly, навсегда
@(posedge clk)Ожидает, пока clock изменится с 0 на 1 (rising edge)
count <= count + 1Берёт текущее значение count, прибавляет 1 и сохраняет его обратно

block выполняется на каждом rising фронте clock. Каждый раз count увеличивается на 1.

Список чувствительности @(posedge clk) сообщает ему выполнять код только на фронтах clock, а не непрерывно. Без этого цикл выполнялся бы бесконечно без задержки.

Блок always с несколькими сигналами

Можно перечислить конкретные сигналы:

always @(a or b) begin
  out = a & b;
end

Это выполняется, когда изменяется a или b.

challenge icon

Задание

Add пропущенный блок always, чтобы этот модуль работал.

Как это работает:

  • При каждом rising clock edge out1 переключается (инвертируется) с 0 на 1 или с 1 на 0
  • out2 следует за out1 (имеет то же значение, что и out1)

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

  1. Add блок always @(posedge clk)
  2. Внутри него переключи out1 (используй out1 = ~out1)
  3. Сделай out2 равным out1

Попробуйте сами

module toggler (
  input clk,
  output reg out1,
  output reg out2
);

  initial begin
    out1 = 0;
    out2 = 0;
  end

  // TODO: Добавить always-блок с posedge clk
  // out1 переключается каждый clock
  // out2 следует за out1

endmodule
quiz iconПроверьте себя

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

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

Потренируйтесь самостоятельно: Онлайн-компилятор Verilog