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.
Задание
Add пропущенный блок always, чтобы этот модуль работал.
Как это работает:
- При каждом rising clock edge
out1переключается (инвертируется) с 0 на 1 или с 1 на 0 out2следует заout1(имеет то же значение, что иout1)
Что нужно сделать:
- Add блок
always @(posedge clk) - Внутри него переключи
out1(используйout1 = ~out1) - Сделай
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В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Основы
1Введение
Что такое VerilogАппаратное обеспечение и программное обеспечениеВаш первый модульКомментарииУровни абстракции проектирования4Operators Part 1
Arithmetic OperatorsModulo OperatorComparison OperatorsRecap - Simple MathBitwise Operators7Assign And Gates
Continuous AssignmentAssign With OperatorsBuilt In Gate PrimitivesAND OR NOT GatesXOR XNOR GatesRecap - Logic Gate Circuit10Decision Making
If StatementIf - ElseRecap - Simple ComparatorCase StatementCasex And CasezRecap - ALU Design5Operators Part 2
Logical OperatorsReduction OperatorsShift OperatorsConcatenation OperatorConditional OperatorRecap - Operator Challenge3Number System
Binary RepresentationSized NumbersUnsized NumbersNegative NumbersSpecial Values X And ZRecap - Number Formats6Modules
Module StructureInput And Output PortsInout PortsModule InstantiationPort Mapping By NamePort Mapping By OrderRecap - Build A Module9Procedural Blocks
Always BlockInitial BlockSensitivity ListBlocking AssignmentNon Blocking AssignmentRecap - Always vs Initial15Traffic Light Controller
Defining The StatesState Machine LogicПотренируйтесь самостоятельно: Онлайн-компилятор Verilog