我是靠谱客的博主 粗心月光,最近开发中收集的这篇文章主要介绍锁存器与触发器SR锁存器(与非门)电平触发器脉冲触发器边沿触发器,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

触发器

  • SR锁存器(与非门)
  • 电平触发器
    • 电平RS触发器
    • D触发器
  • 脉冲触发器
    • 脉冲RS触发器(主从式RS触发器)
    • 脉冲JK触发器
  • 边沿触发器
    • 边沿JK触发器
    • 边沿RS触发器 (这个触发器电路好像有问题,无法完成期望的目标......)
    • 边沿D触发器 (维持阻塞)
    • 边沿D触发器(两个电平D触发器构成)
    • T触发器

SR锁存器(与非门)

SR锁存器是静态存储单元中最简单、最基本的一种。通常由两个与非门或两个或非门组成。
在这里插入图片描述
分析该电路,当S为低(有效电平),R为高(无效电平)时,G1(上边的与非门)输出Q必为1,则G2门输出Qn必为~(1&1)=0,G2门输出连接到G1的输入,使G1门输出Q依然为1,此时撤掉S的输入信号(拉高为无效电平),由于Qn输出0,所以Q依然输出1。整个SR锁存器依然保持这Q=1、Qn=0的输出状态;

当R为低(有效电平),S为高(无效电平)时,Qn输出为1,Q输出为0,且足以保持稳定;

当S、R均为高(无效电平),假设初始时Q=1,Qn=0,此时G1门输入为S(1)以及Qn(0)输出Q依然为1,G2门输入R(1)Q(1)输出依然为0;假设初始时Q=0,Qn=1,此时G1门输入为S(1)以及Qn(1)输出Q依然为0,G2门输入R(1)Q(0)输出依然为1;综上,当SR=1时,SR锁存器表现出保持Q输出不变的状态,与(前提是Q=~Qn);

当S、R均为低电平(有效信号时),此时理论上来说Q、Qn均输出1,且可以保持稳定。但是当S、R同时撤掉有效信号(拉高)时,第一:假设G1、G2同时运算,这是Q、Qn输出的1作用在与非门上导致输出两个输出0,0又作用在与非门导致输出1,循环往复,类似于矩形波,这与上面说的S、R为高电平时锁存器表现出保持Q输出不变的状态相违背;第二:实际上这一状态无法保持稳定。当S、R同时升高为1时,由于实际工艺存在延迟及G1、G2门无法同时运算等多种不可抗力,当G1门率先运算时,此时S、R为1,Qn=1,故G1门输出Q为0,导致G2门输入变成1和0,Qn输出1,总输出Q=0,Qn=1;而当G2门率先运算时,此时S、R为1,Q=1,故G2门输出Q为0,导致G1门输入变成1和0,Q输出1,总输出Q=1,Qn=0;因此输出不具有稳定性。以上所说的不稳定性,仅限于S、R为有效信号的情况下同时撤去信号时,如果一个变无效、一个仍有效,或者两个信号均保持为低电平(有效)不变,SR锁存器仍具有稳定性。
通常,将Q=1,Qn=0称为电路的1状态,Q=0,Qn=1称为0状态。
在这里插入图片描述
门级实现电路:

module test(
	input	s_n,//置位端 低电平有效
	input	r_n,//复位端 低电平有效
	output	q,	//输出q
	output	qn	//输出~q
);

nand a1(q,s_n,qn);
nand a2(qn,r_n,q);

endmodule

在这里插入图片描述

testbench(主要进行了S_n|R_n=1的情况仿真、S_n=0、R_n=0应尽量避免):

`timescale 1 ns/ 1 ps
module test_vlg_tst();

reg r_n;
reg s_n;                                               
wire q;
wire qn;
                       
test i1 (  
	.q(q),
	.qn(qn),
	.r_n(r_n),
	.s_n(s_n)
);
initial                                                
begin  
		r_n = 1; s_n = 0;//初始置1
	#20 r_n = 1; s_n = 1;//q=1 保持
	#20	r_n = 1; s_n = 0;//q=1 置1
	#20 r_n = 0; s_n = 1;//q=1 置零
	#20 r_n = 1; s_n = 1;//q=0 保持
	#20	r_n = 0; s_n = 1;//q=0 置0
	#20 r_n = 1; s_n = 0;//q=0 置1	
	#20 $stop;
end  
                                                                                                     
endmodule

仿真结果:
在这里插入图片描述

电平触发器

电平RS触发器

在这里插入图片描述
在SR锁存器基础上引入CLK控制端,分析电路图:当CLK为1时,G3输出S’,G4输出R‘,此时与SR锁存器控制效果一致,仅仅是S、R为高电平有效的区别;当CLK为0时,不管S、R输入何值,G3、G4均输出1,此时参考SR锁存器真值表可得,处于保持状态,即无论S、R如何变化,Q都保持不变。
同样的为了防止SR锁存器处于不稳定状态,G3、G4应禁止同时输出低电平,即S、R应满足SR=0的条件,否则当S、R同时由高电平转为低电平或者S、R为高时,CLK由1变0,这两种情况下RS触发器输出结果将不可控。
真值表:
在这里插入图片描述
门级电路代码:

`timescale 1 ps/ 1 ps
module test(
	input	s,//置位端 高电平有效
	input	r,//复位端 高电平有效
	input	clk,
	
	output	q,
	output	qn
);
wire o1;
wire o2;

nand a1(o1,s,clk);
nand a2(o2,r,clk);
nand #(11) a3(q,o1,qn); //加上升、下降延时1ps
nand #(11) a4(qn,o2,q); //加上升、下降延时1ps

endmodule

电平RS触发器 a3门、a4门加入延时,延时输入上升时间1ps,延时输入下降时间1ps,这是为了防止在RTL仿真中引起逻辑混乱,见仿真。
在这里插入图片描述

testbench:

`timescale 1 ps/ 1 ps
module test_vlg_tst();

reg r;
reg s; 
reg clk;                                              
wire q;
wire qn;
                       
test i1 (  
	.q(q),
	.qn(qn),
	.clk(clk),
	.r(r),
	.s(s)
);
initial
begin
	r = 0; s = 1;//初始置1
	clk =0;  
end

always                                               
begin  
	#20 r = 0; s = 0;//q=1 保持
	#20	r = 0; s = 1;//q=1 置1
	#20 r = 1; s = 0;//q=1 置零
	#20 r = 0; s = 0;//q=0 保持
	#20	r = 1; s = 0;//q=0 置0
	#20 r = 0; s = 1;//q=0 置1	
end  

always begin
	#10 clk = ~clk; 
end
endmodule


不加入延时的仿真结果:
在这里插入图片描述
加入延时的仿真结果:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210508130032853.
不加延时的仿真结果:黄线处CLK=0,理论上Q应该保持不变,但是由于RTL仿真不考虑门级延时以及电平变化时间等,导致CLK下降沿R、Qn的值也处于上升、下降沿,引起逻辑功能混乱(我猜应该是这个原因QvQ)。
加入延时后的仿真:可以看到黄线前,CLK=0时,Q保持1不变。在clk下降沿o1正处于上升沿,由于o1延时1ps输入进a3门,当输入时clk已经处于0稳定状态逻辑功能得以实现;另一方面Q也比Qn延时1ps,因为a3门的输入不只包括o1还有Qn。

总结:,以第二个图黄线前为例,当CLk下降沿,此时o1正处于上升沿,o2=1,加入上升延时后o1虽然仍为上升沿,但是输入给a3门的o1数据为0,所以a3门输出Q为1,1ps后clk=0,而a3门的输入为上升沿,因为此时clk=0,所以a3门输入仍Q为1;当CLk上升沿,o2下降沿,由于加入了下降延时1ps,所以a4门输入o2仍为1,o1也为1,Q保持不变,1ps后clk=1,o2虽然是下降沿不过后续会稳定在0,因此Qn上升为1,又由于a3门的输入上升延时1ps,因此a3门输出Q=0的时间比Qn=1的时间延迟1ps,较clk上升沿延时2ps。

这里只使用了a3门输入上升时间延时1ps及a4门输入下降时间延时1ps,如果要证明a3门输入下降时间延时1ps及a4门输入上升时间延时1ps对电路的影响只需将testbench的clk初始值改为1

观察波形可以看出,引入延时时间是为了让o1、o2在clk下降沿时处于稳定状态,使Q、Qn在clk下降沿时保持稳定,这样在clk稳定为0后,RS触发器才能保持住我们期望的Q、Qn,即高电平改变Q值,低电平保持Q值方便我们获取。这为主从RS触发器等提供了思路。
(上面的加入延时思路有点像是建立保持时间,不过我的时序分析也学的不是很好,如果有错欢迎指正)

带异步置位、复位的同步RS触发器:将Sd‘置0(有效信号)Rd‘置1,此时Q输出1,Qn输出0;将Sd‘置1,Rd‘置0(有效信号),此时Q输出0,Qn输出1,与基础SR锁存器一致。上述置位、复位不受CLK及输入端S、R的影响,不受时钟CLK控制称为异步置位、复位。
在这里插入图片描述

D触发器

在这里插入图片描述
将SR触发器的S、R端通过非门共用一个D端,其余与RS触发器一致。CLK为1,Q=D;CLK=0,Q保持不变。

电平触发方式的缺点
(1)只有当CLK变为有效电平时,触发器才能接受输入信号,并按照输入信号将触发器的输出置成相应的状态。

(2)在CLK=1的全部时间里,S和R状态的变化都可能引起输出状态的改变。在CLK回到0以后,触发器保存的是CLK回到0以前瞬间的状态。根据上述的动作特点可以想象到,如果在CLK=1期间S、R的状态多次发生变化,那么触发器输出的状态也将发生多次翻转,这就降低了触发器的抗干扰能力。

脉冲触发器

脉冲RS触发器(主从式RS触发器)

在这里插入图片描述
在这里插入图片描述
如图FF1为主RS触发器,FF2为从RS触发器,两者的时钟信号相反。

分析电路:当CLK置1时,此时主触发器工作,从触发器CLK为0为保持Q输出不变的状态。主触发器工作状态下参考电平RS触发器的真值表进行输出Q1,当CLK置0时,主触发器为保持状态,从触发器工作,将CLK由1跳变为0时的主触发器最后的输出Q1传递给Q2(Q)

同样为了保证RS触发器正常工作,R、S不能同时置1,这就意味着Q1与Q1’必相反,不会同时出现为1的情况(只会在R、S同时置1时出现,此时电路不稳定),所以CLK为高时,从触发器的输出保持不变,而CLK为低时,从触发器起传递作用,将主触发器的结果传递给Q,即Q=Q1。由于FF2的CLK是FF1的CLK取反得到,因此可以预见Q2(Q)的输出延迟Q1半个时钟周期。

顶层代码,clkrs模块为电平RS触发器代码:

module test(
	input	s,//置位端 高电平有效
	input	r,//复位端 高电平有效
	input	clk,
	
	output	q,
	output	qn
);

wire q1;
wire q1n;

clkrs ff1(
	.s(s),//置位端 高电平有效
	.r(r),//复位端 高电平有效
	.clk(clk),
	
	.q(q1),
	.qn(q1n)
);

clkrs ff2(
	.s(q1),//置位端 高电平有效
	.r(q1n),//复位端 高电平有效
	.clk(~clk),
	
	.q(q),
	.qn(qn)
);

endmodule

testbench:

`timescale 1 ps/ 1 ps
module test_vlg_tst();

reg r;
reg s; 
reg clk;                                              
wire q;
wire qn;
                       
test i1 (  
	.q(q),
	.qn(qn),
	.clk(clk),
	.r(r),
	.s(s)
);
initial
begin
	r = 0; s = 1;//初始置1
	clk =1;  
end

always                                               
begin  
	#15 r = 0; s = 0;// 保持
	#15	r = 1; s = 0;// 置0
	#15 r = 0; s = 0;// 保持
	#15 r = 0; s = 1;// 置1
	#30	r = 1; s = 0;// 置0
	#30 r = 0; s = 1;// 置1    	第一个时钟
	
	#60	r = 1; s = 0;// 置0
	#60 r = 0; s = 1;// 置1		第二个时钟
	
	#60 r = 0; s = 0;//	保持
	#80	r = 1; s = 0;//	干扰信号 	第三个时钟
	#5  r = 0; s = 0;//	保持
	#95;			//			第四个时钟
end  

always begin
	#60 clk = ~clk; 
end
endmodule

仿真结果(Q1为主触发器输出,Q为从触发器即总输出):
在这里插入图片描述
仿真结果表明:clk为高时,主RS触发器根据输入信号R、S进行输出,当clk为低,主触发器保持高时钟下最后的输出Q1不变,此时从触发器工作,将主触发器的输出传递给Q,因此Q较Q1延迟半个时钟周期;clk回高时,从触发器不工作为保持Q输出不变,此时主触发器的Q1即使改变也无法传递给从触发器,从触发器只接受clk下降沿前主触发器输出的值,这样就解决了RS电平触发器中,输出Q随R、S多次变换也多次变化的问题,即脉冲RS触发器一个时钟周期内输出至多变化一次。

(仿真图中Q1、Q得上升、下降并不完全跟随CLK得上升沿、下降沿变化而变化,会有1或2ps的延迟,是由于RS触发器模块的上升下降延时导致,可以将这一部分延时看作电平上升下降所需要的时间,也就是仿真的波形变化是理想的90°变化,这1、2ps的延迟可以看作真实电平变化需要的时间)

脉冲RS触发器缺点
仿真图中黄线部分,当CLK为高R如果有一个脉冲噪声信号,导致主触发器结果置0,从而导致脉冲RS触发器输出错误。也就是说虽然最终的输出Q在一个时钟周期内至多变化一次,但是主触发器的输出Q1会随着R、S的多次变化而变化,因为主、从RS触发器的本质还是两个电平RS触发器相互作用。如果在CLK为高时,R、S有脉冲噪声的干扰,就会给最终的输出带来影响。

同样的因为本质是电平触发器且无反馈,需要设定约束条件RS = 0。

tips
在图形符号中用框内的 “7” 表示”延迟输出”,即CLK回到低电平(有效电平消失)以后,输出状态才改变。
在这里插入图片描述

脉冲JK触发器

脉冲JK触发器克服脉冲RS触发器中R、S不能同时为高(有效电平)的缺点,相比较脉冲RS触发器,JK触发器将输出端Q接入输入R端,命名为K;将输出端Qn接入输入S端,命名为J。具体电路实现:

分析电路CLK=1,J=1,K=0时,由于K=0,所以G2门输出必为1,此时G1门输出=(J·CLK·Qn)’=Qn’=Q,而FF2输出的Q、Qn则是由上个时钟周期FF1输出的Q1、Q1n通过FF2传递的结果,也就是说进行Q1输出次态判断时,Q1与Q还是相等的,所以G1输出的Q1=(Q与非Qn)= 1,Q1与非G2门输出得Q1n次态为0,即Q置一,Qn置0。

CLK=1,J=0,K=1时,与上面一样,G1门输出必为1,G2门输出=(K·CLK·Q)’=Qn,Q1n= Qn与非Q1(Q) = 1,Q1=0。即Q置0,Qn置1。

J=0,K=0时,G1、G2门都输出1,整个触发器进入输出保持状态。

J=1,K=1时,当Q输出1,Qn=0时。此时G1门被封锁输出1,G2门输出(K·CLK·Q)’=Q’=Qn,此时与J=0,K=1时一样,最终Q输出0,Qn输出1;当Q输出0,Qn=1时。此时G2门被封锁输出1,G1门输出(K·CLK·Qn)’=Qn’=Q,此时与J=1,K=0时一样,最终Q置1,Qn置0。可以看出J=1,K=1的情况下,Q是进行了取反操作。

代码:

`timescale 1 ps/ 1 ps
module test(
	input	s,//置位端 高电平有效
	input	r,//复位端 高电平有效
	input	clk,
	input	rst_n,//异步复位  低电平有效
	
	output	q,
	output	qn
);
wire o1;
wire o2;
wire o3;
wire o4;
wire q1;
wire q1n;
wire q_tmp;
wire q_tmp_n;

assign	q = (!rst_n)?1'b1:q_tmp;	//异步复位,设定q初始值为1
assign	qn= (!rst_n)?1'b1:q_tmp_n;	//异步复位,设定qn初始值为1

nand a1(o1,s,clk,qn);
nand a2(o2,r,clk,q);
nand #(1,1)a3(q1,o1,q1n);//输入上升延迟1ps,下降延迟1ps
nand #(1,1)a4(q1n,o2,q1);//输入上升延迟1ps,下降延迟1ps

nand a5(o3,q1,~clk);
nand a6(o4,q1n,~clk);
nand #(1,1)a7(q_tmp,o3,q_tmp_n);//输入上升延迟1ps,下降延迟1ps
nand #(1,1)a8(q_tmp_n,o4,q_tmp);//输入上升延迟1ps,下降延迟1ps

endmodule

脉冲JK触发器由于在输出端J、K引入了输出Q、Qn反馈,因此Q、Qn的初始值会对整个电路的运行产生很大影响。假设Q、Qn初始值为0,那么J、K、CLK的值均不起作用,整个触发器完全处于输出保持状态,与电路设计不符。J=1,K=0或J=0、K=1也会引起电路异常,通过设置JK初始值为1,可以让初始状态时电路正常工作并持续保持正常工作。

脉冲RS触发器由于不存在Q、Qn的反馈因此即使初始状态为x(不定)也不影响电路的正常工作。
testbench代码:

`timescale 1 ps/ 1 ps
module test_vlg_tst();
reg r;
reg s; 
reg clk;                                              
wire q;
wire qn;
reg rst_n;
                      
