- 组合逻辑电路 = 逻辑运算电路 + 算术运算电路
- 时序逻辑电路 = 组合逻辑电路 + 存储电路
本章重点是学习“存储电路”
5.1 双稳态存储单元电路
5.1.1 双稳态的概念
- 两种稳态,稳态0和稳态1
- 改变状态,需要施加足够的能量,才可以从一个稳态切换到另一个稳态。
5.1.2 双稳态存储单元电路
1. 电路结构
- 最基础的双稳态电路:两个“非门”,交叉耦合。
2. 逻辑状态分析
- 对上述进行变形,更有助于理解。
- 电路只存在这两种可以长期保存的稳定状态。
- 定义:Q=0,为电路的0状态,Q=1,为电路的1状态。
- 电源刚接通后,无控制信号输入,随机进入一种状态,并长期保持不变。
- 电路具有存储记忆1位二进制数据的功能。
3. 模拟特性分析
- 两个非门的传输特性
- 电路运行的细节。
- 第3平衡点,介稳态。在0和1之间,满足两个非门的特性。但实际会有噪声的存在,介稳态难以维持。
5.2 锁存器 “latch”
- 存储单元电路:锁存器、触发器。
- 锁存器和触发器的共同特点:具有0和1两种稳定状态,可长期保持。
- 锁存器:对 脉冲电平敏感 的存储单元电路。
- 触发器:不同的锁存器构成。对 脉冲边沿敏感 的存储电路。
5.2.1 SR锁存器
1. 基本SR锁存器
- 基本SR锁存器,使用或非门代替非门。
Q
=
R
+
Q
‾
‾
Q = \overline{R+\overline{Q}}
Q=R+Q
Q
‾
=
S
+
Q
‾
\overline{Q}=\overline{S+Q}
Q=S+Q
S (set) | R(reset) | Q Q Q | Q ‾ \overline{Q} Q | 锁存器状态 |
---|---|---|---|---|
0 | 0 | 不变 | 不变 | 保持(之前的稳态) |
0 | 1 | 0 | 1 | 0-reset |
1 | 0 | 1 | 0 | 1-set |
1 | 1 | 0 | 0 | 锁存器本身处于不确定状态,如果回到S=0,R=0,无法预知锁存器回到状态(0或者1)。 |
- 正常工作时,输入信号S和R,应遵守 S R = 0 SR=0 SR=0 的约束条件。
- 基本SR锁存器:(1)保持(2)置0(3)置1。这些是一个存储单元应具备的最基础的功能。
(1)门级建模
- 添加 -debugdb ,可以看到原理图。
module SR_Latch(S,R,Q,Qnot);
input S,R;
output Q,Qnot;
nor(Q ,R,Qnot);
nor(Qnot,S,Q );
endmodule
module SR_Latch_TB;
reg S,R;
wire Q,Qnot;
SR_Latch fun(S,R,Q,Qnot);
initial
begin
S=0;R=0;
#50 S=1;R=0;
#50 S=0;R=0;
#50 S=0;R=1;
#50 S=0;R=0;
#50 S=1;R=0;
#50 S=0;R=0;
#50 $stop;
end
endmodule
(2)开关级建模
-
使用nmos管的或非门,搭建SR锁存器。
-
更简单的结构
-
根据《【学习笔记】3、逻辑门电路》3.1.9中,NMOS或非门的verilog实现,我们知道,仿真时,需要将负载管替换为上拉电阻,使用tri1定义线网Q和 Q ‾ \overline{Q} Q的类型。否则在或非门输出应输出高电平时,实际输出的是高阻,会导致逻辑错误。
-
如下所示,错误时。
-
使用三态线网tri1,定义 Q 、 Q ‾ Q、\overline{Q} Q、Q,取代nmos负载管。
-
verilog建模
module CMOS_SR_Latch(S,R,Q,Qnot);
input S,R;
output Q,Qnot;
supply1 VDD;
supply0 GND;
tri1 Q,Qnot;
// wire Q,Qnot;
//T1 T4
// nmos(VDD,Q ,VDD);
// nmos(VDD,Qnot,VDD);
//T2 T5
nmos(Q,GND,Qnot);
nmos(Qnot,GND,Q);
//T3 T6
nmos(Q,GND,R);
nmos(Qnot,GND,S);
endmodule
- 激励信号
module CMOS_SR_Latch_TB;
reg S,R;
wire Q,Qnot;
CMOS_SR_Latch fun(S,R,Q,Qnot);
initial
begin
S=0;R=0;
#50 S=1;R=0;
#50 S=0;R=0;
#50 S=0;R=1;
#50 S=0;R=0;
#50 S=1;R=0;
#50 S=0;R=0;
#50 $stop;
end
endmodule
(3) S ‾ ⋅ R ‾ 锁存器 \overline{S}·\overline{R}锁存器 S⋅R锁存器
-
对与非门,做简单变形。暂不定X、Y哪个是置位,哪个是复位。
-
列出真值表
S ‾ \overline{S} S (set) | R ‾ \overline{R} R(reset) | Q Q Q | Q ‾ \overline{Q} Q | 锁存器状态 |
---|---|---|---|---|
1 | 1 | 不变 | 不变 | 保持(之前的稳态) |
1 | 0 | 0 | 1 | 0-reset |
0 | 1 | 1 | 0 | 1-set |
0 | 0 | 1 | 1 | 锁存器本身处于不确定状态,如果回到S=1,R=1,无法预知锁存器回到状态(0或者1)。 |
- 约束: S ‾ + R ‾ = 1 ,同样 S ⋅ R = 0 。 \overline{S}+\overline{R}=1,同样 S·R=0。 S+R=1,同样S⋅R=0。
(4) S ‾ ⋅ R ‾ 锁存器 \overline{S}·\overline{R}锁存器 S⋅R锁存器应用于去抖电路
- 利用抖动的时候,
S
‾
=
1
,
R
‾
=
1
,
Q
和
Q
‾
不变
\overline{S}=1,\overline{R}=1,Q和\overline{Q}不变
S=1,R=1,Q和Q不变,实现去抖动的目标。
2. 逻辑门控 SR锁存器
- 对SR锁存器的置位S和复位R控制信号,再加一级逻辑电路。
- 许多集成锁存器和触发器,都是由逻辑门控SR锁存器构成。
- 是一个重要的基本逻辑单元电路。
- SR锁存器和逻辑门控SR锁存器,都有一个缺点,S=1,R=1,锁存器的不确定状态。
- C1表示,控制所有前缀为1的输入信号。
- 1R表示,前缀为1的reset复位输入信号。
- 1S表示,前缀为0的set置位输入信号。
5.2.2 D锁存器
1. 逻辑门控D锁存器
- 消除 逻辑门控SR锁存器 的不确定状态。
- 使得SR只会出现(0,0)、(0,1)、(1,0)的组合。D锁存器永远不会出现S=1,R=1。
- C1表示,控制所有前缀为1的输入信号。
- 1D表示,前缀为1的数据data。
- verilog建模,使用连续赋值assign。
module Logic_D_Latch(D,E,Q,Qnot);
input D,E;
output Q,Qnot;
wire S,R,Q4,Q3;
assign S = D;
assign R = !S;
assign Q3 = S&&E;
assign Q4 = R&&E;
SR_Latch fun(.S(Q3),.R(Q4),.Q(Q),.Qnot(Qnot));
endmodule
- 激励信号
module Logic_D_Latch_TB;
reg E,D;
wire Q,Qnot;
Logic_D_Latch fun(D,E,Q,Qnot);
always #23 D=~D;
initial
begin
D=0;
E=0;
#50 E=1;
#60 E=0;
#70 E=1;
#80 E=0;
#50 E=1;
#60 E=0;
#70 E=1;
#80 $stop;
end
endmodule
2. 传输门控D锁存器
- 这是一种其他形式的D锁存器。
- 不建立在 或非门 组成的 SR锁存器 基础上。
- 而是建立在 非门 组成的 双稳态存储单元电路 的基础上上。
- 在 非门 组成的 双稳态存储单元电路 的基础上,增加传输门。 Q 和 Q ‾ Q和\overline{Q} Q和Q交换了位置。
- 传输门参考《【学习笔记】3、逻辑门电路》3.7.2 小节。
- 当E=1时,使能数据D的写入。此时
Q
=
D
,
Q
‾
=
D
‾
Q=D,\overline{Q}=\overline{D}
Q=D,Q=D
- 当E=0时,电路回到 “双稳态存储单元电路”, Q 和 Q ‾ Q和\overline{Q} Q和Q保持不变。
- 在verilog中,cmos和rcmos都是传输门。
- cmos c1(输出信号,输入信号,Tn管控制信号,Tp管控制信号);
- cmos(输出信号,输入信号,Tn管控制信号,Tp管控制信号);
- verilog建模,传输门控D锁存器
module Trans_D_Latch(D,E,Q,Qnot);
input D,E;
output Q,Qnot;
wire Cnot,C,D1;
assign Cnot=!E;//非门 not n1(Cnot,E);
assign C=!Cnot; //非门
cmos(D1,D,C,Cnot);//传输门
cmos(D1,Q,Cnot,C);//传输门
assign Qnot=!D1;//非门
assign Q=!Qnot;//非门
endmodule
- 激励信号
module Trans_D_Latch_TB;
reg E,D;
wire Q,Qnot;
Trans_D_Latch fun(D,E,Q,Qnot);
always #23 D=~D;
initial
begin
D=0;
E=0;
#50 E=1;
#60 E=0;
#70 E=1;
#80 E=0;
#50 E=1;
#60 E=0;
#70 E=1;
#80 $stop;
end
endmodule
3. D锁存器的动态特性
- D锁存器的定时图。
- 建立时间
- 保持时间
- 脉冲宽度
4. 典型集成电路
- 74HC/HCT373:中规模、CMOS、8、D锁存器
- 核心是8个传输门控D锁存器。
5.3 触发器 “flip-flop”
- 锁存器:电平敏感。在使能信号E使能期间(高电平),数据会跟随输入信号变化。这在一些场合下,不适用。这段期间,很多时序逻辑功能不能实现。
- 触发器:边沿敏感。在脉冲边沿作用下,刷新状态。其他时刻,保持不变。
- 上升沿触发信号 C l o c k P u l s e Clock Pulse ClockPulse,简写 C P CP CP
- 下升沿触发信号 C l o c k P u l s e ‾ \overline{Clock Pulse} ClockPulse,简写 C P ‾ \overline{CP} CP
- 目前触发器主要有3种电路结构:主从触发器、维持阻塞触发器、传输延迟触发器。
5.3.1 主从触发器
- 在CP脉冲的上升沿到来后,瞬间转换输出状态。
1. 工作原理
-
使用2个传输门控的D锁存器,实现主从触发器。
-
CMOS(传输门)主从D触发器。其中用到了施密特非门(用来脉冲整形、消除波形中的噪声等等)。下面主传输门控D锁存器,简称为主D,从传输门控D锁存器,简称为从D
- CP时钟信号=0时,主D 不断更新数据状态。从D 保持不变。整个D触发器 的值保持不变。
- CP时钟信号从0向1变化,施密特非门达到"+Vt"阈值瞬间,主D 不再变化,主D 保持最后一个状态的值。从D 开始更新数据状态。整个D触发器 得到一个新值。
- CP时钟信号=1时,主D保持不变。从D更新状态。整个D触发器 的值保持不变。
- CP时钟信号从1向0变化,施密特非门达到"-Vt"阈值瞬间,从D 不再变化,主D 开始不断更新数据状态。整个D触发器 的值保持不变。
- 循环往复,可以发现,整个D触发器,每次更新值,只发生在上升沿0->1的瞬间。
-
特性方程: Q n + 1 = D Q^{n+1} = D Qn+1=D,其中 Q n + 1 Q^{n+1} Qn+1表示上升沿到达后触发器的状态。D表示 上升沿到达前一瞬间输入信号。
2. 集成电路
-
在上述主从D触发器的逻辑框图的基础上,做了一些改变,非门 变成了 或非门,增加了异步复位R和置位S。
-
传输门控D锁存器增加了 S ‾ 和 R ‾ \overline{S}和\overline{R} S和R输入信号。
-
主从D触发器,相应的变化。数据输入端,加了两个非门作为缓冲,输出端增加了1个非门。
- 置位:当
S
‾
=
0
,
R
‾
=
1
\overline{S}=0,\overline{R}=1
S=0,R=1时。
- 如果主D锁存处于保持状态,主D会被置位, Q ‾ 主 = 0 \overline{Q}_主=0 Q主=0。从D锁存处于更新状态,可知 Q 从 = 1 D 从 = Q ‾ 主 = 0 Q_从=1D_{从}=\overline{Q}_主=0 Q从=1D从=Q主=0。可知 Q = Q 从 ‾ = 1 Q=\overline{Q_从}=1 Q=Q从=1。
- 如果从D锁存处于保持状态,从D会被复位, Q 从 = 0 Q_从=0 Q从=0。可知 Q = Q 从 ‾ = 1 Q=\overline{Q_从}=1 Q=Q从=1。
- 复位:当
S
‾
=
1
,
R
‾
=
0
\overline{S}=1,\overline{R}=0
S=1,R=0时。
- 如果主D锁存处于保持状态,主D会被复位, Q ‾ 主 = 1 \overline{Q}_主=1 Q主=1。从D锁存处于更新状态,可知 Q 从 = 1 D 从 = Q ‾ 主 = 1 Q_从=1D_{从}=\overline{Q}_主=1 Q从=1D从=Q主=1。可知 Q = Q 从 ‾ = 0 Q=\overline{Q_从}=0 Q=Q从=0。
- 如果从D锁存处于保持状态,从D会被置位, Q 从 = 1 Q_从=1 Q从=1。可知 Q = Q 从 ‾ = 0 Q=\overline{Q_从}=0 Q=Q从=0。
- 正常工作:当
S
‾
=
1
,
R
‾
=
1
\overline{S}=1,\overline{R}=1
S=1,R=1时。
- 此时触发器才可以被CP上升沿触发。
- 不确定状态: 当
S
‾
=
0
,
R
‾
=
0
\overline{S}=0,\overline{R}=0
S=0,R=0时。
- 和前文的SR锁存器的不确定状态一致,不知道后续正常工作时,触发器的状态值。
- 约束:
R
D
‾
⋅
S
D
‾
=
0
\overline{R_D}·\overline{S_D}=0
RD⋅SD=0
- 置位:当
S
‾
=
0
,
R
‾
=
1
\overline{S}=0,\overline{R}=1
S=0,R=1时。
5.3.2 维持阻塞触发器
- 在CP脉冲的上升沿到来后,瞬间转换输出状态。
1. 工作原理
-
使用3个SR锁存器组成一个维持阻塞式触发器。
- 本小节使用的SR锁存器由与非门构成。见前文5.2.1.3
S
‾
⋅
R
‾
锁存器
\overline{S}·\overline{R}锁存器
S⋅R锁存器。
- 维持阻塞式触发器的逻辑框图
- 本小节使用的SR锁存器由与非门构成。见前文5.2.1.3
S
‾
⋅
R
‾
锁存器
\overline{S}·\overline{R}锁存器
S⋅R锁存器。
-
逻辑原理如下,(已知, S ‾ ⋅ R ‾ 锁存器 \overline{S}·\overline{R}锁存器 S⋅R锁存器不确定状态时, Q = 1 , Q ‾ = 1 Q=1,\overline{Q}=1 Q=1,Q=1)
-
(1) CP时钟信号=0时:
- 锁存器1:复位或者不确定状态,必有 Q 2 = 1 Q_2=1 Q2=1
- 锁存器2:置位或者不确定状态,必有 Q 3 = 1 Q_3=1 Q3=1
- Q 2 = 1 , Q 3 = 1 Q_2=1,Q_3=1 Q2=1,Q3=1,所以锁存器3处于保持状态不变。
- 整个触发器处于保持状态,输出不变。
- 另外,
Q
1
=
D
Q_1=D
Q1=D
-
(2) CP时钟信号从0向1变化,CP=1 瞬间: C P = 1 , Q 2 ′ = 1 , Q 3 ′ = 1 CP=1,Q_2'=1,Q_3'=1 CP=1,Q2′=1,Q3′=1。红色线阻塞,在这一瞬间可以理解为断路。
- 锁存器1的 Q 1 = S ‾ + Q 2 ′ ‾ = Q 4 ‾ + Q 2 ′ ‾ = Q 4 ‾ Q_1=\overline{S}+\overline{Q_2'}=\overline{Q_4}+\overline{Q_2'}=\overline{Q_4} Q1=S+Q2′=Q4+Q2′=Q4。这里因为锁存器1内部维持线的存在,瞬间取的是 Q 2 ′ Q_2' Q2′的值(维持在之前的1)。
- 锁存器1的 Q 2 = R ‾ + Q 1 ‾ = C P ‾ + Q 1 ‾ = Q 1 ‾ = Q 4 Q_2=\overline{R}+\overline{Q_1}=\overline{CP}+\overline{Q_1}=\overline{Q_1}=Q_4 Q2=R+Q1=CP+Q1=Q1=Q4。
- 锁存器2的 Q 3 = S ‾ + Q 4 ‾ = C P ⋅ Q 2 ′ ‾ + Q 4 ‾ = Q 4 ‾ Q_3=\overline{S}+\overline{Q_4}=\overline{CP·Q_2'}+\overline{Q_4}=\overline{Q_4} Q3=S+Q4=CP⋅Q2′+Q4=Q4。这里因为锁存器之间阻塞线的存在,瞬间取的是 Q 2 ′ Q_2' Q2′的值(阻塞新值的到来,维持之前的1)。
- 锁存器2的 Q 4 = R ‾ + Q 3 ′ ‾ = D ‾ Q_4=\overline{R}+\overline{Q_3'}=\overline{D} Q4=R+Q3′=D。这里因为锁存器2内部维持线的存在,瞬间取的是 Q 3 ′ Q_3' Q3′的值(维持在之前的1)。
- 所以可以得到, Q 2 = Q 4 = D ‾ , Q 3 = Q 4 ‾ = D Q_2=Q_4=\overline{D},Q_3=\overline{Q_4}=D Q2=Q4=D,Q3=Q4=D。
- 所以可以得到,触发器 Q = Q 2 ‾ = D , Q ‾ = Q 3 ‾ = D ‾ Q=\overline{Q_2}=D,\overline{Q}=\overline{Q_3}=\overline{D} Q=Q2=D,Q=Q3=D
-
Q
n
+
1
=
D
Q^{n+1}=D
Qn+1=D
-
(3)CP时钟信号=1时:
-
如果上升沿时D=0。则有 Q 2 = 1 , Q 3 = 0 Q_2=1,Q_3=0 Q2=1,Q3=0。
- 可以推出, Q 4 = D ‾ + Q 3 ‾ = 1 Q_4=\overline{D}+\overline{Q_3}=1 Q4=D+Q3=1。
- 可以推出, Q 1 = Q 4 ‾ + Q 2 ‾ = 0 Q_1=\overline{Q_4}+\overline{Q_2}=0 Q1=Q4+Q2=0。
- 反推, Q 2 = 1 ‾ + Q 1 ‾ = 1 , Q 3 = Q 2 ‾ + Q 4 ‾ = 0 Q_2=\overline{1}+\overline{Q1}=1,Q_3=\overline{Q_2}+\overline{Q_4}=0 Q2=1+Q1=1,Q3=Q2+Q4=0。
-
如果上升沿时,D=1。则有 Q 2 = 0 , Q 3 = 1 Q_2=0,Q_3=1 Q2=0,Q3=1。
- 可以推出, Q 4 = D ‾ + Q 3 ‾ = 0 Q_4=\overline{D}+\overline{Q_3}=0 Q4=D+Q3=0。
- 可以推出, Q 1 = Q 4 ‾ + Q 2 ‾ = 1 Q_1=\overline{Q_4}+\overline{Q_2}=1 Q1=Q4+Q2=1。
- 反推, Q 2 = 1 ‾ + Q 1 ‾ = 0 , Q 3 = Q 2 ‾ + Q 4 ‾ = 1 Q_2=\overline{1}+\overline{Q1}=0,Q_3=\overline{Q_2}+\overline{Q_4}=1 Q2=1+Q1=0,Q3=Q2+Q4=1。
-
可知,CP时钟信号=1时,锁存器1和锁存器2锁存了 Q 2 , Q 3 Q_2,Q_3 Q2,Q3的状态。
-
锁存器3处于复位或者置位状态。
-
整个触发器输出不变。
-
2. 集成电路
- TTL型:74LS74、74F74 集成芯片,内部都有两个独立的 “维持阻塞D触发器”。
- CMOS型:74HC、74HCT74集成芯片。
- 集成芯片会在 “维持阻塞D触发器”逻辑图的基础上,增加置位和复位的引脚。逻辑分析参照上文。
5.3.3 利用传输延迟的触发器
- 在CP脉冲的 下降沿 到来后,瞬间转换输出状态。
- JK触发器。
- J=K=0时,JK触发器保持不变,J=K=1时,触发器状态翻转。
1. 工作原理
-
“与或非门” 构成SR锁存器。
-
增加两个“与非门”G3 G4,传输延迟时间大于 SR锁存器的翻转时间。
-
当 C P ‾ = 0 \overline{CP}=0 CP=0时:
- J和K的值对G3和G4没有影响。G3和G4的输出都是1。
- 2组与或非门构成的SR锁存器,处于保持状态。
-
当 C P ‾ \overline{CP} CP从0变到1瞬间:
- 瞬间 G13和G23的输出还是 Q ‾ 和 Q \overline{Q}和Q Q和Q,随后会慢慢变成0。
- 最终的输出
Q
‾
和
Q
\overline{Q}和Q
Q和Q 不变。
-
当 C P ‾ = 1 \overline{CP}=1 CP=1时:状态不变,仍然处于保持状态。
-
当 C P ‾ \overline{CP} CP从1变到0瞬间:
- G12和G22不再起作用, Q 和 Q ‾ Q和\overline{Q} Q和Q只与G13和G23有关,G13和G23短时间内还保持着状态,
- S ‾ = J ⋅ Q n ‾ ‾ \overline{S}=\overline{J·\overline{Q^n}} S=J⋅Qn
- R ‾ = K ⋅ Q n ‾ \overline{R}=\overline{K·Q^n} R=K⋅Qn
- Q n + 1 = 0 + S ‾ ⋅ Q n ‾ ‾ = ( S ‾ ) ⋅ ( R ‾ ⋅ Q n ) ‾ ‾ Q^{n+1} = \overline{0+\overline{S}·\overline{Q^n}}=\overline{(\overline{S})·\overline{(\overline{R}·Q^n)}} Qn+1=0+S⋅Qn=(S)⋅(R⋅Qn)
- Q n + 1 = ( J ⋅ Q n ‾ ‾ ) ⋅ ( K ⋅ Q n ‾ ⋅ Q n ) ‾ ‾ = J ⋅ Q n ‾ + K ⋅ Q n ‾ ⋅ Q n = J ⋅ Q n ‾ + ( K ‾ + Q n ‾ ) ⋅ Q n Q^{n+1}=\overline{(\overline{J·\overline{Q^n}})·\overline{(\overline{K·Q^n}·Q^n)}}=J·\overline{Q^n}+\overline{K·Q^n}·Q^n=J·\overline{Q^n}+(\overline{K}+\overline{Q^n})·Q^n Qn+1=(J⋅Qn)⋅(K⋅Qn⋅Qn)=J⋅Qn+K⋅Qn⋅Qn=J⋅Qn+(K+Qn)⋅Qn
- Q n + 1 = J ⋅ Q n ‾ + K ‾ ⋅ Q n Q^{n+1}=J·\overline{Q^n}+\overline{K}·Q^n Qn+1=J⋅Qn+K⋅Qn,这是JK触发器的特性方程
-
J=K=0时,JK触发器保持不变
-
J=K=1时,触发器状态翻转。
2. 集成电路
-
74F112芯片,在上述JK触发器逻辑框图的基础上,增加了置位S和复位R。此处略,详见书籍。
-
74F112芯片,内部含有2个独立的JK触发器。
-
C P ‾ \overline{CP} CP下降沿时,更新数据Q。
-
Q n + 1 = J ⋅ Q n ‾ + K ‾ ⋅ Q n Q^{n+1}=J·\overline{Q^n}+\overline{K}·Q^n Qn+1=J⋅Qn+K⋅Qn
5.3.4 触发器的动作特性
以“D触发器”为例,讨论动态特性。
- 建立时间
在CP上升沿到来之前,输入信号D变化到某一状态,并保持不变稳定。建立时间:即信号D的电路建立稳定状态的最小时间值。 - 保持时间
在CP上升沿到来之后,信号D需要保持的最小时间。保证D状态可靠的传输到 Q 和 Q ‾ Q和\overline{Q} Q和Q端。 - 传输延迟时间
- 触发脉冲宽度
- 最高触发频率
5.4 触发器的逻辑功能
- 现态 Q n Q^n Qn
- 次态 Q n + 1 Q^{n+1} Qn+1
- 输入信号之间的逻辑关系
- 特性表、特性方程、状态图。
5.4.1 D触发器
- 变量:现态 Q n Q^n Qn、输入信号D。
- 函数:次态 Q n + 1 Q^{n+1} Qn+1
1. 特性表
时钟上升沿CP | 现态 Q n Q^n Qn | 输入信号 D | 次态 Q n + 1 Q^{n+1} Qn+1 | |
---|---|---|---|---|
↑ | 0 | 0 | 0 | |
↑ | 0 | 1 | 1 | |
↑ | 1 | 0 | 0 | |
↑ | 1 | 1 | 1 |
2. 特性方程
- 由上表,可以观察到 次态 Q n + 1 Q^{n+1} Qn+1与现态 Q n Q^n Qn无关,只与输入信号D有关。
- 特性方程: Q n + 1 = D Q_{n+1}=D Qn+1=D
3. 状态图
- 方向线的起点是现态 Q n Q^n Qn
- 方向线的终点是次态
Q
n
+
1
Q^{n+1}
Qn+1
5.4.2 JK触发器
- 变量:现态 Q n Q^n Qn、输入信号J和K。
- 函数:次态 Q n + 1 Q^{n+1} Qn+1
1. 特性表
时钟下降沿 C P ‾ \overline{CP} CP | 现态 Q n Q^n Qn | 输入信号 J | 输入信号 K | 次态 Q n + 1 Q^{n+1} Qn+1 | |
---|---|---|---|---|---|
↓ | 0 | 0 | 0 | 0 | |
↓ | 0 | 0 | 1 | 0 | |
↓ | 0 | 1 | 0 | 1 | |
↓ | 0 | 1 | 1 | 1 | |
↓ | 1 | 0 | 0 | 1 | |
↓ | 1 | 0 | 1 | 0 | |
↓ | 1 | 1 | 0 | 1 | |
↓ | 1 | 1 | 1 | 0 |
2. 特性方程
- 如果无法直接根据特性表,写出特性方程(逻辑表达式),可以借助卡诺图
- 特性方程: Q n + 1 = J ⋅ Q n ‾ + K ‾ ⋅ Q n Q^{n+1}=J·\overline{Q^n}+\overline{K}·Q^n Qn+1=J⋅Qn+K⋅Qn
3. 状态图
- X表示无关,可以取0,也可以取1。
- J可以理解为 置位,仅当现态为0时有效。
- K可以理解为 复位,仅当现态为1时有效。
- J=K=0时,触发器状态保持不变。
- J=K=1时,触发器一定发生翻转。
4. 波形图
- 如下图所示:
- J=K=0时,触发器状态保持不变。
- 当现态为0时,J=1, Q置位1
- 当现态为1时,K=1,Q复位0
- J=K=1时,触发器一定发生翻转。利用该特性,可以用JK触发器(J=1,K=1),做2分频。
- 两个触发器级联,可以构成4分频。
5.4.3 T触发器
-
定义一个翻转触发器,T表示Toggle。
- 每当来一个上升沿(或者下降沿)脉冲,触发器状态Q发生一次翻转。
- 并不是上升沿和下降沿同时触发。
-
在JK触发器的基础上,将J和K都换成T。构成一个下降沿触发的T触发器。
- T=1时,J=K=1,Q在下降沿会发生翻转。
- T=0时,J=K=0,Q始终不变。
-
变量:现态 Q n Q^n Qn、输入信号T。
-
函数:次态 Q n + 1 Q^{n+1} Qn+1
1. 特性表
- 使用JK触发器构成的 T触发器。
时钟下降沿 C P ‾ \overline{CP} CP | 现态 Q n Q^n Qn | 输入信号 T | 次态 Q n + 1 Q^{n+1} Qn+1 | |
---|---|---|---|---|
↓ | 0 | 0 | 0 | |
↓ | 0 | 1 (翻转使能) | 1 | |
↓ | 1 | 0 | 1 | |
↓ | 1 | 1 (翻转使能) | 0 |
2. 特性方程
- 特性方程: Q n + 1 = T ⋅ Q n ‾ + T ‾ ⋅ Q n Q^{n+1}=T·\overline{Q^n}+\overline{T}·Q^n Qn+1=T⋅Qn+T⋅Qn
3. 状态图
4. T ’ 触发器
- T恒等于1时,T触发器变成了 T’ 触发器。
- 特性方程:
Q
n
+
1
=
Q
n
‾
Q^{n+1}=\overline{Q^n}
Qn+1=Qn
5.4.4 SR触发器
- 与SR锁存器不同的是,状态的改变仅发生在时钟的上升沿(或者下降沿)。
1. 特性表
- 可能是上升沿触发,也可以是下降沿触发,二选一,与电路实现有关。
时钟边沿 | 现态 Q n Q^n Qn | 置位S | 复位R | 次态 Q n + 1 Q^{n+1} Qn+1 | |
---|---|---|---|---|---|
- | 0 | 0 | 0 | 0 | |
- | 0 | 0 | 1 | 0 | |
- | 0 | 1 | 0 | 1 | |
- | 0 | 1 | 1 | 不确定状态 | |
- | 1 | 0 | 0 | 1 | |
- | 1 | 0 | 1 | 0 | |
- | 1 | 1 | 0 | 1 | |
- | 1 | 1 | 1 | 不确定状态 |
2. 特性方程
- Q n + 1 = S + R ‾ ⋅ Q n Q^{n+1}=S+\overline{R}·Q^n Qn+1=S+R⋅Qn
- S·R=0(约束条件)
3. 状态图
- 现实少有SR触发器,可以由JK触发器构成。
- J=S置位
- K=R复位
5.4.5 触发器功能的转换
- D触发器和JK触发器 有很多 独立的中小规模产品。
- T触发器和SR触发器 常出现在 集成电路的内部。少有独立的产品。
- 可以将D触发器或者JK触发器转换成 T触发器或者SR触发器。
1. JK触发器构成T触发器
- 见5.4.2中的描述。
2. JK触发器构成SR触发器
- 见5.4.3中的描述。
3. D触发器构成JK触发器
-
D
=
J
⋅
Q
‾
+
K
‾
⋅
Q
D=J·\overline{Q}+\overline{K}·Q
D=J⋅Q+K⋅Q
4. D触发器构成T触发器
-
D = T ⋅ Q ‾ + T ‾ ⋅ Q = T ⊕ Q D=T·\overline{Q}+\overline{T}·Q=T⊕Q D=T⋅Q+T⋅Q=T⊕Q
-
D = T ⋅ Q ‾ + T ‾ ⋅ Q = T ⊙ Q ‾ D=T·\overline{Q}+\overline{T}·Q=T⊙\overline{Q} D=T⋅Q+T⋅Q=T⊙Q
5. D触发器构成T ’ 触发器
-
D
=
Q
‾
D=\overline{Q}
D=Q
5.5 用VerilogHDL描述锁存器和触发器
- 时序电路的基础部件:锁存器和触发器
5.5.1 时序电路建模基础
- 在时序电路的设计中,建议使用 “非阻塞型赋值 B<=A”。
- 在过程块 过程语句中的变量,应使用“reg”类型。
5.5.2 锁存器和触发器的Verilog建模
1. D锁存器
- 当E=1时,使能数据D的写入。此时
Q
=
D
,
Q
‾
=
D
‾
Q=D,\overline{Q}=\overline{D}
Q=D,Q=D
module D_latch(Q,D,E);
output Q;
input D,E;
reg Q;//过程块中赋值,必须定义为reg类型
always @(E or D)
if(E) Q<=D;//E==1,当D发生变化时,会传送给Q
endmodule
- 激励信号
module D_Latch_TB;
reg E,D;
wire Q;
D_latch fun(Q,D,E);
always #23 D=~D;
initial
begin
D=0;
E=0;
#50 E=1;
#60 E=0;
#70 E=1;
#80 E=0;
#50 E=1;
#60 E=0;
#70 E=1;
#80 $stop;
end
endmodule
2. D触发器
- 触发器 “flip-flop”
- 当CP上升沿时,更新Q值
- 次态 Q n + 1 = D Q^{n+1} = D Qn+1=D
(1)基本主从D触发器
- 输入信号D和CP
//Elementary D flip-flop 基本的D触发器
module DFF(Q,D,CP);
output Q;
input D,CP;
reg Q;
always @(posedge CP) //CP上升沿 触发
Q<=D;//更新Q值
endmodule
- 激励信号
module DFF_TB;
reg D,CP;
wire Q;
DFF fun(Q,D,CP);
always #10 CP=~CP;//阻塞赋值,产生时钟信号
initial
begin
CP<=0;
D<=0;
#33 D=1;
#22 D=0;
#17 D=1;
#40 D=0;
#10 $stop;
end
endmodule
(2)异步置0置1功能的D触发器
- 随时可以置0和置1,不受时钟信号限制
- 代码中敏感信号虽然是Sd和Rd的下降沿,但是if语句是优先检测的低电平信号,实际还是 低电平置位或者复位。
//asynchronous set and reset
//D flip-flop
module async_set_rst_DFF(Q,QN,D,CP,Sd,Rd);
output Q,QN;
input D,CP,Sd,Rd;
reg Q,QN;
always @(posedge CP or negedge Sd or negedge Rd)//这里的复位置位下降沿 只是起到 进入一次的作用
if(~Sd||~Rd)//低电平有效,发生了异步置位或者异步复位
if(~Sd)begin //置位
Q<=1'b1;
QN<=1'b0;
end
else begin//复位
Q<=1'b0;
QN<=1'b1;
end
else begin //非Sd和Rd的低电平,只能是CP上升沿
Q<=D;
QN<=~D;
end
endmodule
- 激励信号
module async_set_rst_DFF_TB;
reg D,CP,Sd,Rd;
wire Q,QN;
async_set_rst_DFF fun(Q,QN,D,CP,Sd,Rd);
always #10 CP=~CP;//阻塞赋值,产生时钟信号
initial
begin
Sd<=1;
Rd<=1;
CP<=0;
D<=0;
#5 Sd=0;
#2 Sd=1;
#5 Rd=0;
#2 Sd=1;
#33 D<=1;
#22 D<=0;
#17 D<=1;
#40 D<=0;
#10 $stop;
end
endmodule
(3)同步置0的D触发器
- 复位信号Rd 需要在CP的上升沿作用下才起作用。
//synchronous reset
//D flip-flop
module sync_rst_DFF(Q,D,CP,Rd);
output Q;
input D,CP,Rd;
reg Q;
always @(posedge CP) //少了Rd的下降沿触发条件,变成了同步
if(~Rd)
Q<=1'b0;
else
Q<=D;
endmodule
- 激励信号
module sync_rst_DFF_TB;
reg D,CP,Rd;
wire Q;
sync_rst_DFF fun(Q,D,CP,Rd);
always #10 CP=~CP;//阻塞赋值,产生时钟信号
initial
begin
Rd<=1;
CP<=0;
D<=1;
#21 Rd=0;
#12 Rd=1;
#22 D<=0;
#17 D<=1;
#40 D<=0;
#10 $stop;
end
endmodule
(4)JK触发器
- JK触发器模块
- 使用多路分支case语句进行描述。
- 将J和K拼在一起,作为一个2位的二进制变量{J,K},可取的值是00、01、10、11
//JK flip-flop
module JK_FF(Q,Qnot,J,K,CP);
output Q,Qnot;
input J,K,CP;
reg Q;
assign Qnot=~Q;//连续赋值
always @(negedge CP)//CP脉冲下降沿
case({J,K})
2'b00: Q<=Q; //保持不变
2'b01: Q<=1'b0;//K=1,复位0
2'b10: Q<=1'b1;//J=1,置位1
2'b11: Q<=~Q; //K=1,J=1,翻转
endcase
endmodule
- 激励信号
module JK_FF_TB;
reg J,K,CP;
wire Q,Qnot;
JK_FF fun(Q,Qnot,J,K,CP);
always #10 CP=~CP;//阻塞赋值,产生时钟信号
initial
begin
CP<=0;
J<=1;K<=0;
#155 J<=1;K<=1;
#112 J<=0;K<=0;
#123 J<=0;K<=1;
#30 $stop;
end
endmodule