Menu
Coddy logo textTech

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

Часть раздела Основы путешествия по 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)
  • Соединения проводников друг с другом
  • Создания буферов с тремя состояниями
  • Управления выходами на основе комбинационных выражений
challenge icon

Задание

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

  1. Добавьте недостающее непрерывное назначение, которое делает 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
quiz iconПроверьте себя

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

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