D-защелка
Триггер захватывает данные на своем входе по положительному или отрицательному фронту тактового сигнала. Важно отметить, что все, что происходит с данными после фронта тактового сигнала до следующего фронта тактового сигнала, не будет отражено в выводе. защелка с другой стороны, не захватывает край тактового сигнала, вместо этого выход следует за входом, пока активен вывод разрешения.
Дизайн
В этом примере мы создадим защелку с тремя входами и одним выходом. Ввод d обозначает данные, которые могут быть 0 или 1, rstn означает активный-низкий сброс и en означает включение, которое используется для привязки входных данных к выходным. Сброс, являющийся активным-низким, просто означает, что элемент дизайна будет сброшен, когда этот вход станет 0, или, другими словами, сброс активен, когда его значение низкое. Значение вывода q определяется входными данными d , ru и rstn .
module d_latch ( input d, // 1-bit input pin for data
input en, // 1-bit input pin for enabling the latch
input rstn, // 1-bit input pin for active-low reset
output reg q); // 1-bit output pin for data output
// This always block is "always" triggered whenever en/rstn/d changes
// If reset is asserted then output will be zero
// Else as long as enable is high, output q follows input d
always @ (en or rstn or d)
if (!rstn)
q <= 0;
else
if (en)
q <= d;
endmodule
Обратите внимание, что список чувствительности к always
Блок содержит все сигналы, необходимые для обновления вывода. Этот блок будет срабатывать всякий раз, когда любой из сигналов в списке чувствительности меняет свое значение. Также q получит значение d только тогда, когда en высокий и, следовательно, является положительным защелка.
Схема
Тестовый стенд
module tb_latch;
// Declare variables that can be used to drive values to the design
reg d;
reg en;
reg rstn;
reg [2:0] delay;
reg [1:0] delay2;
integer i;
// Instantiate design and connect design ports with TB signals
d_latch dl0 ( .d (d),
.en (en),
.rstn (rstn),
.q (q));
// This initial block forms the stimulus to test the design
initial begin
$monitor ("[%0t] en=%0b d=%0b q=%0b", $time, en, d, q);
// 1. Initialize testbench variables
d <= 0;
en <= 0;
rstn <= 0;
// 2. Release reset
#10 rstn <= 1;
// 3. Randomly change d and enable
for (i = 0; i < 5; i=i+1) begin
delay = $random;
delay2 = $random;
#(delay2) en <= ~en;
#(delay) d <= i;
end
end
endmodule
Чтобы наш тестовый стенд подтверждал и отменял сигналы более случайным образом, мы объявили reg
переменная с именем задержка размером 3 бита, так что он может принимать любое значение от 0 до 7. Тогда задержка переменная используется для задержки назначения d и ru чтобы получить разные узоры в каждом цикле.
Вывод
Журнал моделированияncsim> run [0] en=0 d=0 q=0 [11] en=1 d=0 q=0 [18] en=0 d=0 q=0 [19] en=0 d=1 q=0 [20] en=1 d=1 q=1 [25] en=1 d=0 q=0 [27] en=0 d=0 q=0 [32] en=0 d=1 q=0 [33] en=1 d=1 q=1 [34] en=1 d=0 q=0 ncsim: *W,RNQUIE: Simulation is complete.
Нажмите на изображение, чтобы увеличить его.
Verilog