時序邏輯中的三種簡單觸發器,使用Verilog語言編寫,用來熟悉語法最好不過了。
D觸發器
module D_LOCK(D,CLK,Q,NQ); //正邊沿D觸發 output Q; output NQ; input D; input CLK; //時序賦值 reg Q; assign NQ=~Q; //上升沿觸發 always @(posedge CLK) begin Q<=D; end endmodule //a simple testbench module d_lock_tb(); reg d,clk; wire q,nq; D_LOCK tb( .D(d), .CLK(clk), .Q(q), .NQ(nq) ); initial begin clk=0; end always #10 clk=~clk; //內部時鍾周期20ns initial begin #20 d=0; #20 d=1; #20 d=1'bx; #20 $finish; end endmodule
RS觸發器
module RS_LOCK(R,S,CLK,Q,NQ); //邊沿觸發的RS觸發器 output Q; output NQ; input CLK; input R; input S; reg Q; //上升沿觸發 assign NQ=~Q; always@(posedge CLK) case({R,S}) 2'b01: Q<=1; 2'b10: Q<=0; 2'b11: Q<=1'bx; default: endcase endmodule //testbench module rs_lock_tb(); reg clk,r,s; wire q,nq; RS_LOCK uut( .R(r), .S(s), .CLK(clk), .Q(q), .NQ(nq) ); initial begin clk=0; end always #10 clk=~clk; //內部時鍾 initial begin r=0;s=0; #10 r=0;s=1; #20 r=1;s=0; #20 r=1;s=1; #20 $finish; end endmodule
JK觸發器
module JK_LOCK(J,K,CLK,Q,NQ); //邊沿觸發的JK觸發器 output Q; output NQ; input CLK; input J; input K; reg Q; //上升沿觸發 assign NQ=~Q; always@(posedge CLK) case({J,K}) 2'b00: Q<=Q; 2'b01: Q<=0; 2'b10: Q<=1; 2'b11: Q<=~Q; default:Q<=Q; endcase endmodule module jk_lock_tb(); reg clk,j,k; wire q,nq; JK_LOCK uut( .J(j), .K(k), .CLK(clk), .Q(q), .NQ(nq) ); initial begin clk=0; end always #10 clk=~clk; //內部時鍾 initial begin #20 j=0;k=0; #20 j=0;k=1; #20 j=1;k=0; #20 j=1;k=1; #20 $finish; end endmodule
T觸發器
module T_LOCK(T,CLK,Q,NQ); //正邊沿T觸發 output Q; output NQ; input T; input CLK; //時序賦值 reg Q; assign NQ=~Q; //上升沿觸發 always @(posedge CLK) begin Q<=~T; end endmodule module t_lock_tb(); reg t,clk; wire q,nq; T_LOCK tb( .T(t), .CLK(clk), .Q(q), .NQ(nq) ); initial begin clk=0; end always #10 clk=~clk; //內部時鍾周期20ns initial begin #20 t=0; #20 t=1; #20 t=1'bx; #20 $finish; end endmodule