Verilog Assign: что делает этот оператор?

Содержание

Сводка

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

Assign: Что это такое и как работает?

Assign в Verilog — оператор, который используется для непосредственного непрерывного назначения значений портам, соединениям и регистрам. Этот оператор является одним из наиболее распространенных и удобных способов управления сигналами в цифровых схемах. Применяется в построении следующих элементов: дешифратор, мультиплексор, демультиплексор, сумматор и т.д.

С помощью оператора assign строятся все комбинированные схемы в Verilog. Непрерывное присвоение значений помогает обойтись без последовательной логики, но assign применяется и в ней.

Синтаксис

Простой синтаксис оператора assign позволяет установить соответствие между сигналами и переменными без необходимости создания поведенческих конструкций.
// в блоке module assign [ drive_strength0: drive_strength1 ] [ delay3 ] [ name_regs ] = [ value ]; // в поведенческом модуле assign [ name_regs ] = [ value ];

[drive_strength0] — аргумент указывает силу источника значения при логической нуле. Допустимые значения: supply0, strong0, pull0, weak0 и highz0. Описание значений:

  • supply0 — линия питания на 0
  • strong0 — сильное значение(по умолчанию)
  • pull0 — потягивание к земле через резистор
  • weak0 — слабое значение
  • highz0 — 3-е состояние

[drive_strength1] — аргумент указывает силу источника значения при логической единице. Допустимые значения: supply1, strong1, pull1, weak1 и highz1. Описание значений:

  • supply1 — активная линия питания
  • strong1 — сильное значение(по умолчанию)
  • pull1 — потягивание к источнику питания через резистор
  • weak1 — слабое значение лог. единицы
  • highz1 — 3-е состояние

[ delay3 ] — задержка назначения при изменение правого значения. Пример: assign #(4) out = in0 & in1. При каждом изменении значения на соединениях in0 и in1 происходит непрерывное назначение, которое совершает через 4 единицы времени, которая задает директива `timescale. Для понимая на низком уровне советуем прочитать про стеки Verilog.

[ name_regs ] — название соединения(в блока module) или регистра(в поведенческом блоке), которой будет применяться непрерывное назначение.

[ value ] — числовая константа или константное выражение.

Пример использования

Предположим, у нас есть цифровой модуль, в котором нужно присвоить некоторое значение выходному порту out_signal на основе дизъюнкции входных портов in0 и in1. Для этого мы можем использовать оператор assign следующим образом:
module simple_module( input wire in0, input wire in1, output reg out_signal ); // Пример использования оператора assign assign out_signal = in0 | in1; endmodule

В данном примере мы устанавливаем связь между входными сигналами in0, in1 и выходным портом out_signal с помощью оператора assign. При изменении значения in0 или in1 автоматически будет изменяться и значение out_signal.

Заключение

Итак, оператор assign является мощным инструментом в программировании на Verilog, который позволяет легко управлять сигналами в цифровых схемах. Правильное использование этого оператора способствует улучшению эффективности кода, упрощению проектирования и ускорению разработки цифровых устройств.