Блок always
Часть раздела Основы путешествия по Verilog на Coddy — урок 46 из 90.
Процедурный блок — это блок кода, в котором инструкции выполняются один за другим, последовательно — точно так же, как в языках программирования, таких как C или Python. В Verilog есть два процедурных блока: initial (выполняется один раз) и always (выполняется непрерывно). Давайте начнем с блока always.
Блок always выполняется непрерывно — он повторяется бесконечно после запуска симуляции. Он используется для описания аппаратного обеспечения, которое должно работать постоянно, такого как триггеры, счетчики и комбинационная логика.
Базовый синтаксис:
always @(sensitivity_list) begin
// Код, который выполняется многократно
end@(sensitivity_list) сообщает блоку, когда следует выполняться. Без него блок будет зацикливаться бесконечно и приведет к зависанию симуляции.
Пример блока always: Счетчик
Вот пример того, как мы можем использовать блок always для создания счетчика.
module counter (
input clk,
output reg [3:0] count
);
always @(posedge clk) count = count + 1;
endmoduleКак работает этот код
| Часть | Значение |
|---|---|
always | Выполнять этот код постоянно, бесконечно |
@(posedge clk) | Ждать перехода тактового сигнала от 0 к 1 (передний фронт) |
count = count + 1 | Взять текущее значение count, прибавить 1 и сохранить его обратно |
Блок выполняется по каждому переднему фронту тактового сигнала. Каждый раз count увеличивается на 1.
Список чувствительности @(posedge clk) указывает на выполнение только по фронтам тактового сигнала, а не непрерывно. Без этого цикл выполнялся бы бесконечно без задержки.
Блок always с несколькими сигналами
Вы можете перечислить конкретные сигналы:
always @(a or b) begin
out = a & b;
endЭто выполняется, когда a или b изменяется.
Задание
Добавьте недостающий блок always, чтобы этот модуль заработал.
Как это работает:
- На каждом положительном фронте тактового сигнала
out1переключается (инвертируется) с 0 на 1 или с 1 на 0 out2следует заout1(принимает то же значение, что иout1)
Что нужно сделать:
- Добавьте блок
always @(posedge clk) - Внутри сделайте так, чтобы
out1переключался (используйтеout1 = ~out1) - Сделайте
out2равнымout1
Шпаргалка
Блок always выполняется непрерывно и используется для описания аппаратного обеспечения, такого как триггеры и счетчики.
always @(sensitivity_list) begin
// Код, который выполняется многократно
end@(posedge clk) срабатывает по переднему фронту тактового сигнала; @(a or b) срабатывает при изменении любого из перечисленных сигналов.
// Счетчик: увеличивается на каждом переднем фронте тактового сигнала
always @(posedge clk) count = count + 1;
// Комбинационная логика: выполняется при изменении a или b
always @(a or b) begin
out = a & b;
endПримечание: выходные сигналы, управляемые блоками always, должны быть объявлены как reg.
Попробуйте сами
module toggler (
input clk,
output reg out1,
output reg out2
);
initial begin
out1 = 0;
out2 = 0;
end
// TODO: Добавить блок always с posedge clk
// out1 переключается каждый такт
// out2 следует за out1
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