触发器
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 #(1,1) a3(q,o1,qn); //加上升、下降延时1ps
nand #(1,1) 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 =