Визуальная электроника

Задержка сигнала в ключах и вентилях

В реальных схемах, по физическим причинам, логические элементы имеют задержки.

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:
  1. module buf_gate ();
  2. reg in;
  3. wire out;
  4.  
  5. buf #(5) (out,in);
  6.  
  7. initial begin
  8. $monitor ("Time = %g in = %b out=%b", $time, in, out);
  9. in = 0;
  10. #10 in = 1;
  11. #10 in = 0;
  12. #10 $finish;
  13. end
  14.  
  15. endmodule
Code:
  1. <span style="color: black; font-size: small;"> Time = 0 in = 0 out=x
  2. Time = 5 in = 0 out=0
  3. Time = 10 in = 1 out=0
  4. Time = 15 in = 1 out=1
  5. Time = 20 in = 0 out=1
  6. Time = 25 in = 0 out=0</span>

Код Verilog. Две задержки.

Verilog Code:
  1. module buf_gate1 ();
  2. reg in;
  3. wire out;
  4.  
  5. buf #(2,3) (out,in);
  6.  
  7. initial begin
  8. $monitor ("Time = %g in = %b out=%b", $time, in, out);
  9. in = 0;
  10. #10 in = 1;
  11. #10 in = 0;
  12. #10 $finish;
  13. end
  14.  
  15. endmodule
Code:
  1. <span style="color: black; font-size: small;"> Time = 0 in = 0 out=x
  2. Time = 3 in = 0 out=0
  3. Time = 10 in = 1 out=0
  4. Time = 12 in = 1 out=1
  5. Time = 20 in = 0 out=1
  6. Time = 23 in = 0 out=0</span>

Код Verilog. Все типы задержек.

Verilog Code:
  1. module delay();
  2. reg in;
  3. wire rise_delay, fall_delay, all_delay;
  4.  
  5. initial begin
  6. $monitor (
  7. "Time=%g in=%b rise_delay=%b fall_delay=%b all_delay=%b",
  8. $time, in, rise_delay, fall_delay, all_delay);
  9. in = 0;
  10. #10 in = 1;
  11. #10 in = 0;
  12. #20 $finish;
  13. end
  14.  
  15. buf #(1,0)U_rise (rise_delay,in);
  16. buf #(0,1)U_fall (fall_delay,in);
  17. buf #1 U_all (all_delay,in);
  18.  
  19. endmodule
Code:
  1. <span style="color: black; font-size: small;"> Time = 0 in = 0 rise_delay = 0 fall_delay = x all_delay = x
  2. Time = 1 in = 0 rise_delay = 0 fall_delay = 0 all_delay = 0
  3. Time = 10 in = 1 rise_delay = 0 fall_delay = 1 all_delay = 0
  4. Time = 11 in = 1 rise_delay = 1 fall_delay = 1 all_delay = 1
  5. Time = 20 in = 0 rise_delay = 0 fall_delay = 1 all_delay = 1
  6. Time = 21 in = 0 rise_delay = 0 fall_delay = 0 all_delay = 0</span>

Код Verilog. Комплексный пример.

Verilog Code:
  1. module delay_example();
  2.  
  3. wire out1,out2,out3,out4,out5,out6;
  4. reg b,c;
  5.  
  6. // Задержка для всех переходов
  7. or #5 u_or (out1,b,c);
  8. // Задержка нарастания и спада
  9. and #(1,2) u_and (out2,b,c);
  10. // Задержка нарастания, спада и отключения
  11. nor #(1,2,3) u_nor (out3,b,c);
  12. // Одиночная задержка, мин., тип. и макс.
  13. nand #(1:2:3) u_nand (out4,b,c);
  14. // Двойная задержка, мин., тип. и макс.
  15. buf #(1:4:8,4:5:6) u_buf (out5,b);
  16. // Тройная задержка, мин., тип. и макс.
  17. notif1 #(1:2:3,4:5:6,7:8:9) u_notif1 (out6,b,c);
  18.  
  19. //Тестовый код
  20. initial begin
  21. $monitor (
  22. "Time=%g b=%b c=%b out1=%b out2=%b out3=%b out4=%b out5=%b out6=%b",
  23. $time, b, c , out1, out2, out3, out4, out5, out6);
  24. b = 0;
  25. c = 0;
  26. #10 b = 1;
  27. #10 c = 1;
  28. #10 b = 0;
  29. #10 $finish;
  30. end
  31.  
  32. endmodule
