Непрерывное присваивание
Часть раздела Основы путешествия по Verilog на Coddy — урок 37 из 90.
В аппаратном обеспечении соединение — это физический провод, который связывает две точки в электрической цепи. Как только провод установлен, соединение становится постоянным и всегда активным. Если состояние на одном конце меняется, другой конец меняется немедленно.
В Verilog нам необходим способ моделирования такого поведения. Мы хотим подать значение на провод и оставить его подключенным постоянно. Этот процесс называется непрерывным назначением (continuous assignment).
Непрерывное присваивание использует ключевое слово assign для создания постоянного соединения между проводником (wire) и выражением. Проводник непрерывно принимает значение выражения — точно так же, как физический провод.
Думайте об этом как о пайке провода, а не как об однократной записи значения.
Синтаксис
assign wire_name = expression;| Часть | Значение |
|---|---|
assign | Ключевое слово, которое начинает непрерывное присваивание |
wire_name | Управляемый провод (не может быть reg) |
expression | Значение, которое управляет проводом |
Простой пример
wire out;
assign out = a & b;Это означает: out всегда равно a AND b. Всякий раз, когда a или b изменяется, out изменяется немедленно.
Как это работает
В отличие от reg, который хранит значение, wire с непрерывным назначением постоянно обновляется:
module continuous_demo;
reg a, b;
wire c;
assign c = a & b; // c всегда следует за a И b
initial begin
a = 0; b = 0;
#10 $display("a=%d, b=%d, c=%d", a, b, c); // c=0
a = 1;
#10 $display("a=%d, b=%d, c=%d", a, b, c); // c=0 (1&0=0)
b = 1;
#10 $display("a=%d, b=%d, c=%d", a, b, c); // c=1 (1&1=1)
$finish;
end
endmoduleРезультат:
a=0, b=0, c=0
a=1, b=0, c=0
a=1, b=1, c=1Каждый раз, когда a или b изменяется, c обновляется автоматически.
Множественные присваивания
В модуле может быть несколько непрерывных присваиваний:
module multiple_assign (
input a, b, c,
output x, y
);
assign x = a & b;
assign y = x | c; // y зависит от x
endmoduleВсе присваивания выполняются параллельно и непрерывно.
Типовое применение
Непрерывные назначения используются для:
- Простой комбинационной логики (AND, OR, XOR)
- Соединения проводников друг с другом
- Создания буферов с тремя состояниями
- Управления выходами на основе комбинационных выражений
Задание
Что нужно сделать:
- Добавьте недостающее непрерывное назначение, которое делает
zравнымx AND y.
Шпаргалка
Непрерывное присваивание создает постоянную связь между проводником (wire) и выражением с помощью ключевого слова assign:
assign wire_name = expression;Проводник постоянно отражает значение выражения — всякий раз, когда меняются входные данные, выход обновляется немедленно:
wire out;
assign out = a & b; // out всегда равен a И bНесколько присваиваний выполняются параллельно:
assign x = a & b;
assign y = x | c; // y зависит от x, все обновляются непрерывноОсновные правила: только wire (не reg) может управляться с помощью assign.
Попробуйте сами
module continuous_challenge (
input x,
input y,
output z
);
// TODO: Добавьте недостающее непрерывное назначение, которое делает z равным x И y
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