test i1 (  
	.q(q),
	.qn(qn),
	.clk(clk),
	.rst_n(rst_n),
	.r(r),
	.s(s)
);
initial
begin
	r = 0; s = 1;//初始置1
	clk =1;  
	rst_n = 0;
end

always                                               
begin  
	#70 rst_n = 1;
	#65 r = 0; s = 0;// 保持
	#15	r = 1; s = 0;// 置0
	#15 r = 0; s = 0;// 保持
	#15 r = 0; s = 1;// 置1
	#30	r = 1; s = 0;// 置0
	#30 r = 0; s = 1;// 置1    	第一个时钟
	
	#60	r = 1; s = 0;// 置0
	#60 r = 0; s = 1;// 置1		第二个时钟
	
	#60 r = 0; s = 0;//	保持
	#80	r = 1; s = 0;//	干扰信号 	第三个时钟
	#5  r = 0; s = 0;//	保持
	#95;			//			第四个时钟
	
	r = 1; s =1;  #240;	// 	翻转  第五六个时钟
end  
always begin
	#60 clk = ~clk; 
end
endmodule

仿真结果:
在这里插入图片描述
分析仿真:
如果不设定Q、Qn的初始值为1,那么仿真结果Q、Qn的值均为x无法确定。结果前半部分与电平RS触发器一致,后半部分增加了J、K=1部分,Q值在CLK高电平期间翻转达到电路设计目的。
(忘记改JK了,S对应J,r对应K)

脉冲JK触发器缺点
虽然JK触发器较RS触发器已经克服了两个输入端共同有效时会引起电路逻辑功能混乱的问题,但其与RS触发器一样,在黄线处存在噪声干扰,会导致输出结果异常。高电平期间J、K的值多次变化也会影响最终的输出。

脉冲触发器动作特点及缺点
(1)触发器的翻转分两步动作。第一步,当CLK以高电平为有效信号时,在 CLK=1期间主发器接收输入端(S,R或JK)的信号,被置成相应的状态,而从触发器不动;第二步,CLK下降沿到来时从触发器按照主触发器的状态翻转,所以Q.Q’端状态的改变发生在CLK的下降沿。(若CLK以低电平为有效信号,则Q和Q’状态的变化发生在 CLK的上升沿。)
(2)因为主触发器本身是一个电平触发SR触发器,所以在CLK=1的全部时间里输入信号都将对主触发器起控制作用。

由于存在这样两个动作特点,在CLK= 1期间输入信号发生过变化以后,CLK下降沿到达时从触发器的状态不一定能按此刻输入信号的状态来确定,而必须考虑整个CLK=1期间里输入信号的变化过程才能确定触发器的次态。

边沿触发器

边沿JK触发器

边沿JK触发器是利用门电路传输延迟时间的边沿触发器,常用于TTL集成电路中。Q*=JQ’+K’Q
在这里插入图片描述
这个电路包含一个由门电路G1~G6组成的SR锁存器和两个输人控制门G7和G8。而且门G7、G8的传输延迟时间大于SR锁存器的翻转时间。

设定初始状态Q=0、Qn=1。
当CLK为0时:CLK等于0,G7、G8门输出1,但是由于G7、G8的传输延迟大,因此1还未到达G3、G5门,此时Qn作用于G3、G2门,G2门输出0,而G3门输出M,当G7输出1到达G3,则G3输出1,所以G1输出0;同样Q作用于G5、G6使其都输出0,G4输出1。同样如果设定初始状态Q=1、Qn=0,最终也是保持不变。

