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

 

  

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM