Menu
Coddy logo textTech

Непрерывное присваивание

Часть раздела Основы путешествия по Verilog на Coddy — урок 37 из 90.

В аппаратном обеспечении соединение — это физический провод, связывающий две точки в схеме. Как только провод установлен, соединение становится постоянным и всегда активным. Если один его конец изменяется, другой конец изменяется немедленно.

В Verilog нам нужен способ моделирования такого поведения. Мы хотим передавать значение на провод и держать его подключенным постоянно. Этот процесс называется continuous assignment.

Непрерывное присваивание (continuous assignment) использует ключевое слово assign для создания постоянного соединения между проводом (wire) и выражением. Провод непрерывно принимает значение выражения — прямо как физический провод.

Думайте об этом как о припаивании провода (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 с continuous assignment постоянно обновляется:

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 может быть несколько непрерывных присваиваний (continuous assignment):

module multiple_assign (
  input a, b, c,
  output x, y
);
  assign x = a & b;
  assign y = x | c;   // y зависит от x
endmodule

Все присваивания выполняются параллельно и непрерывно.

Распространенные способы использования

Непрерывные присваивания (continuous assignments) используются для:

  • Простой комбинационной логики (AND, OR, XOR)
  • Соединения проводников (wire) между собой
  • Создания буферов с тремя состояниями
  • Управления выходом на основе комбинационных выражений
challenge icon

Задание

Что нужно сделать:

  1. Добавьте пропущенное continuous assignment, которое делает z равным x AND y.

Попробуйте сами

module continuous_challenge (
  input x,
  input y,
  output z
);
  
  // TODO: Добавьте недостающее непрерывное присваивание, которое делает z равным x AND y
  

endmodule
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Основы