当CLK变为1时:CLK从0变1的瞬间,M、N由于G7、G8的输入传输延时,仍然为CLK=0时的值,M=N=1,此时CLK=0传输进G2、G6门,G2输出Qn=1,G5、G6输出Q=0,此时不管J、K如何变化,G2=1经或非门G1必输出Q=0,G4输出~(0|0)=1,Q、Qn均保持不变

当CLK变为0时:CLK从1变0的瞬间,M、N由于G7、G8的输入传输延时,仍然为CLK=1时的值,假如J=1,K=0,则M依然输出Q,N依然输出1。CLK=0已经传入G2门,G2输出0,G3=(Q&Qn)=0,故G1输出Q=1。G6输出0,Q=1传入G5输出1,G4输出0,故Q=1,Qn=0;假如J=0,K=1,高电平时M=1,N=Qn,下降沿后M依然=1,N=Qn,CLK=0进入G6,G6输出0,G5输出(Q&Qn)=0,G4输出Qn=1,Qn=1传入G2、G3门,G2输出0,G3输出1,G1输出Q=0,故Q=0,Qn=1;假如J=0,K=0,高电平M=N=1,下降沿后,G2=0,G3=Qn,G1=Q,G6=0,G5=Q,G4=Qn,故Q=Q,Qn=Qn,保持不变;假如J=1,K=1,高电平时M=Q,N=Qn,如果Q=0,Qn=1,则G2输出0,G3输出0,G1输出Q=1,G1输出传入G5、G6,导致G4输出Qn=0;如果Q=1,Qn=0,则G5输出0,G6输出0,G4输出Qn=1,G4输出传入G2、G3,导致G1输出Qn=0;故取反。

代码:

`timescale 1 ps/ 1 ps
module test(
	input	s,//置位端 高电平有效
	input	r,//复位端 高电平有效
	input	clk,
	input	rst_n,
	
	output	q,
	output	qn
);
wire o5;
wire o6;
wire o3;
wire o2;
wire o7;
wire o8;

wire q_tmp;
wire q_tmp_n;

assign	q = (!rst_n)?1'b0:q_tmp;
assign	qn= (!rst_n)?1'b1:q_tmp_n;

nand #(1,1)	G7(o7,s,clk,qn);
nand #(1,1)	G8(o8,r,clk,q);	//G7、G8输入延时

and	 		G3(o3,q_tmp_n,o7);
and 		G2(o2,clk,q_tmp_n);
nor  		G1(q_tmp,o2,o3);

and	 		G5(o5,q_tmp,o8);
and 		G6(o6,clk,q_tmp);
nor			G4(q_tmp_n,o5,o6);

endmodule

testbench:

`timescale 1 ps/ 1 ps
module test_vlg_tst();

reg r;
reg s; 
reg clk;                                              
wire q;
wire qn;
reg rst_n;
                      
test i1 (  
	.q(q),
	.qn(qn),
	.clk(clk),
	.rst_n(rst_n),
	.r(r),
	.s(s)
);
initial
begin
	r = 0; s = 1;//初始置1
	clk =1;  
	rst_n = 0;
	#5000 $stop;
end

always                                               
begin  
	#75  rst_n = 1;
	#45  r = 1; s = 0;// 下降沿置0
	#80  r = 0; s = 1;// 低电平置1 无效
	#40  r = 0; s = 0;// 一个时钟周期内保持
	#120 r = 0; s = 1;// 下降沿置1
	#80	 r = 1; s = 0;// 低电平置0 无效
	#40  r = 0; s = 0;// 一个时钟周期内保持   	 
	
	#140 r = 0; s = 1;// 干扰信号 
	#10	 r = 0; s = 0;// 保持
	#90  r = 1; s =1;  
	#240;	// 	翻转  
end  

always begin
	#60 clk = ~clk; 
end
endmodule

仿真结果
在这里插入图片描述
仿真结果:Q只在时钟信号的下降沿随J、K的改变而变化,且在黄线处,CLK=1中存在噪声脉冲不会对输出Q的值产生影响。

边沿RS触发器 (这个触发器电路好像有问题,无法完成期望的目标…)

在这里插入图片描述
整个电路是在电平RS触发器的基础上改造而来,这里就简单说一下吧因为仿真出来发现这个电路是有bug的,第五版的数字与电子基础书里还有,第六版就被删掉了,不知道是不是真的有问题。
Q* = S+RQ’ (SR=0)

