Язык Verilog позволяет разрабатывать модуль в нескольких стилях кодирования. В зависимости от потребностей проекта, внутреннее устройство каждого модуля может быть определено на четырех уровнях абстракции. Независимо от уровня внутренней абстракции модуль будет вести себя точно так же, как и внешняя среда. Ниже приведены четыре различных уровня абстракции, которые можно описать четырьмя различными стилями кодирования языка Verilog:

  1. Поведенческий или алгоритмический уровень
  2. Уровень потока данных
  3. Уровень ворот или структурный уровень
  4. Уровень переключения

Порядок абстракции, упомянутый выше, от высшего к низшему уровню абстракции. Тройку лучших можно объяснить с помощью мультиплексора 4:1.

Поведенческий или алгоритмический уровень

  • Это самый высокий уровень абстракции, предоставляемый Verilog HDL.
  • Модуль может быть реализован с точки зрения желаемого алгоритма проектирования, не заботясь о деталях аппаратной реализации.
  • Он определяет схему с точки зрения ее ожидаемого поведения.
  • Это наиболее близкое к естественному языку описание функциональности схемы, но и наиболее сложное для синтеза.

Поведенческая модель Mux 4:1

module Mux_4to1(

input [3:0] i,

input [1:0] s,

output reg o

);

always @(s or i)

begin

case (s)

2'b00 : o = i[0];

2'b01 : o = i[1];

2'b10 : o = i[2];

2'b11 : o = i[3];

default : o = 1'bx;

endcase

end

endmodule

Порт вывода объявлен как тип данных «reg». Комбинация блока «всегда» и процедурного оператора «случай» используется для реализации мультиплексора. Все входы добавляются как часть списка чувствительности. В качестве условия здесь используется сигнал выбора «s». На основе значения сигнала выбора «s» будет выбран любой из входных сигналов. Здесь мы реализуем функциональность мультиплексора на более высоком уровне абстракции, не вникая во внутренние детали проекта, как в «Структурном моделировании»

Результат симуляции модели 4:1 Mux Behavioral level:

Уровень потока данных

  • На этом уровне модуль разрабатывается путем указания потока данных.
  • Глядя на этот дизайн, можно понять, как данные передаются между аппаратными регистрами и как данные обрабатываются в проекте.
  • Этот стиль похож на логические уравнения. Спецификация состоит из выражений, составленных из входных сигналов и назначенных выходным сигналам.
  • В большинстве случаев такой подход можно довольно легко воплотить в структуру, а затем реализовать.

Мультиплексная модель потока данных 4:1

module Mux_4to1_df(

input [3:0] i,

input [1:0] s,

output o

);

assign o = (~s[1] & ~s[0] & i[0]) | (~s[1] & s[0] & i[1]) | (s[1] & ~s[0] & i[2]) | (s[1] & s[0] & i[3]);

endmodule

В этом подходе используется оператор «assign». Оператор Assign — это непрерывный оператор, в котором любые изменения сигналов в правой части будут обновлять выходной сигнал. Любые изменения во входных сигналах вызовут выполнение оператора assign, и обновленное значение будет отражено на выходе «o». Изменения во входных данных постоянно отслеживаются.

Результат моделирования модели уровня потока мультиплексированных данных 4:1:

Уровень ворот или структурный уровень

  • Модуль реализован в виде логических вентилей и взаимосвязей между этими вентилями.
  • Он напоминает схематический рисунок с компонентами, связанными с сигналами.
  • Изменение значения любого входного сигнала компонента активирует компонент. Если два или более компонентов активированы одновременно, они также будут выполнять свои действия одновременно.
  • Структурное представление системы ближе к физической реализации, чем поведенческое, но оно более сложное из-за большого количества деталей. Поскольку логический вентиль является наиболее популярным компонентом, Verilog имеет предопределенный набор логических вентилей, известных как примитивы. Любая цифровая схема может быть построена из этих примитивов.

Структурная модель Mux 4:1

module Mux_4to1_gate(

input [3:0] i,

input [1:0] s,

output o

);

wire NS0, NS1;

wire Y0, Y1, Y2, Y3;

not N1(NS0, s[0]);

not N2(NS1, s[1]);

and A1(Y0, i[0], NS1, NS0);

and A2(Y1, i[1], NS1, s[0]);

and A3(Y2, i[2], s[1], NS0);

and A4(Y3, i[3], s[1], s[0]);

or O1(o, Y0, Y1, Y2, Y3);

endmodule