锁存器、触发器、寄存器之间的关系
Q1:寄存器跟锁存器、触发器有什么关系?
Q2:寄存器是由锁存器或触发器构成的吗?
Q3:锁存器能不能做寄存器?
长期以来这些问题困扰着我,今天就给弄个清楚明白。
- 时序逻辑电路由组合逻辑电路和存储电路结合构成,实现存储功能有两种逻辑单元电路:锁存器和触发器。
- 首先是双稳态电路,将两个非门G1和G2接成交叉耦合形式,便构成了最基本的双稳态电路。
a.当Q为0时,经非门G2反相,Q`=1。Q`反馈到G1输入端,又保证了Q=0。两个非门首尾相接的逻辑锁定使得电路能自行保持在Q=0,Q`=1的状态,形成第一种稳定状态。反之,Q=1,Q`=0则形成第二种稳定状态。电路进入其中任意一种逻辑状态都能长期保持下去,并可通过Q端检查出来,因此它具有存储一位二进制数据的功能。
b.但是在接通电源后,它可能随机进入0或1状态,没有控制机制,也无法在运行中控制它的状态,从而不能作为存储电路使用。但该电路是各种锁存器、触发器等存储单元的基础。

- 锁存器是一种对脉冲电平敏感的双稳态电路,它具有0和1两个状态马,一旦状态被确定,就能自行保持,直到有外部特定输入脉冲电平作用在电路一定位置时,才有可能改变这一状态,因此该电路可以用于置入和存储1位二进制数据。
- 将上述的双稳态电路中的非门换成或非门,就构成了基本SR锁存器,它具有简单的控制功能。