G3、G4、G1、G2门构成电平RS触发器,G5、G3门构成SR锁存器,相对应的,G4、G6门也构成SR锁存器,两个锁存器存在的目的是为了维持CLK=1期间,S、R如果发生改变不会影响到G3、G4的输出。当clk=0的情况下,G3、G4均输出1,经过CLK的上升沿,CLK变为1,假如此时Sn变为0,G5=~(0&1)=1,G3= ~(1&1&1)=0,这样就把Sn=0存在了G3输出端,而G4依然输出1,此时Q输出1,同样的G4、G6也是起维持作用,将Rn=0保持进G4输出,此时Q输出0。因此给1、2俩根线命名为置1维持线于置0维持线。

但是假如在CLK=1,Sn=0、Rn=1期间Rn存在电平扰动,有一个Rn=0的短脉冲,那么同样的G4门会把Rn=0保存,此时G3、G4均输出0,G1、G2的SR锁存器输出Q=Qn=1,当CLK变为0时,G3、G4又同时由0变为1,SR锁存器输出结果将不稳定不可知。因此引入了3、4两根线,这样在在CLK=1,Sn=0、Rn=1期间即使Rn=0,由于之前G3输出的0已经传入G4,因此G4将持续输出1,也就是G3、G4固定相反。3线阻止了G4输出0,因此称为置0阻塞线,同样的3线阻止了G3门输出0,因此称为置1阻塞线。

=BUT这个电路有一个很严重的bug,就是置0维持线与置1维持线存在的目的是为了保证CLK=1期间,G3、G4不随着Sn、Rn的改变而变化,但是1、2这两根线是靠G3、G4有一个已经输出0时,来维持其继续为0的,这就意味着如果G3、G4同时输出1态,1、2将失去作用,见仿真
代码:

`timescale 1 ps/ 1 ps
module test(
	input	s_n,//置位端 低电平有效
	input	r_n,//复位端 低电平有效
	input	clk,
	
	output	q,
	output	qn
);

wire o3;
wire o4;
wire o5;
wire o6;

nand G5 (o5,s_n,o3);
nand G3 (o3,o5,o4,clk);
nand G4 (o4,o6,o3,clk);
nand G6 (o6,r_n,o4);
nand #(1,1)G1 (q,o3,qn);
nand #(1,1)G2 (qn,o4,q);

endmodule

testbench:

`timescale 1 ps/ 1 ps
module test_vlg_tst();

reg r;
reg s; 
reg clk;                                              
wire q;
wire qn;
                      
test i1 (  
	.s_n(s),//置位端 低电平有效
	.r_n(r),//复位端 低电平有效
	.clk(clk),
	
	.q(q),
	.qn(qn)
);
initial
begin
	clk=0;
	r=0;	s=1;//初始置0
	#5000	$stop;
end

always                                               
begin  
	#80  r = 1; s = 0;//	低电平准备置1
	#120 r = 1; s = 1;//	保持
	#120 r = 0; s = 1;//	置0
	#120 r = 0; s = 0;//	高时钟 噪声
	#10  r = 0; s = 1;
	#30;
end  

always begin
	#60 clk = ~clk; 
end
endmodule

仿真结果:
在这里插入图片描述
整个仿真结果来看前面基础置1置0都实现了,后面高时钟电平时,Sn的噪声脉冲也能克服,但是在黄线处整个触发器失去边沿触发功能变为RS电平触发器,分析原因就如前面所说,当Rn=1,Sn=1的情况下,clk先是低电平,此时o3、o4均被置1,然后经过时钟上升沿到达高时钟电平期间,将Sn或Rn置0的话,由于先前o3、o4输出1,分析电路可以得出1、2置位维持线均失效,o3、o4会随着Sn、Rn的置0而置0,从而影响Q、Qn的输出,边沿触发效果失效。不过对于后面的D触发器是个很好的引子。

这个电路设计考虑了Sn、Rn均为0的情况,但是均为1时却无法正常工作了,看了书和网上的资料也没有查到有相关说明的,也可能是博主自己仿真错了吧,不过目前我还没找到我的错误,如果有人知道请评论指正一下。

边沿D触发器 (维持阻塞)

