Модули проекта (Design Blocks Modules)

Расммотрим правила построения иерархического проекта. В качестве примера мы будем рассматривать триггер с разрешением (E-type flip flop). В Verilog возможны два подхода для его реализации

Сверху вниз (Topdown)- начать с описания Е-триггера и далее добавлять детали преокта

Снизу вверх (Bottom up)– начать с базовых блоков, а затем объединить их в единый проект

Мы воспользуемся технологией снизу вверх, хртя наверное, наиболее удобно использование обоих подходов.

Начнем с описания D- триггера как модуля. Ключевые слова для задания модуля

module <module_name> ... endmodule, as below.

Ниже приведено его описание

module dff(q, data, clock);

output q;

input data, clock;

reg q;

always @(posedge clock)

q = data;

endmodule // dff

Аналогично поведенческое описание мультплексора с инверсией (inverting multiplexor) имеет вид

module mux2_1(out, in1, in2, cntrl);

output out;

input in1, in2, cntrl;

assign out = cntrl ? ~in1 : ~in2;

endmodule // mux2_1

Тогда описание модуля верхнего уровня для Е-триггера, состоящего из D- триггера и мультиплексора принмиает вид

module e_ff(q, data, enable, reset, clock);

output q;

input data, enable, reset, clock;

wire norout, muxout;

mux2_1 mod1 (muxout, data, q, enable);

nor (norout, reset, muxout);

dff dff0 (q, norout, clock);

endmodule

Обратим еще раз внимаение на обращение к модулю, определяемому пользователем – через имя экземпляра модуля

name_of_module instance_name (port_list);

Ниже приведен текст модуля для тестирования нашего триггера. Как и в примере с мультиплексором, он не имеет списка портов, поскольку является самым верхним в иерархии

module e_ffStimulus;

reg data, enable, reset, clock;

wire q;

e_ff mod1 (q, data, enable, reset, clock);

initial begin

clock = 1'b0;

forever clock = #5 ~clock;

end

initial begin

enable = 1'b0; // переменная разрешения

reset = 1'b1; // активный уровень сброса - 1

#20 reset = 1'b0; // сьрос.

data = 1'b1; установка в HIGH

#10 enable = 1'b1; // and then enable data latching

#10 data = 1'b1; // изменение данных

#20 data = 1'b0; // изменение данных

#30 data = 1'b1; // изменение данных

#10 data = 1'b0; // изменение данных

#10 data = 1'b1; // изменение данных

#20 enable = 1'b0; // запрет защелкивания

#10 data = 1'b0; // изменение данных

#10 reset = 1'b1; // сьрос снова

#20 $finish; // все

end // такт остановлен

initial begin

$display($time, " reset, enable, data, q ");

$display($time, " %d %d %d %d",

reset, enable, data, q);

forever #10 $display($time, " %d %d %d %d",

reset, enable, data, q);

end

endmodule // e_ffStimulus

Порты (Ports)

Порты обеспечивают связь модуля с другими модулями проекта.Ниже приведен порты для нашего примера

module d_ff(q, d, reset, clock);

module e_ff(q, d, enable, reset, clock);

module Stimulus;

Каждый порт может быть объявлен как вход (input),выход (output) или двунаправлекнный (inout). Все объявленные порты по умолчанию назначаются цепи (wire), для изменения типа сигнала необходимо выполнить назначение отдельно. Например

module d_ff(q, d, reset, clock);

output q; // обязательное объявление портов

input d, reset, clock; // как входы и выходы

reg q; // снова объявляем как регистр

Не забываем, что выходы модуля идут первыми в списке портов.

Правила соединения (Connection Rules )

Выше мы рассматривали два типа модулей - внешние и внутренние (outer and inner ), в нашем примере внешним модулем был Е-триггер, внутренним – триггер типа D. Ниже рассмотрим основные правила соелдинения модулей

Входы (Inputs )

Входы внутреннего модуля всегда должны имет тип цепь, поскольку они управляются внешними сигналами. Входы внешнего модуля могуьт иметь тип как цепь, так и регистр

Выходы (Outputs )

Во внутреннем модуле выходы могут иметь тип как цепь, так и регистр, в то время как выходы внешнего модуля дожны быть типа цепь, поскольку управляются внутренними модулями

Двунаправленые выводы (Inouts )

Двунаправленный порт всегда имеет тип цепь.

Соответствие портов (Port Matching)

Очевидно, обращаясь к модулю, необходимо, чтобы совпадала разрядность портов.

Присоединение портов (Connecting Ports )

Присоединение портов осуществляется либо по порядку (ordered list) или по имени порта (or by name). Например

module d_ff( q, d, reset, clock);

...

endmodule

module e_ff(q, d , enable, reset, clock);

output q;

input d, enable, reset, clock;

wire inD;

...

d_ff dff0(q, inD, reset, clock);

...

endmodule

3.4.27. Базовые блоки (Basic Blocks )

В Verilog приняты два типа назначений – непрерывное и процедурное. Непрерывное назначение может быть выполнено для цепей netsили для их объединений (concatenation of nets).Операнды могут иметь произвольный тип данных.

Процедурное назначение может быть выполнено для данных типов reg, integer, real или time.

Инициализация (Initial Block )

Ключевые слова: initial

Блок инициализации состоит из группы операторов, заключенных в операторные скобки begin... end и которые будут выполняться с момента старта моделирования. Ниже приведен пример инициализации моделирования

initial

clock = 1'b0;

initial

begin

alpha = 0;

#10 alpha = 1; // генерация сигнала

#20 alpha = 0;

#5 alpha = 1;

#7 alpha = 0;

#10 alpha = 1;

#20 alpha = 0;

end;

Наши рекомендации