- 当S=R=0时,Q = (R + Q`)` = (0 + Q`)`=Q;Q` = (S + Q)` = (0 + Q)` = Q`;显然,S、R两个信号对输出Q和Q`不起作用,电路状态保持不变,因此可以存储两位二进制数据。
- 当S=0、R=1时,已知S=0不会影响G2的输出状态;当R = 1时,Q = (R + Q`)` = (1 + Q`)`= 0;该信号再反馈到G2输入端,可得到Q` = (0 + 0)` = 1;可以发现,S = 0、R = 1将会使锁存器置0,将R端称为复位(或置0)输入端。
- 当S=1、R=0时,电路是对称的,首先使Q` = (S + Q)` = (1 + Q)` = 0;然后Q = (R + Q`)` = (0 + 0)`= 1;此时锁存器置1,S端称为置位(置1)输入端,当S=1信号消失时,即恢复到S=R=0的状态,此时同样可使锁存器的1状态得以保持。
- 当S=R=1时,无论Q和Q`原来是什么状态,S=R=1将强制Q = (R + Q`)` = (0 + Q`)`=0, Q` = (S + Q)` = (1 + Q)` = 0;即此时锁存器处于非0非1的不定状态,当S和R恢复到0时,锁存器中就不知道锁存的究竟是0还是1了,所以要求锁存信号应保持SR=0的约束条件,即不允许S=R=1。
- 基本SR锁存器的数据保持、置0和置1功能是一个可实际应用的存储单元最基本的逻辑电路,其波形如下:

- 基本SR锁存器的动态特性:之前的讨论仅考虑了电路的逻辑关系,没有涉及门电路输出信号对输入信号的时间延迟,而两个或非门在工作时都存在一定的传输延迟,当输入信号S或R变为高电平后,输出信号Q或Q`需要经过一定延时才会产生变化。这种延时会影响到被其驱动的后续电路的动作,可能造成错误的逻辑输出或出现工作不稳定的情况,为了保证锁存器状态可靠转换,对输入信号也有一定的时间要求。
- 定时图是表达时序电路动态特性的工具之一,它表达了电路动作过程中输出对输入信号响应的延迟时间,以及对各输入信号的时间要求。

- 传输延迟时间tpLH和tpHL:当置1信号S上升为高电平时,需要一定的传输延迟时间tpLH之后,Q端才转换为高电平。同样当置0信号R作用于电路,Q端电平也经过一定传输延迟时间tpLH才变化为0.Q`端的变化相对于输入信号S或R的变化也存在一定的传输延迟。由于信号通过的路径不同,tpLH和tpHL一般不同。
- 脉冲宽度tw:锁存器要正常工作必须保证S和R的高电平脉冲宽度不小于某一最小值tw,当其满足要求时电路能可靠地实现翻转。但如果加在S或R端的脉冲宽度过窄,在Q端电压尚未越过逻辑阈值电平时,S端的高电平就被撤除,电路可能又回到原来的状态,或者使Q的最终状态不能确定。
- 与非门构成的基本S`R`锁存器:将或非门替换为与非门,此时输入信号S`和R`以逻辑0为有效作用信号
①当S` = R` = 1时,Q = (S` · Q`)` = (1 · Q`)`=Q;Q` = (R` · Q)` = (1 · Q)` = Q`,此时电路具有保持功能;
③当S` = 1,R` = 0时,Q` = (R` · Q)` = (0 · Q)` = 1;Q = (S` · Q`)` = (1 · 1)`=0;,此时电路置0,R` = 0称为复位(或置0)输入端;
③当S` = 0,R` = 1时,Q = (S` · Q`)` = (0 · Q`)`=1;Q` = (R` · Q)` = (1 · 0)` = 0,此时电路置1,S` = 0称为置位(置1)输入端;
④当S` = R` = 0时,和或非门组成的SR锁存器一样,锁存器会进入不确定状态,这是不被允许的,即S`+R` = 1 = (SR)`作为约束条件。

- 基本SR锁存器可以应用在数字系统中某些特定标志的设置:当某种预设逻辑条件具备时,电路可以通过S端将基本SR锁存器置1,标志预设事件已经发生;而当另一种相悖的预设逻辑条件满足时,则可通过R端将其置0。比如按键消抖(去抖动电路),用硬件的方式消除电平抖动:
a.初始时,开关S的动触点与B点接通,R`被GND拉低为0,S`接到电压高电平为1,此时R`=0,S`=1,此时锁存器的输出Q为0。
b.当开关S拨向A时,动触点脱离B点瞬间产生的抖动并不影响锁存器的状态。S`=1, R`=0/1(来回抖动), 当S`=R`=1时,Q保持为0;当S`=1,R`=0时,Q仍然为0。
c.当开关离开B点,悬空的过程,此时S`=R`=1,保持Q=0;当开关动触点刚接触A点时,R`=1,S`=0,锁存器Q的输出为1;然后开关动触点在A点发生抖动,使S`在1和0之间跳变。
R` = 1, S`=1时,锁存器的输出Q保持为1;R` =1,S`=0时,锁存器的输出Q置1,仍然是1.
而由于电路具有对称性,所以开关由A拨向B时情况是一样的,由此可见基于SR锁存器电路可以完美的解决机械开关抖动带来的误计数。
- 门控SR锁存器:基本SR锁存器的输出状态是由输入信号S或R直接控制的,门控SR锁存器是在基本SR锁存器的输入端增加了一对逻辑门G3、G4,用使能信号E控制锁存器在某一指定时刻根据S、R输入信号确定输出状态。可以通过控制E端电平实现多个锁存器同步的数据锁存。

a.当E=0时,Q3=Q4=0,S、R端的逻辑状态不会影响到锁存器的状态。
b.当E=1时,S、R端的信号被传送到基本SR锁存器的输入端,从而可以确定Q和Q`的状态。S=R=1时Q是不定状态,不被允许。其余Q的输出情况由S·E 和R·E确定。
- CMOS集成电路中的门控SR锁存器(暂略)
- D锁存器:与SR锁存器不同的时,D锁存器在工作中不存在非定义状态,因而使用更加广泛。目前CMOS集成电路主要采用传输门控D锁存器和逻辑门控D锁存器两种电路结构。
1.传输门控D锁存器:在基本双稳态电路中插入两个传输门TG1和TG2形成。

D锁存器有两个输入端:使能端E和数据端D。当
①E=1时,C`=0,C=1,TG1导通,TG2断开,输入数据D经过G1、G2,使得Q`=D`,Q=D,此时Q端跟随输入信号D的变化。
②E=0时,C`=1,C=0,TG2导通,TG1断开,此时的电路和基本双稳态电路相同。由于G1、G2输入端存在的分布电容对逻辑电平有短暂的保持作用,在两个传输门状态转换瞬间并不影响电路的输出状态,电路将被锁定在E信号由1变0前瞬间D信号所确定的状态。在E=0的条件下可保持锁存器状态不变,使1位二进制数据得以存储。

由于该锁存器在E=1时Q端可跟随D端的逻辑状态变化,故又称透明锁存器。
- 逻辑门控D锁存器:在门控SR锁存器的S和R输入端之间连接一个非门G5,从而保证了SR=0的约束条件,消除了可能出现的非定义状态。


a.当E=0时,Q3=Q4=0,D(S、R)端的逻辑状态不会影响到锁存器的状态,锁存器保持前一状态。
b.当E=1,D=0时,R=D`=1,Q4=1·1=1,Q=(1+Q`)`=0=D; S=D=0,Q3=1·0=0; Q`= (Q3+Q)`=(0+0)`=1=D`;
c.当E=1,D=1时,S=D=1,Q3=1·1=1; Q`= (1+Q)`=0=D`; R=D`=0,Q4=1·0=0,Q=(0+Q`)`=1=D;
可以发现逻辑门控D锁存器的逻辑功能和传输门控D锁存器完全相同,而且保证了SR=0的约束条件。
- 典型的D锁存器集成电路:
a.中规模集成CMOS 8 D锁存器器74HC/HCT373

核心为8个传输门控D锁存器共用同一对互补的传输门控制信号C和C`,这对信号又由锁存使能信号LE驱动,当LE为高时,允许D锁存器的输出跟随相应输入信号的变化,LE为低时状态保持不变。
8个D锁存器的输出端都带有三态门,当输出三态门使能信号OE`为低电平时,三态门有效,输出锁存的信号;当OE`为高电平时,输出处于高阻态。该三态输出电路一方面提高了对负载的驱动能力,在锁存器与输出负载之间起到隔离作用,避免因负载变化而影响锁存器的动态特性。另一方面可以方便地讲该8锁存器应用于微处理机或计算机的总线传输电路。
b.宽总线锁存器74LVC32373A
集成了32个三态输出的D锁存器,分为4组,每组相当于一个74HC373,各组间既可同步工作,又可独立运行,异步工作,给芯片的总线应用带来极大的灵活性,还有16位、20位等宽总线D锁存器集成电路产品。
c.74LV1G373
封装中只有一路D锁存器,逻辑功能只相当于74HC373中的一个通道。
- D锁存器的动态特性

a.传输延迟时间tpd:输出信号对输入信号的响应延迟时间,对于D锁存器则是指D信号和E信号共同作用后Q端响应的延迟时间;tpLH(D-Q)是输出Q从低电平到高电平对D信号的延迟时间;tpHL(E-Q)是输出Q从高电平到低电平对E信号的延迟时间;其实对于不同的输出状态还存在tpHL(D-Q)和tpLH(E-Q)。对于CMOS集成电路,因为输出信号对各输入信号的延迟相差不多,有时统一以tpHL和tpLH表达,更常见的是取平均传输延迟时间tpd=(tpHL+tpLH)/2
b.建立时间tSU:信号D的逻辑电平必须在使能信号E下降沿到来之前建立起来,才能保证正确地锁存,它表示D信号对E下降沿的最少时间提前量。
c.保持时间tH:在E电平下降后,D信号不允许立即撤除,否则不能确保数据的锁存,tH表示D信号电平在E电平下降后需要继续保持的最少时间。
d.脉冲宽度tw:为了保证D信号正确传送到Q和Q`,要求E信号的脉冲宽度不小于tw
上面的tSU和tH都是针对被采样输入信号D的时间要求,tw是针对被采样输入信号E的时间要求,不满足时会出现:
- 触发器电路结构及工作原理:
a.主从D触发器:基础主从D触发器、带异步置位复位的主从D触发器;其动态特性:①传输延迟时间tpd ②建立时间tSU ③保持时间tH ④触发脉冲宽度tw ⑤最高时钟频率fcmax
b.维持阻塞D触发器
c.利用传输延迟的触发器(JK触发器):Q(n+1)=J·Qn + K`·Qn`,所有触发器中逻辑功能最强:J=K=0保持、J=0、K=1置0、J=1、K=0置1、J=K=1翻转。
d.T触发器:控制信号T控制状态的翻转。Q(n+1)=T·Qn` + T`·Qn
f.T`触发器:T端固定接入高电平,时钟脉冲作用一次 状态翻转一次,Q(n+1)= Qn`
g.SR触发器:仅有保持、置位、复位功能,约束SR=0;可用JK触发器直接代用,令J=S,K=R, SR=0
h:D触发器可以转换为JK、T、T`触发器
- Verilog 时序逻辑电路建模基础
1.行为级描述主要使用initia和always定义的两种结构类型的语句,一个模块中可以有多个initial always语句,仿真时这些语句并行执行。
2.initial语句是一条初始化语句,仅执行一次,在测试模块中用它对激励信号进行描述,属于不可综合语句,但是可以在DUT中用于给寄存器赋初值。注意不可综合是指不可以被综合映射成对应的硬件电路,而不是不能出现在DUT中。
3.always本身是一个无限循环语句,不停地循环执行其内部的过程语句,直达仿真过程结束。用来描述硬件电路逻辑功能时,always后面紧跟着循环的控制条件:
always @ (事件控制表达式)
begin
块内部局部变量的定义;
过程赋值语句;
end
”事件控制表达式“也称为敏感事件表,即等待确定的事件发生或某一特定的条件变为真,它是后面执行过程赋值语句的条件。过程赋值语句左边的变量必须被定义成reg数据类型,右边可以是任意数据类型。begin和end将多条过程赋值语句包围起来,组成一个顺序语句块,块内的语句按照排列顺序依次执行,直达最后一条语句执行完,等待下一次敏感事件的触发。
4.逻辑电路中的敏感事件分为电平敏感事件和边沿触发事件。
①always @(D,S) S或D中任意一个信号电平发生变化,后面的过程赋值语句将执行一次。
②always @(posedge CP or negedge CR)
5.always语句内部的过程赋值语句有两种类型:阻塞赋值语句和非阻塞赋值语句。
①"="为阻塞赋值符,在串行语句块中阻塞赋值语句按照顺序依次执行,前一条语句没有完成赋值之前后面的语句不能被执行,即前面的语句阻塞了后面的语句。
begin
B = A;
C = B + 1;
end
首先执行第一条语句,将A的值赋给B,接着执行第二条语句,将B的值加1赋值给C,执行完后C的值其实等于A+1,也就是说如果用”=“给一个变量赋了新值,则该块后面的语句若用到了该变量B时将使用新的B值。
②"<="为非阻塞赋值,非阻塞赋值语句执行过程为:首先计算语句块内部所有右边表达式的值,然后完成对左边寄存器变量的赋值操作,这些操作是并行执行的。
begin
B <= A;
C <= B + 1;
end
等begin end语句块之间所有非阻塞型赋值语句的右边表达式等被计算完并分别存储在暂存器以后,对左边寄存器变量的赋值操作才会进行。因此,C的值等于B的原始值加1,同时B被更新为A的值。即always中所有非阻塞语句在求值时,所有的值全部时进入always块时各个变量的原始值。
③在可综合电路设计中一个语句块内部只允许出现唯一一种类型的赋值语句,而不允许阻塞语句和非阻塞语句同时出现,在时序电路设计中推荐使用非阻塞语句。
6.锁存器和触发器的Verilog建模实例
①门控D锁存器:对于锁存器来说,当输入控制信号处于有效电平时,其输出跟随输入信号D的变化,当控制信号无效时,输出Q保持不变。
D_latch.v
module D_latch(
input D ,
input E ,
output reg Q ,
output QN
);
always @(E or D) begin
if(E)
Q <= D;// Q = D;一样 无差别
end
assign QN = ~Q;
endmodule
tb_D_latch.v
`include "./D_latch.v"
`timescale 1ns/1ns
module tb_D_latch;
reg D ;
reg E ;
wire Q ;
wire QN;
initial begin
D <= 0;
E <= 0;
end
initial begin
repeat(20)begin
#20
D <= {$random} % 2;
E <= {$random} % 2;
end
end
initial begin
$dumpfile("D_latch.vcd");
$dumpvars();
#500;
$finish;
end
D_latch D_latch_inst(
.D (D ),
.E (E ),
.Q (Q ),
.QN (QN )
);
endmodule
注意到写Q <= D 和 Q = D 波形都是一样的,因为是电平触发,只要敏感条件列表为真,就会把右边的值赋给左边
Q <= D:

Q = D:

②基本D触发器:因为是主从锁存结构,当CP=0期间,主锁存器锁存了D端的数据,当CP发生从0到1的跳变,即上升沿到来时,主锁存器的值传到后面从锁存器的输出Q,Q的值是上一个时钟期间传到主锁存器的值D。
DFF.v
module DFF(
input D ,
input CP ,
output reg Q
);
always @(posedge CP) begin
Q <= D;
end
endmodule
tb_DFF.v
`include "./DFF.v"
`timescale 1ns/1ns
module tb_DFF;
reg D ;
reg CP ;
wire Q ;
initial begin
CP = 1;
D <= 0;
end
always #10 CP = ~CP;
initial begin
repeat(20)begin
#20
D <= {$random} % 2;
end
end
initial begin
$dumpfile("DFF.vcd");
$dumpvars();
#500;
$finish;
end
DFF DFF_inst(
.D (D ),
.CP (CP ),
.Q (Q )
);
endmodule

③异步置1、置0功能D触发器:
async_set_rst_DFF.v
module async_set_rst_DFF(
input D ,
input Sd ,
input Rd ,
input CP ,
output reg Q ,
output reg QN
);
always @(posedge CP or negedge Sd or negedge Rd) begin//采集CP上升沿 或者 Sd下降沿 或者 Rd下降沿
if(~Sd || ~Rd)// Sd:1 Rd:0 Sd:0 Rd:1 Sd Rd不能同时为0,S+R = 1 约束条件
if(~Sd)begin//Sd:0 Rd:1 置1
Q <= 1'b1;
QN <= 1'b0;
end
else begin// Sd:1 Rd:0 置0
Q <= 1'b0;
QN <= 1'b1;
end
else begin//Sd:1 Rd:1 将D输出到Q,QN
Q <= D;
QN <= ~D;
end
end
endmodule
tb_async_set_rst_DFF.v
`include "./async_set_rst_DFF.v"
`timescale 1ns/1ns
module tb_async_set_rst_DFF;
reg D ;
reg Rd ;
reg Sd ;
reg CP ;
wire Q ;
wire QN ;
reg Rdd;
reg Sdd;
initial begin
CP = 1;
D <= 0;
Rd<= 0;
Sd<= 0;
end
always #10 CP = ~CP;
initial begin
repeat(20)begin //Rd Sd不能同时为0
#20
D <= {$random} % 2;
Rd<= {$random} % 2;
Sd<= {$random} % 2;
end
end
initial begin
$dumpfile("async_set_rst_DFF.vcd");
$dumpvars();
#500;
$finish;
end
async_set_rst_DFF async_set_rst_DFF_inst(
.D (D ),
.CP (CP ),
.Rd (Rd ),
.Sd (Sd ),
.Q (Q ),
.QN (QN )
);
endmodule

浙公网安备 33010602011771号