Задержка сигнала в ключах и вентилях
В реальных схемах, по физическим причинам, логические элементы имеют задержки.
Verilog предоставляет способ присвоить такой атрибут логическим элементам.
- Задержки нарастания, спада и отключения.
- Минимальные, типичные, и максимальные задержки
В Verilog задержки могут быть введены с помощью #'num', как в приведенных ниже примерах, где # - специальный символ для введения задержки, а 'num' - количество тактов, на которые симулятор должен задержать выполнение текущего оператора.
- #1 a = b : задержка на 1, т. е. выполнение после 1 такта.
- #2 not (a,b) : задержка на 2 такта всех присвоений, сделанных для сигнала a.
Реальные транзисторы имеют задержки разрешения между входом и выходом. Это моделируется в Verilog путем указания одной или нескольких задержек для времени подъема, падения, включения и выключения, разделенных запятыми.
Синтаксис: ключевое слово #(delay{s}) unique_name (спецификации узлов);
Переключающий элемент |
Количество задержек |
Указанные задержки |
ключ |
1 |
Время нарастания, спада и выключения одинаковой длины |
|
2 |
Время нарастания и спада |
|
3 |
Время нарастания, спада и выключения |
(r)tranif0, (r)tranif1 |
1 |
Сумарное время включения и выключения |
|
2 |
Время включения и выключения |
(r)tran |
0 |
Не применимо |
Задержка нарастания
Эта задержка связана с нарастанием выходного сигнала до 1 от другого значения (0,x,z).
Задержка спада
Эта задержка связана со спадом выходного сигнала к 0 от другого значения (1,x,z).
Задержка выключения
Задержка выключения связана с переходом выходного сигнала в высокоимпедансное состояние z из другого значения (0, 1, x).
Минимальное Значение
Минимальное значение- это минимальное значение задержки, которое, как ожидается, будет иметь выходной сигнал.
Типовое значение
Типовое значение- это типичное значение задержки, которое, как ожидается, будет иметь выходной сигнал.
Максимальное значение
Максимальное значение- это максимальное значение задержки, которое, как ожидается, будет иметь выходной сигнал.
Примеры
Ниже приведены некоторые примеры, показывающие использование задержек.
Код Verilog. Одиночная задержка.
Verilog Code:
module buf_gate (); reg in; wire out; buf #(5) (out,in); initial begin $monitor ("Time = %g in = %b out=%b", $time, in, out); in = 0; #10 in = 1; #10 in = 0; #10 $finish; end endmodule
Code:
<span style="color: black; font-size: small;"> Time = 0 in = 0 out=x Time = 5 in = 0 out=0 Time = 10 in = 1 out=0 Time = 15 in = 1 out=1 Time = 20 in = 0 out=1 Time = 25 in = 0 out=0</span>
Код Verilog. Две задержки.
Verilog Code:
module buf_gate1 (); reg in; wire out; buf #(2,3) (out,in); initial begin $monitor ("Time = %g in = %b out=%b", $time, in, out); in = 0; #10 in = 1; #10 in = 0; #10 $finish; end endmodule
Code:
<span style="color: black; font-size: small;"> Time = 0 in = 0 out=x Time = 3 in = 0 out=0 Time = 10 in = 1 out=0 Time = 12 in = 1 out=1 Time = 20 in = 0 out=1 Time = 23 in = 0 out=0</span>
Код Verilog. Все типы задержек.
Verilog Code:
module delay(); reg in; wire rise_delay, fall_delay, all_delay; initial begin $monitor ( "Time=%g in=%b rise_delay=%b fall_delay=%b all_delay=%b", $time, in, rise_delay, fall_delay, all_delay); in = 0; #10 in = 1; #10 in = 0; #20 $finish; end buf #(1,0)U_rise (rise_delay,in); buf #(0,1)U_fall (fall_delay,in); buf #1 U_all (all_delay,in); endmodule
Code:
<span style="color: black; font-size: small;"> Time = 0 in = 0 rise_delay = 0 fall_delay = x all_delay = x Time = 1 in = 0 rise_delay = 0 fall_delay = 0 all_delay = 0 Time = 10 in = 1 rise_delay = 0 fall_delay = 1 all_delay = 0 Time = 11 in = 1 rise_delay = 1 fall_delay = 1 all_delay = 1 Time = 20 in = 0 rise_delay = 0 fall_delay = 1 all_delay = 1 Time = 21 in = 0 rise_delay = 0 fall_delay = 0 all_delay = 0</span>
Код Verilog. Комплексный пример.
Verilog Code:
module delay_example(); wire out1,out2,out3,out4,out5,out6; reg b,c; // Задержка для всех переходов or #5 u_or (out1,b,c); // Задержка нарастания и спада and #(1,2) u_and (out2,b,c); // Задержка нарастания, спада и отключения nor #(1,2,3) u_nor (out3,b,c); // Одиночная задержка, мин., тип. и макс. nand #(1:2:3) u_nand (out4,b,c); // Двойная задержка, мин., тип. и макс. buf #(1:4:8,4:5:6) u_buf (out5,b); // Тройная задержка, мин., тип. и макс. notif1 #(1:2:3,4:5:6,7:8:9) u_notif1 (out6,b,c); //Тестовый код initial begin $monitor ( "Time=%g b=%b c=%b out1=%b out2=%b out3=%b out4=%b out5=%b out6=%b", $time, b, c , out1, out2, out3, out4, out5, out6); b = 0; c = 0; #10 b = 1; #10 c = 1; #10 b = 0; #10 $finish; end endmodule
Code:
<span style="color: black; font-size: small;"> Time = 0 b = 0 c=0 out1=x out2=x out3=x out4=x out5=x out6=x Time = 1 b = 0 c=0 out1=x out2=x out3=1 out4=x out5=x out6=x Time = 2 b = 0 c=0 out1=x out2=0 out3=1 out4=1 out5=x out6=z Time = 5 b = 0 c=0 out1=0 out2=0 out3=1 out4=1 out5=0 out6=z Time = 8 b = 0 c=0 out1=0 out2=0 out3=1 out4=1 out5=0 out6=z Time = 10 b = 1 c=0 out1=0 out2=0 out3=1 out4=1 out5=0 out6=z Time = 12 b = 1 c=0 out1=0 out2=0 out3=0 out4=1 out5=0 out6=z Time = 14 b = 1 c=0 out1=0 out2=0 out3=0 out4=1 out5=1 out6=z Time = 15 b = 1 c=0 out1=1 out2=0 out3=0 out4=1 out5=1 out6=z Time = 20 b = 1 c=1 out1=1 out2=0 out3=0 out4=1 out5=1 out6=z Time = 21 b = 1 c=1 out1=1 out2=1 out3=0 out4=1 out5=1 out6=z Time = 22 b = 1 c=1 out1=1 out2=1 out3=0 out4=0 out5=1 out6=z Time = 25 b = 1 c=1 out1=1 out2=1 out3=0 out4=0 out5=1 out6=0 Time = 30 b = 0 c=1 out1=1 out2=1 out3=0 out4=0 out5=1 out6=0 Time = 32 b = 0 c=1 out1=1 out2=0 out3=0 out4=1 out5=1 out6=1 Time = 35 b = 0 c=1 out1=1 out2=0 out3=0 out4=1 out5=0 out6=1</span>
Примитивы с N входами
Примитивы И, И-НЕ, ИЛИ, ИЛИ-НЕ, и исключающее ИЛИ-НЕ имеют один выход и любое число входов.
- Единственный выход указывается первым.
- Все остальные терминалы являются входами.
Код Verilog.
Verilog Code:
module n_in_primitive(); wire out1,out2,out3; reg in1,in2,in3,in4; // Двухвходовый вентиль И and u_and1 (out1, in1, in2); // Четырехвходовый вентиль И and u_and2 (out2, in1, in2, in3, in4); // Трехвходовый вентиль XNOR xnor u_xnor1 (out3, in1, in2, in3); // Тестовый код initial begin $monitor ( "in1 = %b in2 = %b in3 = %b in4 = %b out1 = %b out2 = %b out3 = %b", in1, in2, in3, in4, out1, out2, out3); in1 = 0; in2 = 0; in3 = 0; in4 = 0; #1 in1 = 1; #1 in2 = 1; #1 in3 = 1; #1 in4 = 1; #1 $finish; end endmodule
Code:
<span style="color: black; font-size: small;"> in1 = 0 in2 = 0 in3 = 0 in4 = 0 out1 = 0 out2 = 0 out3 = 1 in1 = 1 in2 = 0 in3 = 0 in4 = 0 out1 = 0 out2 = 0 out3 = 0 in1 = 1 in2 = 1 in3 = 0 in4 = 0 out1 = 1 out2 = 0 out3 = 1 in1 = 1 in2 = 1 in3 = 1 in4 = 0 out1 = 1 out2 = 0 out3 = 0 in1 = 1 in2 = 1 in3 = 1 in4 = 1 out1 = 1 out2 = 1 out3 = 0</span>
Примитивы с N выходами
Примитивы буферов и инверторов имеют любое число выходов и один вход.
- Выходы перечисляются в первую очередь.
- Последний терминал является входом.
Код Verilog.
Verilog Code:
module n_out_primitive(); wire out,out_0,out_1,out_2,out_3,out_a,out_b,out_c; wire in; // Одновходовый буфер buf u_buf0 (out,in); // Буфер с четырьмя выходами buf u_buf1 (out_0, out_1, out_2, out_3, in); // Инвертор с тремя выходами not u_not0 (out_a, out_b, out_c, in); endmodule