Continuous Assignment
Часть раздела Основы путешествия по Verilog на Coddy. Урок 37 из 90.
В аппаратной части соединение — это физический провод, который связывает две точки в цепи. После установки провода соединение является постоянным и всегда активно. Если один конец изменяется, другой конец изменяется немедленно.
В Verilog нам нужен способ моделировать такое поведение. Мы хотим передать значение на провод и навсегда оставить его подключённым. Процесс выполнения этого называется continuous assignment.
Непрерывное присваивание использует ключевое слово assign для создания постоянного соединения между проводом и выражением. Провод непрерывно принимает значение выражения, прямо как физический провод.
Представьте это как припаивание провода, а не как однократную запись значения.
Синтаксис
assign wire_name = expression;| Часть | Значение |
|---|---|
assign | Ключевое слово, которое начинает continuous assignment |
wire_name | Управляемый wire (не может быть reg) |
expression | Значение, которое управляет wire |
Простой пример
wire out;
assign out = a & b;Это означает: out always equal a AND b. Всякий раз, когда изменяется a или b, out изменяется немедленно.
Как это работает
В отличие от reg, который хранит значение, wire с непрерывным присваиванием постоянно обновляется:
module continuous_demo;
reg a, b;
wire c;
assign c = a & b; // c следует a AND 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Все assignment выполняются параллельно, continuously.
Распространённые применения
Непрерывные присваивания используются для:
- Простой комбинационной логики (AND, OR, XOR)
- Соединения проводов друг с другом
- Создания буферов с тремя состояниями
- Управления выходами с помощью комбинационных выражений
Задание
Что нужно сделать:
- Add missing continuous assignment, that makes
zequal кx AND y.
Попробуйте сами
module continuous_challenge (
input x,
input y,
output z
);
// TODO: Добавьте недостающее непрерывное присваивание, которое делает z равным x AND y
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