Non Blocking Assignment
Часть раздела Основы путешествия по Verilog на Coddy. Урок 50 из 90.
На предыдущем уроке мы рассмотрели блокирующее присваивание (=), которое выполняется шаг за шагом. Теперь мы рассмотрим неблокирующее присваивание (<=), которое выполняется одновременно, параллельно.
Неблокирующее присваивание использует оператор <=. Оно называется «non-blocking», потому что не блокирует выполнение следующего оператора. Все неблокирующие присваивания в блоке выполняются одновременно.
Синтаксис:
variable <= expression;Когда использовать неблокирующее присваивание
Неблокирующее присваивание (<=) используется для последовательной логики: схем, которые используют clock и имеют память. Выходы изменяются только на edge clock (обычно на возрастающем фронте).
Примеры последовательной логики:
- Триггеры
- Регистры
- Счётчики
- Конечные автоматы
- Регистры сдвига
Пример Verilog:
initial begin
a <= 5; // Запланировано, но ещё не выполнено
b <= a + 2; // Запланировано, использует СТАРОЕ значение a
c <= b * 3; // Запланировано, использует СТАРОЕ значение b
endВсе три присваивания выполняются одновременно с использованием значений old. В конце временного шага все обновления происходят вместе.
Non-blocking в блоках always (последовательная логика)
Non-blocking используется для последовательной логики: схем, которые используют clock и имеют память (триггеры, регистры, счётчики).
always @(posedge clk) begin
q <= d; // q получает d по фронту тактового сигнала
count <= count + 1; // count увеличивается по фронту тактового сигнала
endОба присваивания происходят одновременно, используя values до clock edge.
Сводка
| Правило | Объяснение |
|---|---|
Используйте <= для последовательной логики | always @(posedge clk) |
Используйте = для комбинационной логики | always @(*) |
| Non-blocking выполняется параллельно | All присваивания происходят одновременно |
| Values обновляются в end временного Step | Не сразу |
Задание
Завершите non-blocking присваивание
Add отсутствующие non-blocking присваивания, чтобы этот 2-битный сдвиговый регистр работал.
Как это работает:
- При каждом фронте тактового сигнала
q1getsd q2gets старое значениеq1
Что нужно сделать:
- Assign
dвq1(non-blocking) - Assign
q1вq2(non-blocking)
Попробуйте сами
module shift_register (
input clk,
input reset,
input d,
output reg q1,
output reg q2
);
always @(posedge clk or posedge reset) begin
if (reset) begin
q1 <= 0;
q2 <= 0;
end else begin
// TODO: Добавить логику сдвига
// Шаг 1: Присвоить d к q1 (неблокирующее)
// Шаг 2: Присвоить q1 к q2 (неблокирующее)
end
end
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