Неблокирующее присваивание
Часть раздела Основы путешествия по Verilog на Coddy — урок 50 из 90.
В предыдущем уроке мы рассмотрели блокирующее присваивание (=), которое выполняется последовательно. Теперь мы рассмотрим неблокирующее присваивание (<=), которое выполняется одновременно — параллельно.
Неблокирующее присваивание использует оператор <=. Оно называется «неблокирующим», потому что оно не блокирует выполнение следующего оператора. Все неблокирующие присваивания в блоке выполняются одновременно.
Синтаксис:
variable <= expression;Когда использовать неблокирующее присваивание
Неблокирующее присваивание (<=) используется для последовательностной логики — схем, которые используют тактовый сигнал и обладают памятью. Выходы изменяются только по фронту тактового сигнала (обычно по положительному фронту).
Примеры последовательностной логики:
- Триггеры
- Регистры
- Счетчики
- Конечные автоматы
- Сдвиговые регистры
Пример на Verilog:
initial begin
a <= 5; // Запланировано, но еще не выполнено
b <= a + 2; // Запланировано, используется СТАРОЕ значение a
c <= b * 3; // Запланировано, используется СТАРОЕ значение b
endВсе три присваивания происходят одновременно с использованием старых значений. В конце временного шага все обновления происходят вместе.
Неблокирующие присваивания в блоках Always (последовательная логика)
Неблокирующие присваивания используются для последовательной логики — схем, которые используют тактовый сигнал и имеют память (триггеры, регистры, счётчики).
always @(posedge clk) begin
q <= d; // q принимает значение d по фронту тактового сигнала
count <= count + 1; // count увеличивается по фронту тактового сигнала
endОба присваивания происходят одновременно, используя значения, которые были до фронта тактового сигнала.
Итог
| Правило | Объяснение |
|---|---|
Используйте <= для последовательной логики | always @(posedge clk) |
Используйте = для комбинационной логики | always @(*) |
| Неблокирующее присваивание выполняется параллельно | Все присваивания происходят одновременно |
| Значения обновляются в конце временного шага | Не сразу |
Задание
Завершите неблокирующее присваивание
Добавьте недостающие неблокирующие присваивания, чтобы этот 2-битный сдвиговый регистр заработал.
Как это работает:
- На каждом фронте тактового сигнала
q1получаетd q2получает старое значениеq1
Что нужно сделать:
- Присвойте
dпеременнойq1(неблокирующее присваивание) - Присвойте
q1переменнойq2(неблокирующее присваивание)
Шпаргалка
Неблокирующее присваивание (<=) выполняет все инструкции параллельно — используя старые значения и обновляя их в конце временного шага.
// Все используют СТАРЫЕ значения a и b
a <= 5;
b <= a + 2; // использует старое a
c <= b * 3; // использует старое bИспользуйте <= для последовательной логики (триггеры, регистры, счетчики) внутри тактируемых блоков always:
always @(posedge clk) begin
q <= d; // неблокирующее
count <= count + 1; // неблокирующее
end| Присваивание | Применение | Выполнение |
|---|---|---|
<= | Последовательная логика (posedge clk) | Параллельно |
= | Комбинационная логика (always @(*)) | Пошагово |
Попробуйте сами
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Введение
Что такое 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