触发器(基本的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