考研数电·零基础讲义 · 第 17 讲(下)|同步时序电路设计实例与自启动检查
学完这一讲,你能独立完成一道同步时序电路设计题:从状态表出发,用卡诺图求状态方程,分别用 D 触发器和 JK 触发器写出驱动方程和输出方程、画出逻辑图,并检查能否自启动;不能自启动时,会通过修改无关项的取法把它改成能自启动。预计用时 110–140 分钟。
本讲地图#
- 后三步怎么做:卡诺图求状态方程(用好无关项)→ 按触发器类型求驱动方程 → 画逻辑图 → 检查自启动。
- 两种求驱动方程的方法:D 触发器直接"状态方程 = 驱动方程";JK 触发器可以"凑特性方程",也可以查激励表。
- 实例 1:"101"序列检测器(米利型、可重叠),D 和 JK 两个版本。
- 实例 2:同步六进制计数器(JK 触发器),带进位输出。
- 自启动的检查与修改:3 位扭环形计数器从"死循环"改到"能自启动";教材例 6.4.4、6.4.5 的思路。
- 华师怎么考:2026 回忆题第 7 题问"能否自启动",说明自启动是必考点;设计题则把整个流程走一遍。教材对应第 6 章 6.4.1、6.4.2 节。
前置知识#
- 设计前三步:逻辑抽象、状态化简、状态分配(见第 17 讲(上))。
- D、JK、T 触发器的特性方程(见第 13 讲(下)):Q∗=D;Q∗=JQ+KQ;Q∗=T⊕Q。
- 卡诺图化简、无关项(见第 04 讲(中)、第 04 讲(下))。
- 自启动的概念与检查方法(见第 14 讲)。
一、后三步的方法#
1.1 第四步:求状态方程#
编码完成后,状态转换表就变成了一张"真值表":输入是现态各位 + 外部输入,输出是次态各位 + 电路输出。对每一个次态位、每一个输出,各画一张卡诺图化简即可。
无关项:没用到的状态编码(以及不可能出现的输入组合)对应的格子填 ×。化简时 × 可以当 1 也可以当 0,用来把圈画大。
⚠️ 但要记住:你把 × 圈进去,就等于规定了那个无效状态的次态是 1;不圈,就规定为 0。 所以化简一结束,无效状态的去向就定了——这正是之后要检查自启动的原因。
1.2 第五步:由状态方程求驱动方程#
D 触发器:特性方程Q∗=D,所以
Di=Qi∗
(右边指Qi∗化简后的表达式。)状态方程化简完,驱动方程就有了,最省事。
JK 触发器,方法一:凑特性方程。 把每个Qi∗变形成
Qi∗=(⋯)Qi+(⋯)Qi
的形式,第一个括号就是Ji,第二个括号就是Ki。如果某一项里不含Qi也不含Qi,就乘上(Qi+Qi)拆开。
JK 触发器,方法二:查激励表(更不容易出错)。 激励表回答的是:"要让触发器从 Q 变到Q∗,J、K 应该是多少?"
| Q→Q∗ |
J |
K |
理由 |
| 0 → 0 |
0 |
× |
保持(J=K=0)或置 0(J=0,K=1)都行 |
| 0 → 1 |
1 |
× |
置 1(J=1,K=0)或翻转(J=K=1)都行 |
| 1 → 0 |
× |
1 |
置 0 或翻转都行 |
| 1 → 1 |
× |
0 |
保持或置 1 都行 |
规律:现态是 0 时只看 J(J = 次态),K 无关;现态是 1 时只看 K(K = 次态取反),J 无关。 把这个规则用到每一行,就能直接得到 J、K 的卡诺图(× 很多,化简后往往很简单)。
同理,T 触发器的激励表:Q与Q∗相同时 T=0,不同时 T=1,即T=Q⊕Q∗。
1.3 第六步:检查自启动#
把每个无效状态(以及每种输入)代入得到的方程,算出次态。只要每个无效状态都能直接或间接(经过别的无效状态)进入有效循环,电路就能自启动;有一个陷入"无效状态之间的循环"或停在原地,就不能自启动。
不能自启动时的两种解决办法(教材):
- 开机时通过预置数/复位把电路放到有效状态(例如给异步置零端加一个低电平);
- 修改逻辑设计:回到卡诺图,改变无关项的取法,让无效状态的次态落进有效循环(第四节详讲)。
二、实例 1:"101"序列检测器#
2.1 题目#
设计一个同步时序电路,串行输入 X,每当最近三位输入为 101 时输出 Y=1,否则 Y=0。允许重叠(例如 10101 中应检测到两次)。
2.2 第一步:逻辑抽象#
电路要记住"已经和 101 对上了几位":
- S0:还没对上(末尾既不是 1,也不是 10);
- S1:末尾是 1(对上了"1");
- S2:末尾是 10(对上了"10")。
逐个状态问"来 0 怎样、来 1 怎样":
- S0:来 1 → S1;来 0 → 仍S0。输出都是 0。
- S1:来 0 → 末尾变 10 → S2;来 1 → 末尾还是 1 → 留在S1。输出 0。
- S2:来 1 → 凑成 101,输出 1;而且这个 1 可以作为下一个 101 的开头(重叠),所以去S1。来 0 → 末尾是 100,什么都没对上 → S0,输出 0。
| 现态 |
X=0 |
X=1 |
| S0 |
S0/0 |
S1/0 |
| S1 |
S2/0 |
S1/0 |
| S2 |
S0/0 |
S1/1 |
2.3 第二步:状态化简#
S2在 X=1 时输出 1,其它状态都不会输出 1,所以S2与谁都不等价;S0和S1:X=0 时次态分别是S0、S2(S0和S2不等价),所以也不等价。已是最简,3 个状态。
2.4 第三步:状态分配#
M=3,取n=2。编码Q1Q0:S0=00,S1=01,S2=10;11不用(无关项)。
编码后的状态转换表("真值表"形式):
| Q1 |
Q0 |
X |
Q1∗ |
Q0∗ |
Y |
| 0 |
0 |
0 |
0 |
0 |
0 |
| 0 |
0 |
1 |
0 |
1 |
0 |
| 0 |
1 |
0 |
1 |
0 |
0 |
| 0 |
1 |
1 |
0 |
1 |
0 |
| 1 |
0 |
0 |
0 |
0 |
0 |
| 1 |
0 |
1 |
0 |
1 |
1 |
| 1 |
1 |
0 |
× |
× |
× |
| 1 |
1 |
1 |
× |
× |
× |
2.5 第四步:卡诺图化简求状态方程#
Q1∗:为 1 的只有Q1Q0X(第 3 行)。把无关项Q1Q0X圈进来,两格合并消去Q1:
Q1∗=Q0X
Q0∗:为 1 的是第 2、4、6 行,恰好是"X=1 的所有有效行";再借用无关项Q1Q0X,4 格(X=1 的整列)合并:
Q0∗=X
Y:为 1 的是第 6 行Q1Q0X,借用无关项Q1Q0X:
Y=Q1X
(以上三个式子都用 sympy 的 SOPform 带无关项求得,并与状态表逐行核对。)
2.6 第五步(D 触发器版):驱动方程与逻辑图#
D1=Q0X,D0=X,Y=Q1X
只需要一个反相器(得X)和两个两输入与门:
图 1:用 D 触发器实现的"101"检测器。D0直接接 X,D1=Q0X,Y=Q1X
用一个具体序列走一遍(Python 逐拍模拟):输入 X = 1,0,1,0,1,1,0,1,0,0,从 00 出发:
| 拍 |
现态Q1Q0 |
X |
Y |
次态 |
| 1 |
00 |
1 |
0 |
01 |
| 2 |
01 |
0 |
0 |
10 |
| 3 |
10 |
1 |
1 |
01 |
| 4 |
01 |
0 |
0 |
10 |
| 5 |
10 |
1 |
1 |
01 |
| 6 |
01 |
1 |
0 |
01 |
| 7 |
01 |
0 |
0 |
10 |
| 8 |
10 |
1 |
1 |
01 |
| 9 |
01 |
0 |
0 |
10 |
| 10 |
10 |
0 |
0 |
00 |
第 3、5、8 拍检测到 101(第 3、5 拍是重叠的"10101")。另外我用 1000 组随机序列与"直接判断最近三位是否为 101"对比,输出全部一致。
2.7 第六步:检查自启动(D 版)#
无效状态Q1Q0=11代入:
- X=0:Q1∗=Q0X=1,Q0∗=X=0 → 次态 10(有效,S2);
- X=1:Q1∗=0,Q0∗=1 → 次态 01(有效,S1)。此时Y=Q1X=1。
无论输入是什么,11 一拍之内就回到有效状态,能自启动。小瑕疵:在无效状态 11 且 X=1 时会误输出一次 Y=1,只可能发生在上电后的第一拍;如果介意,可开机复位到 00。
完整状态转换图如下(虚线是无效状态的去向):
图 2:"101"检测器完整状态转换图(D 触发器方案),红色虚线为无效状态 11 的转移
2.8 第五步(JK 触发器版):用激励表求驱动方程#
逐行套激励表规则(现态 0 看 J、现态 1 看 K):
| Q1Q0X |
Q1→Q1∗ |
J1 |
K1 |
Q0→Q0∗ |
J0 |
K0 |
| 000 |
0→0 |
0 |
× |
0→0 |
0 |
× |
| 001 |
0→0 |
0 |
× |
0→1 |
1 |
× |
| 010 |
0→1 |
1 |
× |
1→0 |
× |
1 |
| 011 |
0→0 |
0 |
× |
1→1 |
× |
0 |
| 100 |
1→0 |
× |
1 |
0→0 |
0 |
× |
| 101 |
1→0 |
× |
1 |
0→1 |
1 |
× |
| 11× |
— |
× |
× |
— |
× |
× |
化简(含无关项,sympy 核对):
J1=Q0X,K1=1,J0=X,K0=X
K1=1的意思是:Q1一旦为 1,下一拍一定回 0——确实,S2之后不是S0就是S1,Q1都是 0。J0=X、K0=X相当于"把 X 存进Q0",和 D 版的D0=X一致。
自启动(JK 版):11 代入,X=0 → Q1:K1=1置 0;Q0:J0=0,K0=1置 0 → 00。X=1 → Q1置 0;Q0:J0=1,K0=0置 1 → 01。都回到有效状态,能自启动(Python 核对)。
注意:同样的状态方程,用 JK 实现时无效状态的去向(X=0 时到 00)和 D 版(到 10)不一样——因为 JK 的激励表里多了许多 ×,化简时被取成了不同的值。所以换了触发器类型,自启动要重新检查。
2.9 变式:如果"不允许重叠"呢?#
题目若改成"不允许重叠"(已经用来组成一个 101 的位,不能再算进下一个 101),只有一处要改:S2来 1 输出 1 之后,这个 1 已经"用掉了",应该回S0而不是S1:
| 现态 |
X=0 |
X=1 |
| S0 |
S0/0 |
S1/0 |
| S1 |
S2/0 |
S1/0 |
| S2 |
S0/0 |
S0/1 |
编码不变,重新化简(sympy 核对):
D1=Q0X,D0=XQ1,Y=Q1X
和重叠版相比,只是D0多乘了一个Q1:在S2(Q1=1)时即使来 1,Q0也不置 1,于是回到 00。核对:输入 10101 时只在第 3 位输出 1(重叠版在第 3、5 位都输出 1);输入 101101 时在第 3、6 位输出 1。无效状态 11:X=0 → 10,X=1 → 00,同样能自启动。
启示:审题时一定要看清"是否允许重叠",它决定了检测成功后回到哪个状态。
三、实例 2:用 JK 触发器设计同步六进制计数器#
3.1 题目#
用 JK 触发器设计一个同步六进制加法计数器,按自然二进制 000~101 计数,计到 101 时进位输出 C=1。检查能否自启动。
3.2 前三步#
- 逻辑抽象:没有输入变量,只有输出 C,穆尔型;6 个状态S0∼S5依次循环,S5时 C=1。
- 状态化简:计数器的 6 个状态代表 6 种不同的已计数个数,不能化简。
- 状态分配:22<6≤23,取 3 个触发器Q2Q1Q0,S0∼S5编为 000~101;110、111 为无关项。
| Q2Q1Q0 |
Q2∗Q1∗Q0∗ |
C |
| 000 |
001 |
0 |
| 001 |
010 |
0 |
| 010 |
011 |
0 |
| 011 |
100 |
0 |
| 100 |
101 |
0 |
| 101 |
000 |
1 |
| 110 |
××× |
× |
| 111 |
××× |
× |
3.3 第四步:状态方程#
用卡诺图(含无关项)化简,sympy 核对:
Q2∗=Q1Q0+Q2Q0
Q1∗=Q1Q0+Q2Q1Q0
Q0∗=Q0
C=Q2Q0
(如果题目要求用 D 触发器,到这里就结束了:D2=Q2∗、D1=Q1∗、D0=Q0∗。)
3.4 第五步:驱动方程(凑特性方程法)#
- Q2∗=Q1Q0+Q2Q0:第一项不含Q2,乘(Q2+Q2)得Q1Q0Q2+Q1Q0Q2。于是
Q2∗=(Q1Q0)Q2+(Q0+Q1Q0)Q2
对照Q∗=JQ+KQ:J2=Q1Q0,K2=Q0+Q1Q0=Q0+Q1。如果直接取K2=Q0+Q1=Q0Q1也正确;但用激励表、借助无关项可以得到更简单的K2=Q0(检查:在有效状态中Q2=1时只有 100、101,此时Q1=0,两种写法结果相同)。
- 同理Q1∗=(Q2Q0)Q1+(Q0)Q1 → J1=Q2Q0,K1=Q0。
- Q0∗=Q0=1⋅Q0+0⋅Q0 → J0=1,K0=1。
最终(sympy 用激励表 + 无关项化简得到同样结果):
J2=Q1Q0, K2=Q0;J1=Q2Q0, K1=Q0;J0=K0=1
3.5 第六步:检查自启动#
把无效状态代入驱动方程,逐个触发器算(JK:J=K=0 保持,J=1,K=0 置 1,J=0,K=1 置 0,J=K=1 翻转):
- 110:J2=Q1Q0=0, K2=Q0=0 → Q2保持 1;J1=Q2Q0=0, K1=0 → Q1保持 1;Q0翻转为 1。次态 111。
- 111:J2=1,K2=1 → Q2翻为 0;J1=0,K1=1 → Q1置 0;Q0翻为 0。次态 000(有效)。
110→111→000,能自启动。Python 逐拍模拟:有效循环 000→001→010→011→100→101→000,无效状态 110→111→000,与手算一致。
3.6 逻辑图怎么画(文字版)#
按驱动方程连线即可,步骤是:
- 画 3 个 JK 触发器 FF0、FF1、FF2,CLK 端全部接同一个计数脉冲(同步)。
- FF0:J、K 都接高电平 1,每个脉冲翻转一次。
- FF1:J1接一个两输入与门,输入是Q2和Q0;K1直接接Q0。
- FF2:J2接一个两输入与门,输入是Q1和Q0;K2直接接Q0。
- 进位 C:再用一个两输入与门,输入Q2和Q0。
一共只要 3 个与门,比用 D 触发器(D2、D1都是两项与或式)省门。这说明:同一个状态表,用 JK 触发器往往能借助激励表里的 × 得到更简单的驱动方程;用 D 触发器的好处是思路最直接、不容易出错。考试时按题目指定的触发器做,没指定时选自己最有把握的。
3.7 顺带看一下教材例 6.4.1(十三进制)#
教材用同样的步骤设计了带进位的十三进制计数器(JK 触发器),得到J3=Q2Q1Q0,K3=Q2;J2=Q1Q0,K2=Q3Q1Q0;J1=K1=Q0;J0=Q3Q2,K0=1;C=Q3Q2。我把这组方程代入模拟:从 0000 出发 13 拍一循环;三个无效状态 1101、1110、1111 的次态分别是 0010、0010、0000,能自启动,与教材结论一致。
四、不能自启动怎么办:修改设计#
4.1 大白话#
化简时把 × 当 0 还是当 1,本来"随你";但这一选,就给无效状态指了一条路。如果指的路通向有效循环,皆大欢喜;如果通向另一个无效状态、并且绕成圈,电路一旦掉进去就永远出不来——这叫死循环(无效循环)。
当然,也可以不改逻辑,而是在开机时用复位信号把电路强行放到有效状态(例如教材的售饮料机例子,就是在异步置零端加低电平把电路置为 00)。但这种办法有一个隐患:工作中如果受到干扰跳进了无效状态,电路就再也回不来,只能再复位一次。所以题目要求"能自启动"时,应该修改设计。
修改的思路很直接:回到卡诺图,把那个无效状态对应的 × 改成某个确定的值,使它的次态落在有效循环里,再重新化简。
4.2 例题 3:3 位扭环形计数器的自启动修改#
题:用 D 触发器设计 3 位扭环形计数器,有效循环(Q1Q2Q3)为000→100→110→111→011→001→000,要求能自启动。为保持移位结构,规定D2=Q1、D3=Q2,只允许改D1。
第 1 步:先求最简设计。 6 个有效状态,010、101 为无关项。化简得:
D1=Q3,D2=Q1,D3=Q2
第 2 步:检查自启动。 次态是(D1,Q1,Q2):
- 010 → (0,0,1)=101;
- 101 → (1,1,0)=010。
010 和 101 互相转,形成死循环,不能自启动。
图 3:左为最简设计(010、101 死循环);右为修改 D1 后,两者都回到有效循环
第 3 步:修改。 010 的次态是(D1,0,1):若令D1=0,次态就是 001——有效!所以在D1的卡诺图里,把 010 对应的格子从 × 改为 0,101 仍保留 ×,重新化简(sympy 核对):
D1=Q1Q3+Q2Q3=Q3(Q1+Q2)
第 4 步:再检查。
- 010:D1=0⋅(0+1)=0 → 次态 001(有效);
- 101:D1=1⋅(⋯)=0 → 次态 010 → 再下一拍 001(有效)。
而 6 个有效状态的次态不变(Python 逐拍核对,有效循环保持 000→100→110→111→011→001)。现在能自启动了。 101 是"间接"回到有效循环的,这也是允许的。
4.3 教材两个例子的思路(了解)#
- 例 6.4.4 七进制计数器:唯一的无效状态 000,最简化简时 × 全取 0,结果 000 的次态还是 000(停在原地),不能自启动。把 000 的次态指定为有效状态 010,修改后Q2∗=Q1+Q2Q3,就能自启动了。教材指出:指定为其它任何一个有效状态也行,选哪个看哪种方程最简单。
- 例 6.4.5 3 位环形计数器(100→010→001):最简设计Q1∗=Q3不能自启动;只修改第一位,得Q1∗=Q1Q2,即D1=Q1+Q2,能自启动(我用 Python 代入 5 个无效状态,全部最多两拍回到有效循环)。
4.4 设计题答题模板#
- 逻辑抽象:说明输入、输出变量及取值含义,定义各状态,画原始状态图/表。
- 状态化简:指出等价状态(或说明已最简)。
- 状态分配:写出n及编码表。
- 求方程:画次态/输出卡诺图(无关项标 ×),写状态方程;按触发器类型写驱动方程;写输出方程。
- 画逻辑图。
- 检查自启动:逐个代入无效状态,画完整状态转换图,下结论;不能自启动则修改。
五、常见失分点 ⚠️#
- 状态图漏画转移:每个状态对每种输入都要有一条箭头。米利型 3 个状态、1 个输入,应有 6 条箭头(自循环也算)。
- 卡诺图变量顺序写乱:次态卡诺图的行列标注要和真值表一致,格雷码顺序(00、01、11、10)不能写成 00、01、10、11。
- 无关项用了却忘了检查自启动:只要化简时用到了 ×,就必须把无效状态代回去验算,并在完整状态图上画出来。
- JK 驱动方程凑错:凑Q∗=JQ+KQ时,第二个括号是K而不是 K,要再取一次反。拿不准就改用激励表。
- "能自启动"只说结论:要写出每个无效状态的次态(或画出完整状态图)作为依据,否则会扣分。
- 重叠与不重叠没区分:序列检测器检测成功后回到哪个状态,取决于题目是否允许重叠。
- 输出方程忘了写:米利型输出与输入有关(如Y=Q1X),穆尔型输出只与状态有关(如C=Q2Q0),都要单独写出来并画进逻辑图。
速记卡#
| 项目 |
要点 |
| D 触发器 |
Di=Qi∗ |
| JK 激励表 |
0→0:J=0,K=×;0→1:J=1,K=×;1→0:J=×,K=1;1→1:J=×,K=0 |
| JK 凑形式 |
Q∗=( J )Q+( K )Q |
| T 触发器 |
T=Q⊕Q∗ |
| 101 检测器(D) |
D1=Q0X,D0=X,Y=Q1X,能自启动 |
| 101 检测器(JK) |
J1=Q0X,K1=1;J0=X,K0=X |
| 六进制(JK) |
J2=Q1Q0,K2=Q0;J1=Q2Q0,K1=Q0;J0=K0=1;C=Q2Q0;110→111→000 |
| 自启动判据 |
每个无效状态直接或间接进入有效循环 |
| 修改方法 |
把无效状态的 × 改成使次态有效的值,重新化简 |
| 注意 |
换触发器类型或改化简方式后,自启动要重新查 |
自测练习#
1. 填空:JK 触发器要从 1 变为 0,J=,K=;要从 0 保持 0,J=,K=。
答案与提示
1→0:J=×,K=1;0→0:J=0,K=×。
2. 用 D 触发器设计同步五进制加法计数器(000~100 自然二进制)。写出驱动方程,并检查能否自启动。
答案与提示
无关项 101、110、111。化简得D2=Q1Q0,D1=Q1⊕Q0(即Q1Q0+Q1Q0),D0=Q2Q0。无效状态:101→010,110→010,111→100,都进入有效循环,能自启动(Python 核对)。
3. 教材十三进制计数器(例 6.4.1)的三个无效状态 1101、1110、1111 的次态分别是什么?能否自启动?
答案与提示
分别为 0010、0010、0000,都是有效状态,能自启动(代入 JK 驱动方程模拟核对)。
4. 3 位环形计数器有效循环100→010→001(Q1Q2Q3),若取D1=Q3、D2=Q1、D3=Q2,能否自启动?若改为D1=Q1+Q2呢?
答案与提示
D1=Q3时:000→000(停在原地),011→101→110→011(无效循环),111→111,不能自启动。改为D1=Q1+Q2后:000→100,011→001,101→010,110→011→001,111→011→001,全部回到有效循环,能自启动(Python 核对)。
5. 第 17 讲(上)例题 1 "连续三个及以上 1 输出 1"的检测器,化简后S0=00,S1=01,S2=10,用 D 触发器实现。写出驱动方程和输出方程,并检查无效状态 11。
答案与提示
D1=XQ1+XQ0,D0=XQ1Q0,Y=XQ1(与教材式 6.4.8、6.4.9 一致)。11 代入:X=0 → 00;X=1 → 10。能自启动。1000 组随机序列核对正确。
6.(华师设计题风格) 用 JK 触发器设计"101"序列检测器(允许重叠),要求:(1) 画状态转换图;(2) 写驱动方程和输出方程;(3) 检查自启动。
答案与提示
(1) 状态图见图 2(有效部分):S01/0S1,S10/0S2,S21/1S1,S20/0S0,S0来 0、S1来 1 自循环。
(2) 编码S0=00,S1=01,S2=10:J1=Q0X,K1=1;J0=X,K0=X;Y=Q1X。
(3) 无效状态 11:X=0 → 00,X=1 → 01,能自启动(X=1 时会误输出一次 Y=1,可开机复位避免)。
下一讲预告#
时序逻辑部分到这里就告一段落。第 18 讲进入"脉冲波形的产生和整形",从施密特触发电路讲起:它为什么有两个阈值、回差有什么用。
评论
还没有评论。 来写第一条。