触发器(基本的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
原文地址:https://www.cnblogs.com/wen2376/p/3268327.html