简介:这是一份面向数字逻辑课程初学者的 Vivado 组合电路设计实验包,围绕“仅使用非门和或非门实现 3-10 所述电路”的约束,完整演示组合逻辑电路从设计、仿真到验证的流程。包体约 500KB,内含 58 个文件:除 Vivado 工程文件(.xpr、.srcs、.sim)与 Verilog 源码(.v)外,还提供仿真波形、Tcl 与 bat 脚本等辅助文件,方便对照工程结构查看设计输入、仿真结果与生成文件。资源另附实验任务书 PDF 和实验报告 docx,便于理解题目要求和撰写报告。已有 872 人学习下载。读者可通过这份完整工程,掌握组合逻辑最小化实现、Vivado 工程组织、波形仿真与结果分析等关键技能,适合正在完成同类实验或准备复习考试的高校学生。
1. 项目概述与实验目标
数字电路实验做到第二个,题目就是《组合电路设计——仅使用非门和或非门实现 3-10 所述电路》。说实话,刚看到这个标题,我第一反应是奇怪:前面刚练过与非门,连反相器都能用两个与非门拼出来,为什么这次非要换成"非门+或非门"的组合?等我把 3-10 的真值表列出来、卡诺图圈完,才反应过来这个实验真正想练的不是"把电路搭通",而是从逻辑表达式到门级网表的转换能力,尤其是摩根定律在化简里的实际应用。
简单解释一下背景:组合电路是指输出只由当前输入决定、不依赖历史状态的电路,常见的有译码器、编码器、多路选择器、加法器等。3-10 这个编号是典型教材习题,通常是给一个三变量或四变量的逻辑函数,要求你用指定的门电路实现。我这里以最常见的三人多数表决电路为例,它的输出在三个输入中有两个或两个以上为 1 时为 1,否则为 0。你这个实验里 3-10 给的函数可能不完全一样,但只要手上有真值表或表达式,后面的转换流程完全可以照抄。
1.1 题目到底在考什么
我总结下来,这个实验核心考三件事。
第一,能不能根据需求列真值表并写出标准与或式。这是组合电路设计的基本功,输入输出关系定义不清楚,后面全白搭。
第二,能不能把与或式转化成"只允许用非门和或非门"的形式。这不是简单的代数拼凑,而是要理解逻辑门的完备性。或非门本身就是一个完备集,理论上只靠或非门就能实现任意组合逻辑,再加上非门只是让表达更直观。
第三,能不能把转换后的门级电路画清楚并实际验证。很多同学卡在表达式已经化简出来了,但不知道自己画出来的电路跟表达式到底对不对应。这一步需要你老老实实一列一列地检查每个门的输入输出。
1.2 为什么偏偏限定"非门+或非门"
每年都有学生问:为什么不用与非门?与非门不也是万能的吗?
原因在于,教学上要训练你"换个角度看问题"。与非门和或非门都自成一个完备集,但同一个逻辑函数,用与非门实现和用或非门实现,思路恰好是互补的。与非门适合直接处理"圈 1"得到的与或式,因为与非门天然实现了"与项取反后再取反";或非门则更适合处理"圈 0"得到的或与式,因为一个或非门输出的恰好是若干乘积项的"或非"结果。
限定了非门和或非门,就是在逼你去做一次完整的对偶转换:拿到最简与或式后,先求反函数的最简与或式,再整体取反。这个操作看起来绕,但恰恰是卡诺图圈的进阶用法,也是后面学时序电路、状态化简时经常要用到的技能。
2. 组合电路设计核心思路
2.1 从真值表到最简与或式
先说我用的三人多数表决电路。输入是 A、B、C,输出 Y。真值表如下:
| A | B | C | Y | | 0 | 0 | 0 | 0 | | 0 | 0 | 1 | 0 | | 0 | 1 | 0 | 0 | | 0 | 1 | 1 | 1 | | 1 | 0 | 0 | 0 | | 1 | 0 | 1 | 1 | | 1 | 1 | 0 | 1 | | 1 | 1 | 1 | 1 |
把 Y=1 的四个最小项写出来,得到:
Y = A'BC + AB'C + ABC' + ABC
用卡诺图化简,可以合并出:
Y = AB + BC + CA
这个结果很直观:任意两个输入为 1,输出就是 1。到这一步,很多同学觉得任务完成了一半,剩下就是找与门、或门接线。但题目规定不能用与门和或门,所以必须继续转换。
2.2 圈 0 法:把目标变成或非门友好的形式
关键操作来了。既然最终只能用或非门,那我就先看看反函数 Y' 长什么样。观察真值表,Y=0 的行有 4 个,也就是最小项 m0、m1、m2、m4。在卡诺图上圈这 4 个 0,可以得到:
Y' = A'B' + B'C' + C'A'
这个式子的每个项都是两个变量的反变量乘积,非常有意思。因为或非门的输出正好是输入"或"的反,比如:
NOR(A, B) = (A + B)' = A'B'
这意味着 A'B' 这个乘积项,直接用一个或非门就能生成,不需要额外加非门。
再把 Y' 整体取一次反,用或非门表示就是:
Y = (Y')' = (A'B' + B'C' + C'A')'
右边就是三个中间信号的或非。
2.3 摩根定律是这次转换的钥匙
整个转换过程用到最多的,就是摩根定律的两条形式:
(A + B)' = A'B'
(AB)' = A' + B'
好多初学者只会背公式,不会用。这里我给一个直观理解:一个或非门的输出,物理上就是"所有输入都取反后做与"。所以当你看到表达式中出现"反变量乘积项"时,第一反应就应该是"可以用一个或非门来实现",而不是老老实实先放非门、再放与门。
我在批改实验报告时发现,凡是没有先对反函数化简、直接对着原式硬转的同学,画出来的电路普遍多出至少四五个门,而且很容易出现层数过多导致的竞争冒险问题。先圈 0,再找反变量的乘积项,再整体或非,这套流程是这次实验最值钱的东西。
3. 实操过程:三人多数表决电路的门级实现
下面我把完整的实操过程走一遍,从卡诺图化简到门级连线,每一步都可以直接抄作业。
3.1 用卡诺图化简出 F 和 F'
先画三变量卡诺图,把 Y=1 的最小项填进去。圈 1 时会得到:
Y = AB + BC + CA
然后不要急着转换,先圈 0。填 1 和填 0 是同一张图,圈 0 得到的是 Y' 的最简与或式:
Y' = A'B' + B'C' + C'A'
这里要注意,三个乘积项两两之间是有重叠的,卡诺图化简后已经消掉了多余的变量,但它们仍然是这个反函数的最简形式。不要试图把圈 1 和圈 0 的结果合并化简,它们是同一个函数的两面,最后要用的是 Y'。
3.2 把表达式映射到或非门网络
现在开始映射。
第一级:生成三个中间量 P、Q、R。
- P = NOR(A, B) = A'B'
- Q = NOR(B, C) = B'C'
- R = NOR(C, A) = C'A'
第二级:把 P、Q、R 再做一次或非,输出最终结果。
- Y = NOR(P, Q, R) = (P + Q + R)'
代入后正好得到:
Y = (A'B' + B'C' + C'A')' = AB + BC + CA
这里你会发现,整个电路一共只需要 4 个或非门,不需要单独的非门。第一个或非门两个输入接 A 和 B,第二个接 B 和 C,第三个接 C 和 A,第四个把前三级的输出并到一起。如果你实验箱上的或非门是三输入四输入的,直接接线就行。
3.3 验证接线:逐行对真值表
接完线以后,一定不要急着交报告,先把八个输入组合逐行打一遍。我习惯按 000、001、010、011、100、101、110、111 的顺序检查。
重点看 000 这一组:三个输入都是 0,第一级三个或非门输出全部为 1,第四级或非门输入有三个 1,输出为 0,正确。再看 011 这一组:A=0,B=1,C=1,第一级 P=NOR(0,1)=0,Q=NOR(1,1)=0,R=NOR(1,0)=0,第四级输出 1,正确。
如果验证到某一组对不上,不要急着拆线。先用万用表或逻辑笔量第一级每个门的输出,确认是哪一级出了问题。大多数时候是导线松动,或者或非门输入接到了不该接的地方。
4. 常见问题与排查技巧实录
每次做这个实验,总有几个问题反复出现,我整理成一份速查表。
| 现象 | 可能原因 | 排查方向 |
|---|---|---|
| 输出恒为 0 | 最后一级或非门输入悬空,被误判为高电平 | 检查有未接的输入端是否接地 |
| 某一行输出不对 | 第一级或非门输入顺序接错 | 重新核对 A、B、C 对应管脚 |
| 波形出现毛刺 | 门电路级联层数过多,存在竞争冒险 | 检查是否绕了太多门,尝试化简 |
| 想用二输入或非门搭三输入或非 | 直接用两个或非门简单级联结果不对 | 见下方 4.3 的接法 |
4.1 化简不彻底导致门数爆炸
这个坑我在实验室见太多了。有些同学拿到表达式 Y = AB + BC + CA,不圈 0,而是直接试图把每个与项转换成或用非门。比如 AB 可以写成 NOR(A', B') 的形式,也就是先取反 A、取反 B,再用或非门。但下一步发现还需要把三项用或门合并,又没有或门,于是又去折腾一排或非门。
结果一个本来 4 个门就能解决的电路,硬生生画了 10 多个门。这不是能力问题,是方向问题。记住:用或非门实现组合逻辑时,默认第一步是圈 0,得到反函数的最简与或式,而不是顺着原函数圈 1 的思路走。
4.2 或非门怎么当非门用
实验中如果题目允许使用非门,直接用独立非门就行。但如果现场没有独立非门芯片,可以用或非门接成非门。方法很简单:把一个或非门的两个输入端短接,再接同一个信号 A,输出就是:
Y = (A + A)' = A'
这里要注意,短接后输入阻抗会降低,驱动能力会有所变化,但对于实验箱上的低速信号完全够用。如果手头有 4 输入或非门,也可以把多余输入全部接地,留下一个输入当非门用,效果一样。
4.3 三输入或非门只有二输入或非门怎么办
很多实验箱只有二输入或非门,但最后一集明明需要三输入或非。这时不能简单地级联,因为 NOR 门不满足"两个二输入级联等于三输入"的直觉。我给你的建议是:先把前两级信号分别做或非得到中间量 P、Q,再把 P、Q 分别取反得到 P'、Q',然后用二输入或非门:
R = NOR(P', Q') = P'Q'? 不对,等等,三输入或非的正确二输入门实现是:
P 和 Q 分别经过非门取反得到 P'、Q',再用二输入或非门得到 (P' + Q')' = PQ。这一步只是把前两级缩成了与关系,还得继续。
最稳的办法是直接换一块带三输入或非门的芯片,或者用两个或非门加一个非门拼出三输入或非:先让前两个信号经过或非得到中间变量 M,再把 M 取反,跟第三个信号接到同一个二输入或非门上,输出再取反。别嫌麻烦,这种展开本身就是对摩根定律的再一次练习。
5. 一点实验心得与扩展思路
我个人觉得,这个实验最有价值的不是最后的电路图,而是中间那段"圈 0 再整体取反"的转换过程。很多教材把卡诺图化简讲得很细,但对"化简之后怎么映射到指定门电路"往往一笔带过。真正上手设计组合电路时,门类型限制才是常态,因为最终项目里用哪个门、哪种工艺,通常是由芯片库存和成本决定的,不是你想用什么就有什么。
如果你做完了三人多数表决电路,建议给自己加一道题:用非门和或非门实现异或门。异或的表达式是 Y = A'B + AB',用圈 0 法会得到 Y' = A'B' + AB,实现时需要生成 A' 和 B' 两个反变量,正好能练到"什么时候必须引入非门"这个点。我当时做完之后又用全加器试了一次,整个思路清晰了很多,后面学加法器、比较器都是同一个套路。
最后分享一个小技巧:做实验前先把目标函数画成卡诺图,分别圈 1 和圈 0,把两个结果都写出来。圈 1 的结果用来理解逻辑含义,圈 0 的结果用来接或非门网络。两套表达式放在手边,接线的时候基本不用动脑子,验证的时候也快。这个小习惯我从学生时代用到现在,确实能省不少返工时间。
本文还有配套的精品资源,点击获取