Verilog中的三种简单触发器

时序逻辑中的三种简单触发器,使用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

 

  

 

 

posted @ 2020-03-31 18:15  素质教育漏网之鱼  阅读(3810)  评论(0编辑  收藏  举报