觸發器(基本的SR觸發器、同步觸發器、D觸發器)


一、能夠存儲1位二值信號的基本單元電路統稱為觸發器(Filp-Flop)

  觸發器是構成時序邏輯電路的基本邏輯部件。它有兩個穩定狀態:“0”和“1”。在不同的輸入情況下,它可以被置0狀態或1狀態,當輸入信號消失后,所置成的狀態能夠保持不變。所以觸發器可以記憶1位二值的信號。根據邏輯功能的不同,觸發器可以分為SR觸發器、D觸發器、JK觸發器、T和T'觸發器。按照結構形式的不同,又可分基本SR觸發器、同步觸發器、主從觸發器和邊沿觸發器。

  

 

其狀態圖:

a、當觸發器處在0狀態,即Q = 0,若S'R' = 10或11時,觸發器仍為0狀態。若S'R' = 01,觸發器翻轉成為1狀態。

b、當觸發器處在1狀態,即Q = 1,若S'R' = 01或11時,觸發器仍為1狀態。若S'R' = 10,觸發器翻轉成為0狀態。

約束條件是S’R’不能同時為0。

代碼實現:

module RS(rst_n,r,s,q,qn);
input rst_n;
input r;
input s;
output q;
output qn;

reg q;
reg i;
always @(rst_n or q)
if(!rst_n)
    i = 0;
else if(!q)
    i = 0;
else
    i = 1;
    
always @(rst_n or r or s)
if(!rst_n)
    q = 0;
else
    case(i)
    0://置0
    if(({r,s} == 2'b01) || ({r,s} == 2'b11))
        q = 0;
    else if(({r,s} == 2'b10))
        q = 1;
    
    1://置1
    if(({r,s} == 2'b10) || ({r,s} == 2'b11))
        q = 1;
    else if(({r,s} == 2'b01))
        q = 0;
    endcase
    
assign qn = ~q;

endmodule
View Code

仿真代碼:

`timescale 1ns/1ns
module RS_top;
reg rst_n;
reg r;
reg s;
wire q;
wire qn;

initial begin
    rst_n = 0;
    #10;
    rst_n = 1;
    repeat(5) 
    begin
        r = 0;
        s = 1;
        #20;
    
        r = 1;
        s = 1;
        #20;
    
        r = 1;
        s = 0;
        #20;
        
        r = 1;
        s = 1;
        #20;

    end
end
RS rs1(
        .rst_n(rst_n),
        .r(r),
        .s(s),
        .q(q),
        .qn(qn)
        );
        
endmodule
View Code

仿真波形:

可以看到仿真結果是對的。

二、電平觸發SR觸發器,即同步SR觸發器。在基本的SR與非門電路上在加了一個與非門電路。

                   

代碼實現:

module RS(rst_n,clk_en,r,s,q,qn);
input clk_en;
input rst_n;
input r;
input s;
output q;
output qn;

reg i;
reg q;
reg qn;

always @(rst_n or q)
if(!rst_n)
    i = 0;
else if(!q)
    i = 0;
else
    i = 1;
    
always @(rst_n or r or s or clk_en)
if(!rst_n) begin
    q = 0;
    qn = 1;
end
else if(clk_en)//為1時,RS輸入信號有效
    case(i)
    0://置0
    if(({r,s} == 2'b10) || ({r,s} == 2'b11))
    begin
        q = 0;
        qn = 1;
    end
    else if(({r,s} == 2'b01))
    begin
        q = 1;
        qn = 0;
    end
    
    1://置1
    if(({r,s} == 2'b01) || ({r,s} == 2'b11))
    begin
        q = 1;
        qn = 0;
    end
    else if(({r,s} == 2'b10))
    begin
        q = 0;
        qn = 1;
    end
    endcase
endmodule
View Code

仿真代碼:

`timescale 1ns/1ns
module RS_top;
reg rst_n;
reg clk_en;
reg r;
reg s;
wire q;
wire qn;

initial begin
    rst_n = 0;
    #10;
    rst_n = 1;
    repeat(500) 
    begin
        r = 0;
        s = 1;
        #20;
        
        r = 1;
        s = 1;
        #20;
        
        r = 1;
        s = 0;
        #20;
        
        r = 1;
        s = 1;
        #20;

    end
end
initial begin
    clk_en = 0;
    #50;
    clk_en = 1;
    #500;
    clk_en = 0;
    #100;
    clk_en = 1;
    #500;
    clk_en = 0;
end

RS rs1(
        .rst_n(rst_n),
        .clk_en(clk_en),
        .r(r),
        .s(s),
        .q(q),
        .qn(qn)
        );
        
endmodule
View Code

仿真波形:在clk_en低電平時,Q處於保持狀態,只有在clk_en為高時,RS輸入信號才有效。

三、同步D觸發器,是在同步SR觸發器上演變過來的,D一端接到S,經過非門接到R:

             

代碼實現比較簡單:

if(!d) begin
   q = 1'b0;
   qn = 1'b1;
end
else begin
   q = 1'b1;
   qn = 1'b0;
end

 


免責聲明!

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



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