2020年5月14日 星期四

Verilog Gate primitives

Gate primitives


There are two classes of gate primitives:

Single input gate primitives

not, buf gates


module buf_not_gates (input a, b, output c, d);
  buf (c, a, b);   // c is the output, a and b are inputs
  not (d, a, b);  // d is the output, a and b are inputs
endmodule

module buf_not_gates_tb;
  reg a, b;
  wire c, d;
  buf_not_gates Instance0 (a, b, c,d);
  initial begin
    a = 0; b = 0;
 #1 a = 0; b = 1; 
 #1 a = 1; b = 0;
 #1 a = 1; b = 1;
  end
  initial begin
    $monitor ("T=%t| a=%b |b=%b| c(buf)=%b |d(not)=%b", $time, a, b, c, d);
  end
endmodule

bufif/notif gates


module bufif_notif_gates (output c, d, input a, b);
  bufif (c, a, b);   // c is the output, a and b are inputs
  notif (d, a, b);  // d is the output, a and b are inputs
endmodule

module bufif_notif_gates_tb;
  reg a, b;
  wire c, d;
  bufif_notif_gates Instance0 (c, d, a, b);
  initial begin
    a = 0; b = 0;
 #1 a = 0; b = 1; 
 #1 a = 1; b = 0;
 #1 a = 1; b = 1;
  end
  initial begin
    $monitor ("T=%t| a=%b |b=%b| c(bufif)=%b |d(notif)=%b", $time, a, b, c, d);
  end
endmodule

Multiple input gate primitives

AND/OR/XOR gates

module and_or_xor_gates (output c, d, e, input a, b);
  and (c, a, b);   // c is the output, a and b are inputs
  or  (d, a, b);  // d is the output, a and b are inputs
  xor (e, a, b);   // e is the output, a and b are inputs
endmodule

module and_or_xor_gates_tb;
reg a, b;
wire c, d, e;
and_or_xor_gates Instance0 (c, d, e, a, b);
 initial begin
      a = 0; b = 0;
   #1 a = 0; b = 1; 
   #1 a = 1; b = 0;
   #1 a = 1; b = 1;
 end
 initial begin
   $monitor ("T=%t |a=%b |b=%b |c(and)=%b |d(or)=%b |e(xor)=%b", $time, a, b, c, d, e);
 end
endmodule

NAND/NOR/XNOR gates

module nand_nor_xnor_gates (output c, d, e, input a, b);
 nand (c, a, b); // c is the output, a and b are inputs 
 nor (d, a, b); // d is the output, a and b are inputs 
 xnor (e, a, b); // e is the output, a and b are inputs
endmodule 

module nand_nor_xnor_gates_tb;
reg a, b;
wire c, d, e;
nand_nor_xnor_gates Instance0 (c, d, e, a, b);
  initial begin
    a = 0; b = 0;
 #1 a = 0; b = 1; 
 #1 a = 1; b = 0;
 #1 a = 1; b = 1;
end
  initial begin
    $monitor ("T=%t |a=%b |b=%b |c(nand)=%b |d(nor)=%b |e(xnor)=%b", $time, a, b, c, d, e);
  end
endmodule
 more than two inputs.
module all_gates (output x1, y1, z1, x2, y2, z2 , input a, b, c, d);
  and (x1, a, b, c, d);   // x1 is the output, a, b, c, d are inputs
  or  (y1, a, b, c, d);  // y1 is the output, a, b, c, d are inputs
  xor (z1, a, b, c, d);   // z1 is the output, a, b, c, d are inputs
  nand (x2, a, b, c, d); // x2 is the output, a, b, c, d are inputs
  nor (y2, a, b, c, d); // y2 is the output, a, b, c, d are inputs 
  xnor (z2, a, b, c, d); // z2 is the output, a, b, c, d are inputs
endmodule

Gate Delays

Rise delay Fall delay Turn off delay

primitive_gate #(rise delay, fall delay, turn-off delay) gate_instatiation (outputs, inputs);

and #(2) and_gate_2 (out, in0, in1);       // all delay values are 2-time units
nand #(3,4,5) nand_gate_2 (out, in0, in1); // rise delay = 3, fall delay = 4, and turn-off delay = 5.
or #(3,4) or_gate_2 (out, in0, in1);       // rise delay = 3, fall delay = 4, and turn-off delay = min(3,4) = 3.
nand #(3:4:5,4:5:6,5:6:7) nand_gate_2 (out, in0, in1); // rise delay: min=3, typ=4, max=5, fall delay: min=4, typ=5, max=6, turn-off delay: min=5, typ=6, max=7.


沒有留言:

張貼留言

Messaging API作為替代方案

  LINE超好用功能要沒了!LINE Notify明年3月底終止服務,有什麼替代方案? LINE Notify將於2025年3月31日結束服務,官方建議改用Messaging API作為替代方案。 //CHANNEL_ACCESS_TOKEN = 'Messaging ...