维持阻塞D触发器在边沿RS触发器的基础上更新得来。Q*=D
在这里插入图片描述
分析电路:
当clk为0时:显然G3、G4输出1,Q保持不变。
当clk由0到1时D=1时,G3、G4在clk=0输出1传入G6、G5门,D=1,故o6=0,G4、G5门被锁定,o4=o5=1,此时clk=1,o3=0,Q=1,Qn=0。即使d在clk=1期间发生改变,因为o3=0反馈给G5,G5只能输出1,o3保持0不变,1号线称为置1维持线,而G6们虽然输出会改变并传入G4,但由于3号线的存在,o3=0传入G4,o4只能等于1,组织了o4=0的出现,3号线称为置0阻塞线D=0时,o6=1,G3、G4在clk=0输出1传入G6、G5门,G5输出0,从而G3输出1,o3=1传入G4,G4输出0,因此Q=0,Qn=1。CLK=1期间,即使D发生了改变,由于o4=0反馈给G6,不管D为多少,o6都等于1,2号线称为置0维持线和置1阻塞线

代码:

`timescale 1 ps/ 1 ps
module test(
	input	d,
	input	clk,
	
	output	q,
	output	qn
);

wire o3;
wire o4;
wire o5;
wire o6;

nand G5 (o5,o6,o3);
nand G3 (o3,o5,clk);
nand G4 (o4,o6,o3,clk);
nand G6 (o6,d,o4);
nand #(1,1)G1 (q,o3,qn);
nand #(1,1)G2 (qn,o4,q);

endmodule

testbench:

`timescale 1 ps/ 1 ps
module test_vlg_tst();

reg d;
reg clk;                                              
wire q;
wire qn;
                      
test i1 (  
	.d(d),//
	.clk(clk),
	
	.q(q),
	.qn(qn)
);
initial
begin
	clk=0;
	d=0;//初始置0
	#5000	$stop;
end

always                                               
begin  
	d=0;
	#80  d=1;//	低电平准备置1
	#120 d=0;//	噪声
	#10	 d=1;
	#30;
end  

always begin
	#60 clk = ~clk; 
end
endmodule

仿真结果:
在这里插入图片描述

边沿D触发器(两个电平D触发器构成)

在这里插入图片描述
如图FF1、FF2为电平D触发器,clk为低时,clk1为高,Q1随D的改变而改变,此时,FF2为保持Q不变的输出状态;当clk由0跳变到1,clk1为低,Q1保持跳变前的D不变,FF2的clk为高,把Q1的值输出到Q。
仿真结果:
在这里插入图片描述
q1是FF1的输出,可以看到在clk低电平时,q1随d的改变而变化,因为ff1本质还是电平触发器,但是由于D触发器单端输入,即使clk=0有噪声输入,但也不影响最终q输出。
其实就是脉冲RS触发器,将RS触发器改成了D触发器,由于D触发器单端输入且Q*=D的传输特性,不会对最终结果q造成影响

在这里插入图片描述
如图为CMOS集成电路中边沿D触发器的原理图,也是两个电平D触发器结合的思路,只不过电平D触发器不是用锁存器构成而是使用了CMOS传输门,但总体思路不变。
边沿D触发器最常用的代码:

always @(posedge clk) //这就是上升沿D触发器
	Q <= d;

T触发器

T触发器就是把JK触发器的JK连接在一起,T触发器,T=1,Q取反,T=0时,Q维持不变,Q * = TQ’+T’Q
把T置1,Q*=Q’,又因为是边沿触发器,可以用来做时钟分频。
在这里插入图片描述

边沿触发器的优点
通过对上述三种边沿触发器工作过程的分析可以看出,它们具有共同的动作特点,这就是触发器的次态仅取决于时钟信号的上升沿(也称为正边沿)或下降沿(也称为负边沿)到达时输入的逻辑状态,而在这以前或以后,输人信号的变化对触发器输出的状态没有影响。这一特点有效地提高了触发器的抗干扰能力,因而也提高了电路的工作可靠性。

最后

以上就是粗心月光为你收集整理的锁存器与触发器SR锁存器(与非门)电平触发器脉冲触发器边沿触发器的全部内容,希望文章能够帮你解决锁存器与触发器SR锁存器(与非门)电平触发器脉冲触发器边沿触发器所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(54)

评论列表共有 0 条评论

立即
投稿
返回
顶部