時序邏輯中的三種簡單觸發器,使用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
