- 组合逻辑电路:任意一时刻的输出信号,仅仅与该时刻的输入信号有关。
- 时序逻辑电路:任意一时刻的输出信号,与输入信号和原本的状态有关。
6.1 时序逻辑电路的基本概念
- 输入信号,输出信号,激励信号,现态,次态,状态转换关系。
6.1.1 模型与分类
1. 时序电路模型
- 时序电路是状态依赖的,时序电路又称为状态机。
- 有限状态机(FSM finite state machine):有限数量的存储单元构成的状态机,状态个数也是有限的。
2. 时序电路分类
- 时序电路分为 异步时序电路 和 同步时序电路。(CP脉冲作用的时间点不同)
- 异步时序电路:状态更新不是同时发生的。
- 同步时序电路:同一时钟源的同一脉冲边沿作用下,同步进行。
6.1.2 时序电路逻辑功能的表达
- 组合逻辑电路:输出方程,真值表,波形图,
- 时序逻辑电路:方程组(输出方程,激励方程,状态方程),状态表,状态图,时序图
1. 逻辑方程组
- 以下图为例子。未标注n和n+1的都是现态值。
- 输出方程O: Y = ( Q 0 + Q 1 ) ⋅ A ‾ Y = (Q_0+Q_1)·\overline{A} Y=(Q0+Q1)⋅A
- 激励方程E1: D 0 = ( Q 0 + Q 1 ) ⋅ A D_0 = (Q_0+Q_1)·A D0=(Q0+Q1)⋅A
- 激励方程E2: D 1 = Q 0 ‾ ⋅ A D_1 = \overline{Q_0}·A D1=Q0⋅A
- 状态方程 S 0 n + 1 : S^{n+1}_0: S0n+1: Q 0 n + 1 = ( Q 0 n + Q 1 n ) ⋅ A Q_0^{n+1}=(Q_0^n+Q_1^n)·A Q0n+1=(Q0n+Q1n)⋅A
- 状态方程 S 1 n + 1 : S^{n+1}_1: S1n+1: Q 1 n + 1 = Q 0 n ‾ ⋅ A Q_1^{n+1}=\overline{Q_0^n}·A Q1n+1=Q0n⋅A
2. 状态表
-
与真值表类似,根据上述逻辑方程组,列出状态表。
-
先列出“现态”到“次态”的转换(状态转换真值表)
- 状态方程 S 1 n + 1 : S^{n+1}_1: S1n+1: Q 1 n + 1 = Q 0 n ‾ ⋅ A Q_1^{n+1}=\overline{Q_0^n}·A Q1n+1=Q0n⋅A
- 状态方程 S 0 n + 1 : S^{n+1}_0: S0n+1: Q 0 n + 1 = ( Q 0 n + Q 1 n ) ⋅ A Q_0^{n+1}=(Q_0^n+Q_1^n)·A Q0n+1=(Q0n+Q1n)⋅A
- 输出方程O: Y = ( Q 0 + Q 1 ) ⋅ A ‾ Y = (Q_0+Q_1)·\overline{A} Y=(Q0+Q1)⋅A (现态n)
现态 Q 1 n Q_1^n Q1n | 现态 Q 0 n Q_0^n Q0n | 输入变量A | 次态 Q 1 n + 1 Q_1^{n+1} Q1n+1 | 次态 Q 1 n + 1 Q_1^{n+1} Q1n+1 | 输出Y | |
---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | |
0 | 0 | 1 | 1 | 0 | 0 | |
0 | 1 | 0 | 0 | 0 | 1 | |
0 | 1 | 1 | 0 | 1 | 0 | |
1 | 0 | 0 | 0 | 0 | 1 | |
1 | 0 | 1 | 1 | 1 | 0 | |
1 | 1 | 0 | 0 | 0 | 1 | |
1 | 1 | 1 | 0 | 1 | 0 |
- 根据状态转换真值表,列出状态表,将 Q 1 和 Q 0 拼成一个 2 位的状态值 : { Q 1 n , Q 0 n } 根据状态转换真值表,列出状态表,将Q_1和Q_0拼成一个2位的状态值:\{Q_1^n,Q_0^n\} 根据状态转换真值表,列出状态表,将Q1和Q0拼成一个2位的状态值:{Q1n,Q0n}
- 对状态进行编号“a=00,b=01,c=10,d=11”
现态 Q 1 n Q 0 n Q_1^nQ_0^n Q1nQ0n | 当A=0时,次态 Q 1 n + 1 Q 0 n + 1 / 输出 Y Q_1^{n+1}Q_0^{n+1} /输出 Y Q1n+1Q0n+1/输出Y | 当A=1时,次态 Q 1 n + 1 Q 0 n + 1 / 输出 Y Q_1^{n+1}Q_0^{n+1} /输出 Y Q1n+1Q0n+1/输出Y |
---|---|---|
00(a) | 00(a)/0 | 10(c)/0 |
01(b) | 00(a)/1 | 01(b)/0 |
10(c) | 00(a)/1 | 11(d)/0 |
11(d) | 00(a)/1 | 01(b)/0 |
3. 状态图
4. 时序图
- 可以根据 三组逻辑方程 、 状态表 、 状态图 得到时序图。
- 下图 Q 0 Q 1 Q_0Q_1 Q0Q1波形图在CP上升沿的时候,根据A和 Q 0 Q 1 Q_0Q_1 Q0Q1当前状态,决定下一状态是什么。
- 下图中,对于Y的波形图绘制,是错误的。我直接看状态图绘制Y是不对的。
- 因为Y值不在CP上升沿处同步变化,而是实时跟随A和 Q 0 Q 1 Q_0Q_1 Q0Q1变化。
- 所以我们在绘制完
Q
0
Q
1
Q_0Q_1
Q0Q1之后,再根据A和
Q
0
Q
1
Q_0Q_1
Q0Q1的实时状态,绘制Y的波形图,才是正确的。
- 正确的Y波形图。
6.2 同步时序逻辑电路分析
- 读图与识图的过程。 给定 同步时序电路 分析出 功能 。
6.2.1 一般步骤
参考前文6.1.2的分析步骤。
- (1)列出逻辑方程组
- 输出方程组O
- 激励方程组E
- 状态方程组S
- (2)根据状态方程组S和输出方程组O,列出状态表,画出状态图或者时序图
- (3)确定电路的逻辑功能,可用文字详细描述。
6.2.2 分析举例
- 前文6.1.2已经有一个例子,这里继续分析给定的时序电路图。
例1,二进制计数
下图是 米利型时序电路,输出Y与A和
Q
1
Q
0
Q_1Q_0
Q1Q0都有关。
(1)列出逻辑方程组
- 输出方程: Y = Q 0 ⋅ Q 1 ⋅ A Y=Q_0·Q_1·A Y=Q0⋅Q1⋅A
- 激励方程: T 0 = A , T 1 = Q 0 ⋅ A T_0=A,T_1=Q_0·A T0=A,T1=Q0⋅A
- 状态方程: Q 0 n + 1 = A ⋅ Q 0 n ‾ + A ‾ ⋅ Q 0 n = A ⊕ Q 0 n ,同理, Q 1 n + 1 = ( Q 0 n ⋅ A ) ⊕ Q 1 n Q_0^{n+1}=A·\overline{Q_0^n}+\overline{A}·Q_0^n=A⊕Q_0^n,同理,Q_1^{n+1}=(Q_0^n·A)⊕Q_1^n Q0n+1=A⋅Q0n+A⋅Q0n=A⊕Q0n,同理,Q1n+1=(Q0n⋅A)⊕Q1n
(2)列出状态表
- 列出可能出现的现态和次态。现态 Q 1 n Q 0 n Q_1^nQ_0^n Q1nQ0n和次态 Q 1 n + 1 Q 0 n + 1 Q_1^{n+1}Q_0^{n+1} Q1n+1Q0n+1
- 输入量A,列在次态的下面。
- 结合上述的逻辑方程组,填写状态表
现态 Q 1 n Q 0 n Q_1^nQ_0^n Q1nQ0n | A=0时,次态 Q 1 n + 1 Q 0 n + 1 Q_1^{n+1}Q_0^{n+1} Q1n+1Q0n+1 /Y | A=1时,次态 Q 1 n + 1 Q 0 n + 1 Q_1^{n+1}Q_0^{n+1} Q1n+1Q0n+1 /Y |
---|---|---|
00 | 00/0 | 01/0 |
01 | 01/0 | 10/0 |
10 | 10/0 | 11/0 |
11 | 11/0 | 00/1 |
(3)画出状态图
- 下图是 米利型状态机,输出Y与A和
Q
1
Q
0
Q_1Q_0
Q1Q0都有关。
(4)画出波形图
- Y是现态,只看输出方程:
Y
=
Q
0
⋅
Q
1
⋅
A
Y=Q_0·Q_1·A
Y=Q0⋅Q1⋅A。
(5)分析逻辑功能
- 二进制计数器,A=1时,开始计数。A=0时,停止计数。计数值为现态 Q 1 n Q 0 n Q_1^nQ_0^n Q1nQ0n
- Y表示记满。Y=1时,计数值为11。
- Y的下降沿来临时,重新开始计数。
- Y的下降沿可以作为触发进位的操作。
- 观察波形图,输入A的波动,会干扰进位,错误产生2次进位信号。后续需要改进电路“计数与进位”。
例2,可逆二进制计数
下图是 穆尔型时序电路,输出Y只和
Q
1
Q
0
Q_1Q_0
Q1Q0都有关,与输入无关。
(1)列出逻辑方程组
- 输出方程: Z = Q 1 Q 0 Z=Q_1Q_0 Z=Q1Q0
- 激励方程: J 0 = K 0 = 1 , F F 0 构成了一个 J_0=K_0=1,FF0构成了一个 J0=K0=1,FF0构成了一个T’ 触发器。 J 1 = K 1 = A ⊕ Q 0 。 触发器。J_1=K_1=A⊕Q_0。 触发器。J1=K1=A⊕Q0。
- 状态方程: Q 0 n + 1 = 1 ⊕ Q 0 n = Q 0 n ‾ Q_0^{n+1}=1⊕Q_0^n=\overline{Q_0^n} Q0n+1=1⊕Q0n=Q0n, Q 1 n + 1 = A ⊕ Q 0 n ⊕ Q 1 n Q_1^{n+1}=A⊕Q_0^n⊕Q_1^n Q1n+1=A⊕Q0n⊕Q1n
(2)列出状态表
- 列出可能出现的现态和次态。现态 Q 1 n Q 0 n Q_1^nQ_0^n Q1nQ0n和次态 Q 1 n + 1 Q 0 n + 1 Q_1^{n+1}Q_0^{n+1} Q1n+1Q0n+1
- 输入量A,列在次态的下面。
- 结合上述的逻辑方程组,填写状态表
- Q 0 Q_0 Q0的次态是取反,与A无关
- 输出Z与现态 Q 1 n Q 0 n Q_1^nQ_0^n Q1nQ0n无关,因而可以单独列出。
现态 Q 1 n Q 0 n Q_1^nQ_0^n Q1nQ0n | A=0时,次态 Q 1 n + 1 Q 0 n + 1 Q_1^{n+1}Q_0^{n+1} Q1n+1Q0n+1 | A=1时,次态 Q 1 n + 1 Q 0 n + 1 Q_1^{n+1}Q_0^{n+1} Q1n+1Q0n+1 | 输出Z |
---|---|---|---|
00 | 01 | 11 | 0 |
01 | 10 | 00 | 0 |
10 | 11 | 01 | 0 |
11 | 00 | 10 | 1 |
(3)画出状态图
- 下图是 穆尔型状态图,输出Z只与现态 Q 1 n Q 0 n Q_1^nQ_0^n Q1nQ0n有关,与输入A无关,因而可以画在圈内。
(4)画出波形图
(5)分析逻辑功能
- 可逆二进制计数器
- A=0时,正向计数,A=1时,反向计数。
- Z表示进位信号。在加计数时,Z的下降沿触发进位信号。在减计数时,Z的上升沿触发借位信号。
例3,脉冲分配器,节拍脉冲产生器
下图是 穆尔型时序电路,输出只与触发器状态有关。无输入。
(1)列出逻辑方程组
- 输出方程: Z 0 = Q 0 , Z 1 = Q 1 , Z 2 = Q 2 Z_0=Q_0,Z_1=Q_1,Z_2=Q_2 Z0=Q0,Z1=Q1,Z2=Q2
- 激励方程: D 0 = Q 0 ‾ ⋅ Q 1 ‾ , D 1 = Q 0 , D 2 = Q 1 D_0=\overline{Q_0}·\overline{Q_1},D_1=Q_0,D_2=Q_1 D0=Q0⋅Q1,D1=Q0,D2=Q1
- 状态方程: Q 0 n + 1 = D 0 = Q 0 n ‾ ⋅ Q 1 n ‾ , Q 1 n + 1 = D 1 = Q 0 n , Q 2 n + 1 = D 2 = Q 1 n Q_0^{n+1}=D_0=\overline{Q_0^n}·\overline{Q_1^n},Q_1^{n+1}=D_1=Q_0^n,Q_2^{n+1}=D_2=Q_1^n Q0n+1=D0=Q0n⋅Q1n,Q1n+1=D1=Q0n,Q2n+1=D2=Q1n
(2)列出状态表
现态 Q 2 n Q 1 n Q 0 n Q_2^nQ_1^nQ_0^n Q2nQ1nQ0n | 次态 Q 2 n + 1 Q 1 n + 1 Q 0 n + 1 Q_2^{n+1}Q_1^{n+1}Q_0^{n+1} Q2n+1Q1n+1Q0n+1 |
---|---|
000 | 001 |
001 | 010 |
010 | 100 |
011 | 110 |
100 | 001 |
101 | 010 |
110 | 100 |
111 | 110 |
(3)画出状态图
(4)画出波形图
- 根据状态图可知,最终都会进入3个循环状态中。
- 具体从哪个入口进入3个循环状态,由初始状态决定。
- 设定初始状态为000
(5)分析逻辑功能
- 电路的有效状态是3为循环码。
- 电路把周期脉冲信号,分成了3倍周期的脉冲信号
- 脉冲分配器,节拍脉冲产生器
6.3 同步时序逻辑电路设计
- 时序电路设计也叫时序电路综合。
- 根据给定的逻辑功能->设计出逻辑电路,
6.3.1 一般步骤
-
(1)给定逻辑功能
- 需求的时序电路逻辑功能,是通过文字、图形、波形图来描述的。
- 必须把他们变成规范的状态图或者状态表。
- 明确输入条件,输出要求。确定输入变量的数目与符号。在同步时序电路中, C P 或者 C P ‾ CP或者\overline{CP} CP或者CP不作为输入变量考虑。
- 找出所有的状态转换关系。建立原始的状态图。
- 根据状态图,建立状态表。
- 状态图和状态表需要全面正确的反应设计要求。
-
(2)状态化简
- 去除多余状态。
- 两个状态,在相同的输入下,产生的次态相同,这两个状态称为“等价状态”,可以将两个状态合并。
-
(3)状态分配
- 对每个状态,指定一个特定的二进制代码。状态编码,状态分配码。
- 编码方案不同,设计出的电路结构不同。
- 确定状态编码的位数。触发器的个数n,为状态编码的位数。状态数M,表示状态的个数。一般应该满足: 2 n − 1 < M ≤ 2 n 2^{n-1} <M≤2^n 2n−1<M≤2n
- 对每个状态进行编码。从 2 n 2^n 2n个状态中,取M个状态组合。
- 选取编码方案,应有利于触发器的激励方程和输出方程的化简。
- 电路应稳定可靠。
- 自然数二进制数递增顺序编码,有利于化简电路。
- 格雷码编码,有利于减少状态输出出现“竞争和冒险”。
-
(4)选择触发器类型
- D触发器
- JK触发器
- 等等。
-
(5)确定激励方程组和输出方程组
- 根据状态分配后的分配表,使用卡诺图或者其他方式,进行化简。
- 求出激励方程、输出方程。(组合电路)
-
(6)画出逻辑图并增加自启动能力。
- 根据激励方程和输出方程组,画出逻辑电路图。
- 避免进入无效状态,不能退出。
- 检查电路能否进入有效状态。是否具有自启动功能。
- 有时,需要指定初始启动状态。可利用触发器的置0置1功能。
- 设计了复位电路的时序电路,不需要考虑自启动问题。
6.3.2 设计举例
例1 8421BCD计数器
(1)需求
- 用D触发器,设计一个8421BCD码,同步十进制加计数器。
- 参考第一章1.4小节8421BCD码。
- 8421BCD码。“有权码”。自然二进制数的前10种组合。
- 同步时序
- 十进制加计数
(2)状态化简
- 无
(3)状态分配
- 无
(4)选择触发器
- 需求中已经明确选用D触发器。
- 列出状态图或者状态表
计数CP脉冲 | 现态 Q 3 n Q 2 n Q 1 n Q 0 n Q_3^nQ_2^nQ_1^nQ_0^n Q3nQ2nQ1nQ0n | 次态 Q 3 n + 1 Q 2 n + 1 Q 1 n + 1 Q 0 n + 1 Q_3^{n+1}Q_2^{n+1}Q_1^{n+1}Q_0^{n+1} Q3n+1Q2n+1Q1n+1Q0n+1 |
---|---|---|
0 | 0000 | 0001 |
1 | 0001 | 0010 |
2 | 0010 | 0011 |
3 | 0011 | 0100 |
4 | 0100 | 0101 |
5 | 0101 | 0110 |
6 | 0110 | 0111 |
7 | 0111 | 1000 |
8 | 1000 | 1001 |
9 | 1001 | 0000 |
(5)确定激励方程
- 4个D触发器的激励信号是 D 3 D 2 D 1 D 0 D_3 D_2 D_1 D_0 D3D2D1D0
- 根据D触发器的状态方程,可知 Q n + 1 = D Q^{n+1}=D Qn+1=D
- 结合状态表,可以反推出D应该在次态来临前,对应的值
计数CP脉冲 | 现态 Q 3 n Q 2 n Q 1 n Q 0 n Q_3^nQ_2^nQ_1^nQ_0^n Q3nQ2nQ1nQ0n | D 3 D 2 D 1 D 0 D_3 D_2 D_1 D_0 D3D2D1D0 |
---|---|---|
0 | 0000 | 0001 |
1 | 0001 | 0010 |
2 | 0010 | 0011 |
3 | 0011 | 0100 |
4 | 0100 | 0101 |
5 | 0101 | 0110 |
6 | 0110 | 0111 |
7 | 0111 | 1000 |
8 | 1000 | 1001 |
9 | 1001 | 0000 |
-
得到激励方程组
- D 3 = E 3 ( Q 3 n , Q 2 n , Q 1 n , Q 0 n ) = m 7 + m 8 D_3 = E_3(Q_3^n,Q_2^n,Q_1^n,Q_0^n)=m_7+m_8 D3=E3(Q3n,Q2n,Q1n,Q0n)=m7+m8
- D 2 = E 2 ( Q 3 n , Q 2 n , Q 1 n , Q 0 n ) = m 3 + m 4 + m 5 + m 6 D_2 = E_2(Q_3^n,Q_2^n,Q_1^n,Q_0^n)=m_3+m_4+m_5+m_6 D2=E2(Q3n,Q2n,Q1n,Q0n)=m3+m4+m5+m6
- D 1 = E 1 ( Q 3 n , Q 2 n , Q 1 n , Q 0 n ) = m 1 + m 2 + m 5 + m 6 D_1 = E_1(Q_3^n,Q_2^n,Q_1^n,Q_0^n)=m_1+m_2+m_5+m_6 D1=E1(Q3n,Q2n,Q1n,Q0n)=m1+m2+m5+m6
- D 0 = E 0 ( Q 3 n , Q 2 n , Q 1 n , Q 0 n ) = m 0 + m 2 + m 4 + m 6 + m 8 D_0 = E_0(Q_3^n,Q_2^n,Q_1^n,Q_0^n)=m_0+m_2+m_4+m_6+m_8 D0=E0(Q3n,Q2n,Q1n,Q0n)=m0+m2+m4+m6+m8
-
使用卡诺图化简,下图灰色格子表示无关项“X”
-
D 3 D 2 D 1 D 0 D_3 D_2 D_1 D_0 D3D2D1D0的卡诺图如下,结合无关项进行化简,得到激励方程组
- D 3 = Q 2 Q 1 Q 0 + Q 3 Q 0 ‾ D_3=Q_2Q_1Q_0+Q_3\overline{Q_0} D3=Q2Q1Q0+Q3Q0
- D 2 = Q 2 ‾ Q 1 Q 0 + Q 2 Q 1 ‾ + Q 2 Q 0 ‾ D_2=\overline{Q_2}Q_1Q_0+Q_2\overline{Q_1}+Q_2\overline{Q_0} D2=Q2Q1Q0+Q2Q1+Q2Q0
- D 1 = Q 3 ‾ Q 1 ‾ Q 0 + Q 1 Q 0 ‾ D_1=\overline{Q_3}\overline{Q_1}Q_0+Q_1\overline{Q_0} D1=Q3Q1Q0+Q1Q0
-
D
0
=
Q
0
‾
D_0=\overline{Q_0}
D0=Q0
(6)画出逻辑图
- 根据激励方程组,绘制逻辑图。
- D 3 = Q 2 Q 1 Q 0 + Q 3 Q 0 ‾ D_3=Q_2Q_1Q_0+Q_3\overline{Q_0} D3=Q2Q1Q0+Q3Q0
- D 2 = Q 2 ‾ Q 1 Q 0 + Q 2 Q 1 ‾ + Q 2 Q 0 ‾ D_2=\overline{Q_2}Q_1Q_0+Q_2\overline{Q_1}+Q_2\overline{Q_0} D2=Q2Q1Q0+Q2Q1+Q2Q0
- D 1 = Q 3 ‾ Q 1 ‾ Q 0 + Q 1 Q 0 ‾ D_1=\overline{Q_3}\overline{Q_1}Q_0+Q_1\overline{Q_0} D1=Q3Q1Q0+Q1Q0
- D 0 = Q 0 ‾ D_0=\overline{Q_0} D0=Q0
- 下图,具有复位功能。工作时
R
E
S
E
T
‾
\overline{RESET}
RESET需要保持为高电平。
(7)检查自启动能力
- 4位二进制数,其中10种组合为有效状态,用来表示8421BCD码,另外6种是无效状态。
- 有效状态,按照设计需求设计的电路,有效状态会随着加计数循环变化。
- 无效状态,代入电路的状态方程组,求出无效状态的次态,如果次态仍为无效状态,继续代入状态方程。
- 检查无效状态最终是否会进入有效状态。
- Q 3 n + 1 = D 3 = Q 2 n Q 1 n Q 0 n + Q 3 n Q 0 n ‾ Q_3^{n+1}=D_3=Q_2^nQ_1^nQ_0^n+Q_3^n\overline{Q_0^n} Q3n+1=D3=Q2nQ1nQ0n+Q3nQ0n
- Q 2 n + 1 = D 2 = Q 2 n ‾ Q 1 n Q 0 n + Q 2 n Q 1 n ‾ + Q 2 n Q 0 n ‾ Q_2^{n+1}=D_2=\overline{Q_2^n}Q_1^nQ_0^n+Q_2^n\overline{Q_1^n}+Q_2^n\overline{Q_0^n} Q2n+1=D2=Q2nQ1nQ0n+Q2nQ1n+Q2nQ0n
- Q 1 n + 1 = D 1 = Q 3 n ‾ Q 1 ‾ Q 0 n + Q 1 n Q 0 n ‾ Q_1^{n+1}=D_1=\overline{Q_3^n}\overline{Q_1}Q_0^n+Q_1^n\overline{Q_0^n} Q1n+1=D1=Q3nQ1Q0n+Q1nQ0n
- Q 0 n + 1 = D 0 = Q 0 n ‾ Q_0^{n+1}=D_0=\overline{Q_0^n} Q0n+1=D0=Q0n
- 如下图,状态图所示,6种无效状态最终会进入有效状态。
- 1010 -> 1011->0100
- 1011->0100
- 1100->1101->0100
- 1101->0100
- 1110->1111->1000
- 1111->1000
例2 序列编码检测器
(1)需求
- 序列编码检测器,当检测到110序列编码(自左向右),电路输出1,否则输出0。
-
一个输入A,一个输出Y。
-
电路检测A的编码序列,一旦检测到连续编码110序列,输出1,否则输出0。
-
分析,假设电路处于初始状态,连续收到1,1,0,最终进入"检测成功"的状态。
-
中间收到1,1,0对应有各自的状态。
-
对原始状态图进行化简,S表示状态,增加abcd状态符号。如下图所示。
-
列出状态表
-
现态 S n S^n Sn | A=0时,次态 S n + 1 / 输出 Y S^{n+1}/输出Y Sn+1/输出Y | A=1时,次态 S n + 1 / 输出 Y S^{n+1}/输出Y Sn+1/输出Y |
---|---|---|
a | a/0 | b/0 |
b | a/0 | c/0 |
c | d/1 | c/0 |
d | a/0 | b/0 |
(2)状态化简
- 在一开始,我就感觉状态a 初始可以为0可以为1,是不是可以化简。
- 通过观察状态表,可以看到状态a和状态d的次态完全相同(相同A输入的情况下)。
- a和d称为”等价状态“,可以合并。即a=d,d=a。
- 去除d状态后,可以得到新的状态表,如下所示
现态 S n S^n Sn | A=0时,次态 S n + 1 / 输出 Y S^{n+1}/输出Y Sn+1/输出Y | A=1时,次态 S n + 1 / 输出 Y S^{n+1}/输出Y Sn+1/输出Y |
---|---|---|
a | a/0 | b/0 |
b | a/0 | c/0 |
c | a/1 | c/0 |
- 化简后的状态图,如下所示。c状态时,电路已经收到了两个1,这个时候再收到一个0,即算接受了一个完整的110。电路可直接回到初始状态a,准备接受新的110的到来。
(3)状态分配
- 3个状态,用2位二进制数表示,初步分配 a=00,b=01,c=10
- 00->01->10 ,这里可以看到 01和10一下变了两位,电路实现较复杂。类似于格雷码的考虑,只变一个状态将10换成11。
- 即00->01->11。
- a=00,b=01,c=11
(4)触发器选择
- JK触发器的逻辑功能更强。可能实现上更简单。
Q n + 1 = J Q n ‾ + K ‾ Q n Q^{n+1}=J\overline{Q^n}+\overline{K}Q^n Qn+1=JQn+KQn
(5)激励方程组和输出方程组
- JK触发器的激励方程需要间接给出。
- 结合JK触发器的状态方程和状态图或状态表,可以推出
Q
n
+
1
Q
n
和
J
K
Q^{n+1}Q^n和JK
Qn+1Qn和JK的关系,激励表。
- 如, Q 1 n = 0 , Q 0 n = 0 Q_1^n=0,Q_0^n=0 Q1n=0,Q0n=0,它们的次态是 A = 0 时, Q 1 n + 1 = 0 , Q 0 n + 1 = 0 A=0时,Q_1^{n+1}=0,Q_0^{n+1}=0 A=0时,Q1n+1=0,Q0n+1=0或者 A = 1 时, Q 1 n + 1 = 0 , Q 0 n + 1 = 1 A=1时,Q_1^{n+1}=0,Q_0^{n+1}=1 A=1时,Q1n+1=0,Q0n+1=1,
Q 1 n Q 0 n Q_1^nQ_0^n Q1nQ0n | A | Q 1 n + 1 Q 0 n + 1 Q_1^{n+1}Q_0^{n+1} Q1n+1Q0n+1 |
---|---|---|
00 | 0 | 00 |
00 | 1 | 01 |
01 | 0 | 00 |
01 | 1 | 11 |
11 | 0 | 00 |
11 | 1 | 01 |
将 Q 1 , Q 0 Q_1,Q_0 Q1,Q0的现态和次态代入 Q n + 1 = J Q n ‾ + K ‾ Q n Q^{n+1}=J\overline{Q^n}+\overline{K}Q^n Qn+1=JQn+KQn等式两边,求出 J 1 J 0 K 1 K 0 J_1J_0K_1K_0 J1J0K1K0
现态 Q 1 n Q 0 n Q_1^nQ_0^n Q1nQ0n | 输出A | 次态 Q 1 n + 1 Q 0 n + 1 Q_1^{n+1}Q_0^{n+1} Q1n+1Q0n+1 | 输出Y | 代入 | J 1 J_1 J1 | K 1 K_1 K1 | J 0 J_0 J0 | K 0 K_0 K0 |
---|---|---|---|---|---|---|---|---|
00 | 0 | 00 | 0 | Q 1 : 0 = J 1 ⋅ 0 ‾ + K 1 ‾ ⋅ 0 Q 0 : 0 = J 0 ⋅ 0 ‾ + K 0 ‾ ⋅ 0 Q_1:0=J_1·\overline{0}+\overline{K_1}·0 \\ Q_0:0=J_0·\overline{0}+\overline{K_0}·0 Q1:0=J1⋅0+K1⋅0Q0:0=J0⋅0+K0⋅0 | 0 | X | 0 | X |
00 | 1 | 01 | 0 | Q 1 : 0 = J 1 ⋅ 0 ‾ + K 1 ‾ ⋅ 0 Q 0 : 1 = J 0 ⋅ 0 ‾ + K 0 ‾ ⋅ 0 Q_1:0=J_1·\overline{0}+\overline{K_1}·0 \\ Q_0:1=J_0·\overline{0}+\overline{K_0}·0 Q1:0=J1⋅0+K1⋅0Q0:1=J0⋅0+K0⋅0 | 0 | X | 1 | X |
01 | 0 | 00 | 0 | Q 1 : 0 = J 1 ⋅ 0 ‾ + K 1 ‾ ⋅ 0 Q 0 : 0 = J 0 ⋅ 1 ‾ + K 0 ‾ ⋅ 1 Q_1:0=J_1·\overline{0}+\overline{K_1}·0 \\ Q_0:0=J_0·\overline{1}+\overline{K_0}·1 Q1:0=J1⋅0+K1⋅0Q0:0=J0⋅1+K0⋅1 | 0 | X | X | 1 |
01 | 1 | 11 | 0 | Q 1 : 1 = J 1 ⋅ 0 ‾ + K 1 ‾ ⋅ 0 Q 0 : 1 = J 0 ⋅ 1 ‾ + K 0 ‾ ⋅ 1 Q_1:1=J_1·\overline{0}+\overline{K_1}·0 \\ Q_0:1=J_0·\overline{1}+\overline{K_0}·1 Q1:1=J1⋅0+K1⋅0Q0:1=J0⋅1+K0⋅1 | 1 | X | X | 0 |
11 | 0 | 00 | 1 | Q 1 : 0 = J 1 ⋅ 1 ‾ + K 1 ‾ ⋅ 1 Q 0 : 0 = J 0 ⋅ 1 ‾ + K 0 ‾ ⋅ 1 Q_1:0=J_1·\overline{1}+\overline{K_1}·1 \\ Q_0:0=J_0·\overline{1}+\overline{K_0}·1 Q1:0=J1⋅1+K1⋅1Q0:0=J0⋅1+K0⋅1 | X | 1 | X | 1 |
11 | 1 | 11 | 0 | Q 1 : 1 = J 1 ⋅ 1 ‾ + K 1 ‾ ⋅ 1 Q 0 : 1 = J 1 ⋅ 1 ‾ + K 0 ‾ ⋅ 1 Q_1:1=J_1·\overline{1}+\overline{K_1}·1 \\ Q_0:1=J_1·\overline{1}+\overline{K_0}·1 Q1:1=J1⋅1+K1⋅1Q0:1=J1⋅1+K0⋅1 | X | 0 | X | 0 |
J
1
=
Q
1
‾
Q
0
A
Y
‾
=
m
6
J_1=\overline{Q_1}Q_0A\overline{Y}=m_6
J1=Q1Q0AY=m6
K
1
=
Q
1
Q
0
A
‾
Y
=
m
13
K_1=Q_1Q_0\overline{A}Y=m_{13}
K1=Q1Q0AY=m13
J
0
=
Q
1
‾
Q
0
‾
A
Y
‾
=
m
2
J_0=\overline{Q_1}\overline{Q_0}A\overline{Y}=m_2
J0=Q1Q0AY=m2
K
0
=
Q
1
‾
Q
0
A
‾
Y
‾
=
m
4
K_0=\overline{Q_1}Q_0\overline{A}\overline{Y}=m_4
K0=Q1Q0AY=m4
使用卡诺图进行化简,得到激励方程组
J
1
=
Q
0
A
J_1=Q_0A
J1=Q0A
K
1
=
A
‾
K_1=\overline{A}
K1=A
J
0
=
A
J_0=A
J0=A
K
0
=
A
‾
K_0=\overline{A}
K0=A
使用卡诺图进行化简,得到输出方程
Y
=
Q
1
⋅
A
‾
Y=Q_1·\overline{A}
Y=Q1⋅A
(6)绘制逻辑图
(7)检查自启动能力
由前文可知,2位二进制状态中,10状态是无效状态。代入激励方程和输出方程
-
当 A = 0 , Q 1 Q 0 = 10 A=0,Q_1Q_0=10 A=0,Q1Q0=10时, 10->00有效状态,Y=1
- J 1 = Q 0 A = 0 J_1=Q_0A=0 J1=Q0A=0
- K 1 = A ‾ = 1 K_1=\overline{A}=1 K1=A=1
- J 0 = A = 0 J_0=A=0 J0=A=0
- K 0 = A ‾ = 1 K_0=\overline{A}=1 K0=A=1
- Y = Q 1 ⋅ A ‾ = 1 Y=Q_1·\overline{A}=1 Y=Q1⋅A=1(重大错误,此种情形下,输出会错误出现1的情况,而此时并不是检测序列成功的状态)
- Q 1 n + 1 = J 1 ⋅ Q 1 n ‾ + K 1 ‾ ⋅ Q 1 n = 0 ⋅ 1 ‾ + 1 ‾ ⋅ 1 = 0 Q_1^{n+1}=J_1·\overline{Q_1^n}+\overline{K_1}·Q_1^n=0·\overline{1}+\overline{1}·1=0 Q1n+1=J1⋅Q1n+K1⋅Q1n=0⋅1+1⋅1=0
- Q 0 n + 1 = J 0 ⋅ Q 0 n ‾ + K 0 ‾ ⋅ Q 0 n = 0 ⋅ 0 ‾ + 1 ‾ ⋅ 0 = 0 Q_0^{n+1}=J_0·\overline{Q_0^n}+\overline{K_0}·Q_0^n=0·\overline{0}+\overline{1}·0=0 Q0n+1=J0⋅Q0n+K0⋅Q0n=0⋅0+1⋅0=0
-
当 A = 1 , Q 1 Q 0 = 10 A=1,Q_1Q_0=10 A=1,Q1Q0=10时, 10->11有效状态,Y=0
- J 1 = Q 0 A = 1 J_1=Q_0A=1 J1=Q0A=1
- K 1 = A ‾ = 0 K_1=\overline{A}=0 K1=A=0
- J 0 = A = 1 J_0=A=1 J0=A=1
- K 0 = A ‾ = 0 K_0=\overline{A}=0 K0=A=0
- Y = Q 1 ⋅ A ‾ = 0 Y=Q_1·\overline{A}=0 Y=Q1⋅A=0
- Q 1 n + 1 = J 1 ⋅ Q 1 n ‾ + K 1 ‾ ⋅ Q 1 n = 1 ⋅ 1 ‾ + 0 ‾ ⋅ 1 = 1 Q_1^{n+1}=J_1·\overline{Q_1^n}+\overline{K_1}·Q_1^n=1·\overline{1}+\overline{0}·1=1 Q1n+1=J1⋅Q1n+K1⋅Q1n=1⋅1+0⋅1=1
- Q 0 n + 1 = J 0 ⋅ Q 0 n ‾ + K 0 ‾ ⋅ Q 0 n = 1 ⋅ 0 ‾ + 0 ‾ ⋅ 0 = 1 Q_0^{n+1}=J_0·\overline{Q_0^n}+\overline{K_0}·Q_0^n=1·\overline{0}+\overline{0}·0=1 Q0n+1=J0⋅Q0n+K0⋅Q0n=1⋅0+0⋅0=1
- 无效状态会在下一次脉冲到来后,变为有效状态。但是会出现输出状态错误的情况。
- 无效状态, Q 1 Q 0 A = 100 Q_1Q_0A=100 Q1Q0A=100,在卡诺图中,不应标记为无关。
- 修改后的卡诺图,得到
Y
=
Q
1
⋅
Q
0
⋅
A
‾
Y=Q_1·Q_0·\overline{A}
Y=Q1⋅Q0⋅A
- 修改后的逻辑图
例3 给定原始状态图
(1)需求
-
实现如下图“状态图”所示的电路。使用D触发器设计。
- 列出原始状态表
现态 S n S^n Sn | A=0时,次态 S n + 1 S^{n+1} Sn+1/Y | A=1时,次态 S n + 1 S^{n+1} Sn+1/Y |
---|---|---|
a | a/0 | b/0 |
b | c/0 | d/0 |
c | a/0 | d/0 |
d | e/0 | f/1 |
e | a/0 | f/1 |
f | g/0 | f/1 |
g | a/0 | f/1 |
(2)状态化简
- 观察原始状态表可知,e和g是等价状态。A相同的情况下,次态相同,输出相同。
- 将e和g合并,不会影响输出Y的逻辑。得到如下状态表。
现态 S n S^n Sn | A=0时,次态 S n + 1 S^{n+1} Sn+1/Y | A=1时,次态 S n + 1 S^{n+1} Sn+1/Y |
---|---|---|
a | a/0 | b/0 |
b | c/0 | d/0 |
c | a/0 | d/0 |
d | e/0 | f/1 |
e | a/0 | f/1 |
f | e/0 | f/1 |
- 对于改变之后的状态表,又发现,d和f等价,可以将d和f合并。不会影响输出Y的逻辑。
现态 S n S^n Sn | A=0时,次态 S n + 1 S^{n+1} Sn+1/Y | A=1时,次态 S n + 1 S^{n+1} Sn+1/Y |
---|---|---|
a | a/0 | b/0 |
b | c/0 | d/0 |
c | a/0 | d/0 |
d | e/0 | d/1 |
e | a/0 | d/1 |
(3)状态分配
-
由状态图可知,需要定义5个状态abcde
-
方案一:选用3位二进制数的前5个连续编码。000,001,010,011,100
-
方案二:选用3位格雷码的前5个编码。降低竞争冒险。000,001,011,010,110
-
方案三:选用1对1方案。5位二进制数,每一位对应一种状态。00001,00010,00100,01000,10000。使用的触发器较多,但组合电路可能会更简单。针对触发器多,门逻辑少的情形下,该方案更加好。
-
最终按照方案一,3位二进制数的前5个连续编码,a=000,b=001,c=010,d=011,e=100
现态 Q 2 n Q 1 n Q 0 n Q_2^nQ_1^nQ_0^n Q2nQ1nQ0n | A=0时,次态 Q 2 n + 1 Q 1 n + 1 Q 0 n + 1 Q_2^{n+1}Q_1^{n+1}Q_0^{n+1} Q2n+1Q1n+1Q0n+1/Y | A=1时,次态 Q 2 n + 1 Q 1 n + 1 Q 0 n + 1 Q_2^{n+1}Q_1^{n+1}Q_0^{n+1} Q2n+1Q1n+1Q0n+1/Y |
---|---|---|
000 | 000/0 | 001/0 |
001 | 010/0 | 011/0 |
010 | 000/0 | 011/0 |
011 | 100/0 | 011/1 |
100 | 000/0 | 011/1 |
(4)选取触发器
- 需求已经明确,使用D触发器。
(5)确定激励方程组和输出方程组
- 3位二进制数,对应3个D触发器。
- 状态方程: Q n + 1 = D Q^{n+1}=D Qn+1=D
- 所以状态表可以改写成如下形式,栏目中增加D。
状态转换真值表
现态 Q 2 n Q 1 n Q 0 n Q_2^nQ_1^nQ_0^n Q2nQ1nQ0n | A | 次态 Q 2 n + 1 ( D 2 ) Q 1 n + 1 ( D 1 ) Q 0 n + 1 ( D 0 ) Q_2^{n+1}(D_2)Q_1^{n+1}(D_1)Q_0^{n+1}(D_0) Q2n+1(D2)Q1n+1(D1)Q0n+1(D0)/Y |
---|---|---|
000 | 0 | 000/0 |
000 | 1 | 001/0 |
001 | 0 | 010/0 |
001 | 1 | 011/0 |
010 | 0 | 000/0 |
010 | 1 | 011/0 |
011 | 0 | 100/0 |
011 | 1 | 011/1 |
100 | 0 | 000/0 |
100 | 1 | 011/1 |
- 使用卡诺图,求出逻辑表达式
- 激励方程组
- D 2 = Q 1 Q 0 A ‾ D_2 = Q_1Q_0\overline{A} D2=Q1Q0A
- D 1 = Q 1 A + Q 1 ‾ Q 0 + Q 2 A D_1 = Q_1A+\overline{Q_1}Q_0+Q_2A D1=Q1A+Q1Q0+Q2A
-
D
0
=
A
D_0 = A
D0=A
- 输出方程组
-
Y
=
Q
2
A
+
Q
1
Q
0
A
Y=Q_2A+Q_1Q_0A
Y=Q2A+Q1Q0A
-
Y
=
Q
2
A
+
Q
1
Q
0
A
Y=Q_2A+Q_1Q_0A
Y=Q2A+Q1Q0A
- 激励方程组
(6)绘制逻辑图
- 3个D触发器
- D 2 = Q 1 Q 0 A ‾ D_2 = Q_1Q_0\overline{A} D2=Q1Q0A
- D 1 = Q 1 A + Q 1 ‾ Q 0 + Q 2 A D_1 = Q_1A+\overline{Q_1}Q_0+Q_2A D1=Q1A+Q1Q0+Q2A
- D 0 = A D_0 = A D0=A
- Y = Q 2 A + Q 1 Q 0 A Y=Q_2A+Q_1Q_0A Y=Q2A+Q1Q0A
- 已略去CP和Reset的连线
(7)检查自启动能力
- 3个D触发器,有8-5=3个无效状态 101,110,111
- 将3个无效状态,代入激励方程组,观察是否能够进入有效状态
- A=0时,101->010,Y=0,110->000,Y=0,111->100,Y=0
- A=1时,101->011,Y=0,110->011,Y=0,111->011,Y=0
- 结论,3个无效状态都可以进入有效。
6.4 异步时序逻辑电路分析
- 异步时序电路,没有统一的时钟。
- 各个存储电路不是同时更新
- 状态之间没有明确的分界线。
6.4.1 注意点
- (1)分析状态转换时,必须考虑各个触发器的时钟信号作用情况。
- 列出电路中各个触发器时钟信号的逻辑表达式
- 确定各个触发器的CP或者 C P ‾ \overline{CP} CP是否有时钟信号的作用。
- 时钟信号有作用, c p n = 1 cp_n=1 cpn=1
- 时钟信号没有作用, c p n = 0 cp_n=0 cpn=0
- (2)从输入信号影响的第一个触发器逐级向后确定状态的转换。
- 确定第一个触发器的输出状态,再去分析下一级触发器的时钟信号等等。
- 逐级分析。
- (3)每一次状态转换都有一定的时间延迟。
- 电路的各个触发器,从现态到次态转换需要一定的时间。在此期间,电路处于不确定状态。
- 只有全部触发器状态,转换完毕,电路才进入稳定状态。
- 异步时序电路的输入信号,必须等待电路进入稳定状态,输入信号才可以发生改变。否则会处在不确定的状态。
6.4.2 举例分析异步时序逻辑电路
例1 异步时序逻辑电路
- 下图
C
P
0
和
C
P
1
CP_0和CP_1
CP0和CP1未共用时钟源。属于异步时序电路。
(1)列出方程组
- 时钟信号, C P 0 = C L K , C P 1 = Q 0 CP_0=CLK,CP_1=Q_0 CP0=CLK,CP1=Q0
- 输出方程, Z = Q 1 Q 0 Z=Q_1Q_0 Z=Q1Q0
- 激励方程, D 0 = Q 0 ‾ , D 1 = Q 1 ‾ D_0=\overline{Q_0},D_1=\overline{Q_1} D0=Q0,D1=Q1
- 状态方程,
- 当 c p 0 = 1 cp_0=1 cp0=1时,时钟起作用, Q 0 n + 1 = Q 0 n ‾ Q_0^{n+1}=\overline{Q_0^n} Q0n+1=Q0n
- 当 c p 0 = 0 cp_0=0 cp0=0时,时钟不起作用, Q 0 n + 1 = Q 0 n Q_0^{n+1}=Q_0^n Q0n+1=Q0n
- 即 Q 0 n + 1 = c p 0 ‾ Q 0 n + c p 0 Q 0 n ‾ Q_0^{n+1}=\overline{cp_0}Q_0^n+cp_0\overline{Q_0^n} Q0n+1=cp0Q0n+cp0Q0n
- 同理, Q 1 n + 1 = c p 1 ‾ Q 1 n + c p 1 Q 1 n ‾ Q_1^{n+1}=\overline{cp_1}Q_1^n+cp_1\overline{Q_1^n} Q1n+1=cp1Q1n+cp1Q1n
(2)列出状态表
- 只有 Q 0 Q_0 Q0从0变到1,才有 c p 1 = 1 cp_1=1 cp1=1。
Q 1 n Q 0 n Q_1^nQ_0^n Q1nQ0n | c p 0 = C L K ( 始终起作用 ) cp_0=CLK \\ (始终起作用) cp0=CLK(始终起作用) | c p 1 = Q 0 n + 1 c p 1 = c p 0 ‾ Q 0 n + c p 0 Q 0 n ‾ c p 1 = Q 0 n ‾ cp_1=Q_0^{n+1}\\cp_1=\overline{cp_0}Q_0^n+cp_0\overline{Q_0^n}\\cp_1=\overline{Q_0^n} cp1=Q0n+1cp1=cp0Q0n+cp0Q0ncp1=Q0n | Q 1 n + 1 Q 0 n + 1 Q_1^{n+1}Q_0^{n+1} Q1n+1Q0n+1 | Z(现态) |
---|---|---|---|---|
00 | 1( Q 0 Q_0 Q0次态取反) | 1( Q 1 Q_1 Q1次态取反) | 11 | 0 |
01 | 1( Q 0 Q_0 Q0次态取反) | 0( Q 1 Q_1 Q1次态不变) | 00 | 0 |
10 | 1( Q 0 Q_0 Q0次态取反) | 1( Q 1 Q_1 Q1次态取反) | 01 | 0 |
11 | 1( Q 0 Q_0 Q0次态取反) | 0( Q 1 Q_1 Q1次态不变) | 10 | 1 |
(3)画出状态图
- 本电路,一个现态只有一种情况的次态。Z与现态有关,因而每种状态的输出Z都是固定的。可以将Z与
Q
1
Q
0
Q_1Q_0
Q1Q0放在状态圈里。
(4)列出时序图
- 由于两个D触发器的触发响应延迟,电路短时间会出现“不确定状态”。(如果使用74HCT74双D触发芯片,这个不确定状态的时间大概是40ns)
(5)功能分析
- 异步二进制减计数器,Z的上升沿作为“借位”信号。0->3->2->1->0->3->2->1…
- 序列信号发生器。输出Z序列脉冲信号,周期时4个CP周期,脉宽是1个CP周期。
例2 异步时序逻辑电路
-
T
′
触发器,
Q
n
+
1
=
Q
n
‾
T'触发器,Q^{n+1}=\overline{Q^n}
T′触发器,Qn+1=Qn,分析其功能。
(1)列出方程组
- 时钟信号
- C P 0 ‾ = Q 2 + C L K ‾ = Q 2 ‾ ⋅ C L K ‾ \overline{CP_0}=\overline{Q_2+CLK}=\overline{Q_2}·\overline{CLK} CP0=Q2+CLK=Q2⋅CLK
- C P 1 ‾ = Q 0 \overline{CP_1}=Q_0 CP1=Q0
- C P 2 ‾ = C L K + Q 0 ⋅ Q 1 + Q 2 ‾ ‾ = C L K ‾ ⋅ ( Q 0 ⋅ Q 1 + Q 2 ) \overline{CP_2}=\overline{CLK+\overline{Q_0·Q_1+Q_2}}=\overline{CLK}·(Q_0·Q_1+Q_2) CP2=CLK+Q0⋅Q1+Q2=CLK⋅(Q0⋅Q1+Q2)
- 输出方程, Q 2 , Q 1 , Q 0 Q_2,Q_1,Q_0 Q2,Q1,Q0
- 激励方程,无
- 状态方程,与前一个例子一样,需要考虑
C
P
‾
\overline{CP}
CP是否起作用。
- Q 0 n + 1 = c p 0 Q 0 ‾ + c p 0 ‾ Q 0 Q_0^{n+1}=cp_0\overline{Q_0}+\overline{cp_0}Q_0 Q0n+1=cp0Q0+cp0Q0
- Q 1 n + 1 = c p 1 Q 1 ‾ + c p 1 ‾ Q 1 Q_1^{n+1}=cp_1\overline{Q_1}+\overline{cp_1}Q_1 Q1n+1=cp1Q1+cp1Q1
- Q 2 n + 1 = c p 2 Q 2 ‾ + c p 2 ‾ Q 2 Q_2^{n+1}=cp_2\overline{Q_2}+\overline{cp_2}Q_2 Q2n+1=cp2Q2+cp2Q2
(2)列出状态表
- 在表格中加入 c p 0 , c p 1 , c p 2 cp_0,cp_1,cp_2 cp0,cp1,cp2
- c p n = 1 , 表示起作用(即出现下降沿) cp_n=1,表示起作用(即出现下降沿) cpn=1,表示起作用(即出现下降沿)
- 由 C P 0 ‾ = Q 2 + C L K ‾ = Q 2 ‾ ⋅ C L K ‾ \overline{CP_0}=\overline{Q_2+CLK}=\overline{Q_2}·\overline{CLK} CP0=Q2+CLK=Q2⋅CLK,可知 c p 0 cp_0 cp0直连时钟,但需要满足逻辑 Q 2 ‾ = 1 \overline{Q_2}=1 Q2=1才起作用。
- 由 C P 1 ‾ = Q 0 \overline{CP_1}=Q_0 CP1=Q0,可知 c p 0 cp_0 cp0是否起作用,需要 Q 0 Q_0 Q0产生一个下降沿
- 由 C P 2 ‾ = C L K + Q 0 ⋅ Q 1 + Q 2 ‾ ‾ = C L K ‾ ⋅ ( Q 0 ⋅ Q 1 + Q 2 ) \overline{CP_2}=\overline{CLK+\overline{Q_0·Q_1+Q_2}}=\overline{CLK}·(Q_0·Q_1+Q_2) CP2=CLK+Q0⋅Q1+Q2=CLK⋅(Q0⋅Q1+Q2),可知 c p 2 cp_2 cp2直连时钟,但需要满足逻辑 ( Q 0 ⋅ Q 1 + Q 2 ) = 1 (Q_0·Q_1+Q_2)=1 (Q0⋅Q1+Q2)=1才起作用。
现态 Q 2 n Q 1 n Q 0 n Q_2^nQ_1^nQ_0^n Q2nQ1nQ0n | c p 0 与 Q 2 n ‾ ⋅ C L K ‾ 有关 cp_0与\overline{Q_2^n}·\overline{CLK}有关 cp0与Q2n⋅CLK有关 | c p 1 与 Q 0 n 有关 Q 0 n + 1 从 1 − > 0 下降沿时起作用 cp_1与Q_0^n有关\\Q_0^{n+1}从1->0下降沿时起作用 cp1与Q0n有关Q0n+1从1−>0下降沿时起作用 | c p 2 与 C L K ‾ ⋅ ( Q 0 n ⋅ Q 1 n + Q 2 n ) 有关 cp_2与\overline{CLK}·(Q_0^n·Q_1^n+Q_2^n)有关 cp2与CLK⋅(Q0n⋅Q1n+Q2n)有关 | 次态 Q 2 n + 1 Q 1 n + 1 Q 0 n + 1 Q_2^{n+1}Q_1^{n+1}Q_0^{n+1} Q2n+1Q1n+1Q0n+1 |
---|---|---|---|---|
000 | 1( Q 0 Q_0 Q0翻转) | 0 | 0 | 001 |
001 | 1( Q 0 Q_0 Q0翻转) | 1 | 0 | 010 |
010 | 1( Q 0 Q_0 Q0翻转) | 0 | 0 | 011 |
011 | 1( Q 0 Q_0 Q0翻转) | 1 | 1 | 100 |
100 | 0 | 0 | 1 | 000 |
101 | 0 | 0 | 1 | 001 |
110 | 0 | 0 | 1 | 010 |
111 | 0 | 0 | 1 | 011 |
(3)列出状态图
- 经历一次CLK上升沿,
C
L
K
‾
\overline{CLK}
CLK的下降沿之后,无论电路处于什么状态,都会进入5个状态的单向循环。
(4)列出时序图
- 略
(5)功能分析
- 加计数器,0->1->2->3->4 ->0->1->…
6.5 时序逻辑集成电路
- 寄存器、移位寄存器、计数器。结合组合逻辑电路,可以构成极其复杂的数字系统。
- 中规模集成电路中,已经实现了较为成熟的寄存器、移位寄存器、计数器。
- 宏模块:具有较完善功能的中规模集成电路
6.5.1 寄存器和移位寄存器
1. 寄存器
- 寄存器:用来存储二进制数据的逻辑部件。1个触发器可以存储1位二进制数据。
- 典型寄存器芯片:74HC/HCT374(8个触发器构成的8位CMOS寄存器)
- 8个D触发器并联。
- 输出端使用了三态门
- 8位数据同步并行存储。
- 对比传输门控D锁存器构成的8位寄存器(5.2.2.4小节),功能基本一样。D锁存器构成的8位存储电路电路是电平敏感。D触发器(寄存器)构成的8位寄存器是脉冲边沿敏感。
- 根据数据刷新稳定的时间点在信号边沿前还是边沿后,决定选取D触发器(寄存器)还是D锁存器。
- 寄存器比锁存器具有更好的同步性能和抗干扰能力。
2. 移位寄存器
(1)基本移位寄存器
- 几个触发器级联,构成移位寄存器。
- 属于同步时序电路。在同一脉冲作用下,将二进制数据依次移位。
- 先送的数据,在经过4次移位后,会存到 Q 3 Q_3 Q3。
- 移位寄存器 只对 脉冲边沿敏感。(时钟高电平期间有一点的时间,这段时间内不能让输出跟随输入,因而只能使用触发器构成,不可以使用锁存器。)
- 典型移位寄存器芯片:74HC/HCT164
(2)双向移位寄存器
-
国家标准:逻辑图中数据的最低位LSB和最高有效位MSB,按照从上到下,从左到右排列。(与计算机程序中的左移右移不同)
- 双向移位寄存器电路右移:从低位触发器移向高位触发器
- 双向移位寄存器电路左右:从高位触发器移向低位触发器
-
并行置入与并行输出
- 原本只能一位一位的移入,增加了并行置入,可以一下将全部位值写入
- 原本只能一位一位的移出,增加了并行输出,可以一下将全部位值读出
-
具体逻辑电路图实现,见教材书籍page284页。
-
典型双向移位寄存器芯片:74HC/HCT194
- 2个选择输入端 S 1 S 0 S_1S_0 S1S0,同步控制(并行置数,左移,右移,保持不变)
- 2个串行数据输入端 D S R , D S L D_{SR},D_{SL} DSR,DSL
- 4个并行数据输入端 D I 0 , D I 1 , D I 2 , D I 3 DI_0,DI_1,DI_2,DI_3 DI0,DI1,DI2,DI3
- 4个并行输出端 Q 0 , Q 1 , Q 2 , Q 3 Q_0,Q_1,Q_2,Q_3 Q0,Q1,Q2,Q3
-
5个功能包括:
- 异步置0,输出被异步置0。 C R ‾ \overline{CR} CR
- 同步并行置数
- 左移(高到低)
- 右移(低到高)
- 保持不变
6.5.2 计数器
常见应用:
- 对脉冲进行计数
- 分频
- 定时
- 产生节拍脉冲
- 其他
1. 二进制计数器
(1)异步二进制计数器(纹波计数器)
- T ′ 触发器 T'触发器 T′触发器
- 前一级触发器经过依次1->0,才会有下一级的一次变化。这正模拟了二进制加计数的进位。
- 这里的分析过程,参考本文的6.4.2的例2。
- 如下时序图所示,低位(前一级触发器)的输出产生一次下降沿,为下一级高位(触发器)产生一个进位信号(触发时钟有效,触发器翻转)。
- 异步二进制计数器,逐级脉动翻转,被称为“纹波计数器”。像水波一样,一级一级,翻转周期变大。
- 缺点,纹波进位,需要一定的时间,且时间越来越大。要求 T C P > > N ∗ t p d T_CP>>N*t_{pd} TCP>>N∗tpd,否则会出错。因而加计数的速度受限。
- 典型异步二进制计数器:74HC/HCT393
(2)同步二进制加计数器
- 较高的计数速度。
- 利用组合逻辑电路,在脉冲作用前,提前准备好条件。
- 脉冲作用时,触发器应翻转则翻转,应保持则保持。
- 不存在纹波进位的时间累计。
- 逻辑图如下,分析过程略。可参考本文的6.2.2例1。
- CE是counter enable 计数使能端
- 典型同步二进制加计数器:74LVC161,支持并行置位,具体分析见教材page292。
- CEP和CET与运算,作为计数使能端。
- P E ‾ = 0 \overline{PE}=0 PE=0时,允许并行置值(初始值)。 P E ‾ = 1 \overline{PE}=1 PE=1时,从当前状态继续加计数功能。
- C R ‾ \overline{CR} CR,作为异步清零Clear。
- 当
Q
3
Q
2
Q
1
Q
0
=
1111
Q_3Q_2Q_1Q_0=1111
Q3Q2Q1Q0=1111且CET=1时,TC=1产生进位信号。
- 74LVC161构成模
2
16
2^{16}
216计数器
- 进位信号作为下一级的计数使能。
- 进位信号作为下一级的计数使能。
2. 非二进制计数器
(1)异步二-十计数器
- 参考6.4.2 例2,3个 T ′ 触发器 T'触发器 T′触发器构成的五进制加计数器。
- 增加一个触发器, 2 4 = 16 2^4=16 24=16,可用于制作一个十进制计数器。
- 具体分析,参考6.4.2的例2
(2)任意进制计数器
- 已知74LVC161是4个触发器,16种状态。本身就是一个4位的十六进制加计数器。
- 使用74LVC161构成9进制,即设法跳过9,a,b,c,d,e,f这7种状态,回到0。(0,1,2,3,4,5,6,7,8,0,1,2…)
【1】反馈清零法
【2】反馈置数法
- 使用Q3触发并行置位,计数到0x1000打开预置位,在下一个脉冲CP到来后,置数0x0000
- 或者使用进位信号触发置位,从7记到15的9进制
(3)环形计数器
【1】基本环形计数器
- 无需译码,直接输出四个状态。
- 不存在竞争冒险。
【2】扭环形计数器(约翰逊计数器) - 使用5位移位寄存器,构成10状态的扭环形计数器。
- 状态图
- 典型扭环形计数器:74HC/HCT4017
6.6 VerilogHDL 描述时序逻辑电路
- 使用数据流描述语句+行为级描述语句
6.6.1 移位寄存器的Verilog建模
(1)4位双向移位寄存器
-
使用行为级描述语句always,描述一个4位双向移位寄存器。(参考6.5多功能双向移位寄存器)
- 2个选择输入端 S 1 S 0 S_1S_0 S1S0,同步控制(并行置数,左移,右移,保持不变)
- 2个串行数据输入端 D S R , D S L D_{SR},D_{SL} DSR,DSL
- 4个并行数据输入端 D I 0 , D I 1 , D I 2 , D I 3 DI_0,DI_1,DI_2,DI_3 DI0,DI1,DI2,DI3
- 4个并行输出端 Q 0 , Q 1 , Q 2 , Q 3 Q_0,Q_1,Q_2,Q_3 Q0,Q1,Q2,Q3
-
5个功能包括:
- 异步置0,输出被异步置0。 C R ‾ \overline{CR} CR
- 同步并行置数
- 左移(高到低)
- 右移(低到高)
- 保持不变
module shift74x194(S1,S0,D,Dsl,Dsr,Q,CP,CR);
input S1,S0;//功能选择
input [3:0]D;//并行输入数据,用于置数
input Dsl,Dsr;//串行输入数据
input CP;//clock pulse
input CR;//clear output Q
//Q需要在always中赋值,应定义为寄存器(触发器)
output [3:0]Q;//输出数据
reg [3:0]Q;
always @ (posedge CP or negedge CR)//CR异步清0
//CR清零Q,拥有最高优先级。
if(~CR)
Q <= 4'b0000;
else
case({S1,S0})
2'b00: Q<=Q;//保持
2'b01: Q<={Q[2:0],Dsr};//电路右移,实际是二进制数据左移,Dsr补充为最低位。
2'b10: Q<={Dsl,Q[3:1]};//电路左移,实际是二进制数据右移,Dsl补充为最高位。
2'b11: Q<=D;//并行置值
endcase
endmodule
- 激励信号
module shift74x194_TB;
reg S1,S0,Dsl,Dsr,CP,CR;
reg [3:0]D;
wire [3:0]Q;
shift74x194 fun(S1,S0,D,Dsl,Dsr,Q,CP,CR);
initial
begin
CP=0;
S1=1;S0=1;D=4'b1010;
Dsl = 1;Dsr=0;
CR=1;
#24 S1=0;S0=1;//右移,数据左移
#34 S1=0;S0=0;//保持
#50 S1=1;S0=0;//左移,数据右移
#25 S1=0;S0=0;
#50 S1=1;S0=1;D=4'b1100;
#50 S1=0;S0=0;
#50 CR =0;
#50 $stop;
end
always #10 CP=~CP;
endmodule
- ModelSim仿真波形
6.6.2 计数器的Verilog建模
(1)同步二进制计数器
- 异步置零
- 并行置数
- 4位
- 类似于74LVC161的功能
- 使用assign语句描述组合电路中的(CEP&CET,与门产生的中间节点)CE
- 使用assign语句描述TC进位输出信号
module counter74x161(CEP,CET,PE,D,CP,CR,Q,TC);
//输入
input CEP,CET,PE,CP,CR;
input [3:0]D;
output TC;
//输出
output [3:0]Q; //
reg [3:0]Q; //寄存器(触发器)
//中间节点
wire CE;
//组合逻辑电路
assign CE = CEP&CET;
assign TC = CET&(Q==4'b1111);
//时序逻辑电路,触发器
always @(posedge CP or negedge CR)//异步清零
if(~CR)Q<=4'b0000;//异步清零的优先级最高
else if(~PE) Q<=D;//同步并行置数
else if(~CE) Q<=Q;//没有使能计数,Q不变
else Q<=Q+1'b1; //正常计数
endmodule
- 激励信号
module counter74x161_TB;
reg CEP,CET,PE,CP,CR;
reg [3:0]D;
wire TC;
wire [3:0]Q;
counter74x161 fun(CEP,CET,PE,D,CP,CR,Q,TC);
initial
begin
CP=0;
CEP=1;CET=1;D=4'b1010;
PE = 0;CR=0;
#24 CR=1;//结束复位
#34 PE=1;//停止并行置位
#100 CR=0;//复位
#100 CR=1;CEP=0;
#25 CEP=1;
#100 $stop;
end
always #10 CP=~CP;
endmodule
- 仿真时序图
(2)异步二进制计数器(纹波计数器)
-
4位异步二进制计数器
-
结构化描述,调用模块(带异步置零的D触发器)。
-
D触发器作为底层模块。参考第5章内容。
module D_FF(Q,D,CP,Rd);
output Q;
input D,CP,Rd;
reg Q;//寄存器(触发器)
always @ (negedge CP or negedge Rd)//异步清零
if(~Rd)Q<=1'b0;
else Q<=D;
endmodule
- 实现异步二进制计数器
//Ripple counter 纹波计数器
module ripplecounter(Q0,Q1,Q2,Q3,CP,CR);
output Q0,Q1,Q2,Q3;
input CP,CR;
D_FF FF0(Q0,~Q0,CP,~CR);
D_FF FF1(Q1,~Q1,Q0,~CR);
D_FF FF2(Q2,~Q2,Q1,~CR);
D_FF FF3(Q3,~Q3,Q2,~CR);
endmodule
- 激励信号
module ripplecounter_TB;
reg CP,CR;
wire Q0,Q1,Q2,Q3;
ripplecounter fun(Q0,Q1,Q2,Q3,CP,CR);
initial
begin
CP=0;
CR=1;
#20 CR=0;//复位
#200 CR=1;//复位
#25 CR=0;
#300 $stop;
end
always #10 CP=~CP;
endmodule
- 仿真波形图
(3)非二进制计数器
- 具有异步清零的同步十进制计数器
- CR变低电平时,计数器输出被清0
- CE=1,在CP上升沿作用,计数器在0->9之间循环计数
- CE=0,计数器不工作,保持原值。
module m10_counter(CE,CP,CR,Q);
input CE,CP,CR;
output [3:0]Q;
reg [3:0]Q;
always @ (posedge CP or negedge CR)
if(~CR)Q<=4'b0000;//清零
else if(CE)//计数器工作
begin
if(Q>=4'b1001) Q<=4'b0000;
else Q <= Q+1'b1;
end
else Q<=Q; //CE=0,计数器保持不变
endmodule
- 激励信号
module m10_counter_TB;
reg CE,CP,CR;
wire [3:0]Q;
m10_counter fun(CE,CP,CR,Q);
initial
begin
CP=0;
CR=1;
CE=1;
#20 CR=0;
#20 CR=1;
#300 CR=0;//复位
#20 CR=1;
#250 CE=0;
#300 $stop;
end
always #10 CP=~CP;
endmodule
- 仿真时序图
6.6.3 状态图的Verilog建模
- 使用Verilog语句,描述状态图。
- always语句,敏感信号和触发器
- case语句,状态切换。
(1)检测连续输入序列110(Mealy型)
- mealy箭头上有输出
- 本文6.3.2小节,例2,状态图如下所示
- 使用verilog语句描述状态图
- 保存电路状态的触发器,使用current_state、next_state进行定义。
- 使用 参数定义语句parameter定义 电路的 三种状态。S0 = 2’b00 ,S1 = 2’b01 ,S2 = 2’b11
- A是输入信号
- JK触发器,下降沿触发
module Mealy_sequence_detector(A,CP,CR,Y);
input A,CP,CR;
output Y;
reg Y;
reg[1:0] current_state,next_state;
parameter S0 = 2'b00,S1 = 2'b01,S2 = 2'b11;
//(1)边沿敏感事件,时序逻辑部分。同步状态变化(现态->次态) 或者异步清零
always @ (negedge CP or negedge CR)//异步清零
begin
if(~CR) current_state <= S0; //异步清零
else current_state <= next_state; //时钟下降沿,更新状态
end
//(2) 电平敏感事件,组和逻辑部分。事件更新 输出Y的值,次态的值。
always @ (current_state or A)//在mealy型电路中,输出Y实时跟随输入A变化
begin //次态next_state 和(输入A,现态current_state)有关
case(current_state)
S0: begin Y<=0; next_state<= (A==1)?S1:S0; end
S1: begin Y<=0; next_state<= (A==1)?S2:S0; end
S2: if(A==1) begin Y<=0; next_state <= S2; end
else begin Y<=1; next_state <= S0; end
default: begin Y<=0; next_state <= S0;end
endcase
end
endmodule
(2)穆尔型状态图(Moore型)
- 穆尔型:箭头上没有输出
- CP上升沿
module Moore_mdl(Data,Q,CP.CR);
input Data,CP,CR;
output [1:0]Q;
reg [1:0]state;
parameter S0=2'b00,S1=2'b01,S2=2'b10,S3=2'b11;
//(1)时序逻辑电路
always @ (posedge CP or negedge CR)//同步更新状态,异步清零
begin
if(~CP)state<=S0;
else
case(state)
S0:if(~Data)state <=S1;
S1:if(~Data)state <=S3;else state <= S2;
S2:if(~Data)state <=S3;
S3:if(~Data)state <=S0;
endcase
end
//(2)组和逻辑电路
assign Q=state;
endmodule
6.7 时序可编程逻辑器件
6.7.1 宏单元
- 时序可编程器件中的宏单元。
- 时序电路 = 组合电路 + 存储电路。
- 组合电路:PLD (与-或阵列),参考第4章4.5小节
- 存储电路:触发器
(1)基本宏单元Macrocell
- 基本宏单元Macrocell:在PLD器件的 与-或阵列 和 输出缓冲之间 增加 触发器电路,充当存储电路。
- 便于 组成 不同逻辑功能的 时序电路。
- 公共时钟CLK,同步刷新。
- 公共使能OE
- 时序PLD, 寄存器型PAL,集成了很多如上图所示的电路。
(2)输出逻辑宏单元OLMC
- GAL,CPLD,对基本宏单元进行了改进。
- 输出逻辑宏单元 output logic macrocell。
6.7.2 主要类型
(1)通用整列逻辑GAL
- 1000门以下。
- 继承了PLD的与-或结构。
- 输出端,基于输出逻辑宏单元OLMC。
- 输出功能,灵活,通用。
(2)复杂可编程逻辑器件CPLD
- 内部集成了多个逻辑单元块。每个逻辑快相当于一个通用整列逻辑GAL。
- 多个GAL之间 通过 共享可编程开关阵列 实现互连,信息交换。
- 每个GAL 都可与 IO模块 连接
- 部分CPLD 内部有 EEPROM,FIFO,RAM等。
(3)现场可编程门阵列FPGA
- FPGA的结构和GAL、CPLD有很大差别。
- 不受与-或阵列限制。
- 适合实现多级逻辑功能。
- 百万门以上。在一个FPGA上,可实现CPU+外围电路。
- SOC技术:软件系统+硬件系统=整个数字系统都在单个芯片上运行。