Мегаобучалка Главная | О нас | Обратная связь


Конструкция always (Always Block )



2015-11-10 659 Обсуждений (0)
Конструкция always (Always Block ) 0.00 из 5.00 0 оценок




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

Блок alwaysозначает, что действие ыполняется непрерывно, пока процесс моделирования не будет остановлен директивойц $finish or $stop.

Note: the $finish command actually terminates the simulation where as $stop. merely pauses Ниже приведен пример формирования тактового импульса с использованием конструкции always .Заметим, что вообще говоря для этих целей удобнее использовать циклы

 

module pulse;

 

reg clock;

 

initial clock = 1'b0; // запуск такта

always #10 clock = ~clock; // такт

initial #5000 $finish // конец моделирования

 

endmodule

 

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

Рассмотрим пример проектирования двоичного счетчика считающего от 0 до 12 и по достижении 12 сбрасывающегося в 0 и начинающего счет заново.

Рассмотрим описание вентильном уровне

// 4-bit binary counter

 

module counter4_bit(q, d, increment, load_data, global_reset, clock);

output [3:0] q;

input [3:0] d;

input load_data, global_reset, clock, increment;

wire t1, t2, t3; // internal wires

wire see12, reset; // internal wires

 

et_ff etff0(q[0], d[0], increment, load_data, reset, clock);

et_ff etff1(q[1], d[1], t1, load_data, reset, clock);

et_ff etff2(q[2], d[2], t2, load_data, reset, clock);

et_ff etff3(q[3], d[3], t3, load_data, reset, clock);

 

and a1(t1, increment, q[0]);

and a2(t2, t1, q[1]);

and a3(t3, t2, q[2]);

 

recog12 r1(see12, q); // счет

or or1(reset, see12, global_reset); // сброс

 

endmodule // counter4_bit

 

module et_ff(q, data, toggle, load_data, reset, clock);

output q;

input data, toggle, load_data, reset, clock;

wire m1, m2;

 

mux mux0(m1, ~q, q, toggle);

mux mux1(m2, data, m1, load_data);

dff dff0(q, m2, reset, clock);

 

endmodule // et_ff

 

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

output out;

input in1, in2, cntrl;

 

assign out = cntrl ? in1 : in2;

 

endmodule // mux

 

module dff(q, data, reset, clock);

output q;

input data, reset, clock;

reg q;

 

always @(posedge clock) // at every clock edge, if reset is 1, q is

if (reset == 1)

q = 0;

else q = data;

 

endmodule

 

module recog12(flag, in);

input [3:0] in;

output flag;

 

assign flag = (in == 4'b1100) ? 1 : 0;

 

endmodule // recog12

 

module stumulus;

wire [3:0] q;

reg [3:0] d;

reg load_data, global_reset, clk, increment;

 

counter4_bit mod1 (q, d, increment, load_data, global_reset, clk);

 

initial begin

global_reset = 0;

clk = 0;

increment = 0;

load_data = 0;

d = 4'b0100;

 

#10 global_reset = 1;

#20 global_reset = 0;

#20 load_data = 1;

#20 load_data = 0;

#20 increment = 1;

#200 global_reset = 1;

#20 global_reset = 0;

#50 load_data = 1;

#20 load_data = 0;

#10 increment = 0;

#20 $finish;

end // initial begin

 

always #5 clk = ~clk;

 

always #10 $display ($time," %b %b %b %d -> %b %d",

increment, load_data, global_reset, d, q, q);

endmodule // stumulus

Начнем подробное рассмотрение этого примера.

module counter4_bit(q, d, increment, load_data, global_reset, clock);

output [3:0] q;

input [3:0] d;

input load_data, global_reset, clock, increment;

wire t1, t2, t3; // internal wires

wire see12, reset; // internal wires

 

Как нам уже известно, первые строки модуля содержат его имя и объявление портов. Выход счетчика q, все остальные входные сигналы. t1, t2, t3, see12 и reset объявлены как внутренние цери, подключенные к входам соответствующим субмодулям проекта.

 

et_ff etff0(q[0], d[0], increment, load_data, reset, clock);

et_ff etff1(q[1], d[1], t1, load_data, reset, clock);

et_ff etff2(q[2], d[2], t2, load_data, reset, clock);

et_ff etff3(q[3], d[3], t3, load_data, reset, clock);

 

В этом фрагменте кода мы определяем 4 счетных триггера с разрешением (Enable/Toggle flip flops)

 

and a1(t1, increment, q[0]);

and a2(t2, t1, q[1]);

and a3(t3, t2, q[2]);

Сигнал увеличения счетчика ,(increment signal) объединяется по И с выходом последнего триггера для переноса сигнала счета на следующий триггер

 

recog12 r1(see12, q);

or or1(reset, see12, global_reset);


Каждый раз когда выход q изменяется, переменная see12 модифицируется, когда она достигнет 12, внутренний сигнал сброса обеспечит сброс счетчика на очередном такте. Далее рассмотрим поведенческую модель нашего счетчика

 

3.4.30.1. Поведенческая модель (Behavioural Model )

Предшествующее описание счетчика было осуществленно на уровне вентилей и триггеров, т.е. на структурном уровне. С другой стороны, при наличии достаточно мощных средств синтеза, поведенческое описание позволяют получить более наглядное описание проекта. Ниже приводится пример поведенческого описания (behavioural description) счетчика

 

// 4-bit binary up-counter - of period 13

 

module counter4_bit(q, d, increment, load_data, global_reset, clock);

output [3:0] q;

input [3:0] d;

input load_data, global_reset, clock, increment;

 

reg [3:0] q;

 

always @(posedge clock)

if (global_reset)

q = 4'b0000;

else if (load_data)

q = d;

else if (increment) begin

if (q == 12)

q = 0;

else

q = q + 1;

end

 

endmodule // counter4_bit

 

В отличие от описания на регистровом уровне различие в первых строках только одно – выход q объявлен как регистр

 

Данная модель позволяет путем проведения небольших модификаций получить описание другого типа счетчика - счетчика в обратном направлении (down counter), Ниже приведен пример такого описания

 

// 4-bit binary down-counter - of period 13

module counter4_bit(q, d, decrement, load_data, global_reset, clock);

 

 

always @(posedge clock)

if (global_reset)

q = 12;

else if (load_data)

q = d;

else if (decrement)

begin

if (q == 0)

q = 12;

else

q = q - 1;

end

 

endmodule

Далее рассмотрим реверсивный счетчик (счетчик с переменным направлением счета, Up-Down counter ) с периодом 16.

 

// 4-bit binary up-down-counter - of period 16

module counter4_bit(q, d, updown, count, load_data, global_reset, clock);

 

 

always @(posedge clock)

if (reset)

q = 0;

else if (load_data)

q = d;

else if (count)

begin

if (updown)

q = q + 1;

else

q = q - 1;

end

 

endmodule

 



2015-11-10 659 Обсуждений (0)
Конструкция always (Always Block ) 0.00 из 5.00 0 оценок









Обсуждение в статье: Конструкция always (Always Block )

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Как построить свою речь (словесное оформление): При подготовке публичного выступления перед оратором возникает вопрос, как лучше словесно оформить свою...
Модели организации как закрытой, открытой, частично открытой системы: Закрытая система имеет жесткие фиксированные границы, ее действия относительно независимы...
Как выбрать специалиста по управлению гостиницей: Понятно, что управление гостиницей невозможно без специальных знаний. Соответственно, важна квалификация...



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (659)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.008 сек.)