Code:
  1. <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
  2. Time = 1 b = 0 c=0 out1=x out2=x out3=1 out4=x out5=x out6=x
  3. Time = 2 b = 0 c=0 out1=x out2=0 out3=1 out4=1 out5=x out6=z
  4. Time = 5 b = 0 c=0 out1=0 out2=0 out3=1 out4=1 out5=0 out6=z
  5. Time = 8 b = 0 c=0 out1=0 out2=0 out3=1 out4=1 out5=0 out6=z
  6. Time = 10 b = 1 c=0 out1=0 out2=0 out3=1 out4=1 out5=0 out6=z
  7. Time = 12 b = 1 c=0 out1=0 out2=0 out3=0 out4=1 out5=0 out6=z
  8. Time = 14 b = 1 c=0 out1=0 out2=0 out3=0 out4=1 out5=1 out6=z
  9. Time = 15 b = 1 c=0 out1=1 out2=0 out3=0 out4=1 out5=1 out6=z
  10. Time = 20 b = 1 c=1 out1=1 out2=0 out3=0 out4=1 out5=1 out6=z
  11. Time = 21 b = 1 c=1 out1=1 out2=1 out3=0 out4=1 out5=1 out6=z
  12. Time = 22 b = 1 c=1 out1=1 out2=1 out3=0 out4=0 out5=1 out6=z
  13. Time = 25 b = 1 c=1 out1=1 out2=1 out3=0 out4=0 out5=1 out6=0
  14. Time = 30 b = 0 c=1 out1=1 out2=1 out3=0 out4=0 out5=1 out6=0
  15. Time = 32 b = 0 c=1 out1=1 out2=0 out3=0 out4=1 out5=1 out6=1
  16. Time = 35 b = 0 c=1 out1=1 out2=0 out3=0 out4=1 out5=0 out6=1</span>

Примитивы с N входами

Примитивы И, И-НЕ, ИЛИ, ИЛИ-НЕ, и исключающее ИЛИ-НЕ имеют один выход и любое число входов.

  • Единственный выход указывается первым.
  • Все остальные терминалы являются входами.

Код Verilog.

Verilog Code:
  1. module n_in_primitive();
  2.  
  3. wire out1,out2,out3;
  4. reg in1,in2,in3,in4;
  5.  
  6. // Двухвходовый вентиль И
  7. and u_and1 (out1, in1, in2);
  8. // Четырехвходовый вентиль И
  9. and u_and2 (out2, in1, in2, in3, in4);
  10. // Трехвходовый вентиль XNOR
  11. xnor u_xnor1 (out3, in1, in2, in3);
  12.  
  13. // Тестовый код
  14. initial begin
  15. $monitor (
  16. "in1 = %b in2 = %b in3 = %b in4 = %b out1 = %b out2 = %b out3 = %b",
  17. in1, in2, in3, in4, out1, out2, out3);
  18. in1 = 0;
  19. in2 = 0;
  20. in3 = 0;
  21. in4 = 0;
  22. #1 in1 = 1;
  23. #1 in2 = 1;
  24. #1 in3 = 1;
  25. #1 in4 = 1;
  26. #1 $finish;
  27. end
  28.  
  29. endmodule
Code:
  1. <span style="color: black; font-size: small;"> in1 = 0 in2 = 0 in3 = 0 in4 = 0 out1 = 0 out2 = 0 out3 = 1
  2. in1 = 1 in2 = 0 in3 = 0 in4 = 0 out1 = 0 out2 = 0 out3 = 0
  3. in1 = 1 in2 = 1 in3 = 0 in4 = 0 out1 = 1 out2 = 0 out3 = 1
  4. in1 = 1 in2 = 1 in3 = 1 in4 = 0 out1 = 1 out2 = 0 out3 = 0
  5. in1 = 1 in2 = 1 in3 = 1 in4 = 1 out1 = 1 out2 = 1 out3 = 0</span>

Примитивы с N выходами

Примитивы буферов и инверторов имеют любое число выходов и один вход.

  • Выходы перечисляются в первую очередь.
  • Последний терминал является входом.

Код Verilog.

Verilog Code:
  1. module n_out_primitive();
  2.  
  3. wire out,out_0,out_1,out_2,out_3,out_a,out_b,out_c;
  4. wire in;
  5.  
  6. // Одновходовый буфер
  7. buf u_buf0 (out,in);
  8. // Буфер с четырьмя выходами
  9. buf u_buf1 (out_0, out_1, out_2, out_3, in);
  10. // Инвертор с тремя выходами
  11. not u_not0 (out_a, out_b, out_c, in);
  12.  
  13. endmodule