
简介这套组合电路设计实验资源面向数字逻辑课程与Vivado初学者提供基于非门和或非门实现3-10所述电路的完整工程方案既可完成实验二的任务也可延伸理解组合逻辑的设计与验证全流程。资源共58个文件压缩包仅500KB涵盖Vivado工程源码.v、.xpr、仿真波形库.wdf、.wdb、运行脚本.tcl、.bat、实验报告与任务书.docx、.pdf以及综合布局中间文件等类型覆盖设计输入、编译仿真到文档输出各阶段。已有872人学习下载实用价值较高。实验包内附任务书、工程和仿真报告可对照阅读从真值表、逻辑化简到门级实现的关键步骤并能直接导入Vivado运行仿真验证波形结合报告中的分析与截图适合课程实验、期末设计及自学参考。 第一次拿到这个实验题目的时候我盯着“仅使用非门和或非门实现 3-10 所述电路”这句话看了好一会儿。组合电路设计本身不稀奇稀奇的是限制条件不让你用与门不让你用或门只给两类门却要你把教材第三章的3-10电路功能完整搭出来。这感觉有点像只给你一把螺丝刀和一把钳子却要你组装整套家具——不是不可能的而是思路要先换过来。这篇把实验二从拿到题到跑通的完整过程整理出来包括设计思路、逻辑化简、门级电路变换、仿真验证和实物排错。我会以3-10这个题最常见的情况——交通灯故障检测电路为例把每一步怎么做讲透。就算你手里的3-10对应的是别的功能后面这套“真值表→卡诺图→德摩根变换→或非门金字塔”的流程也完全通用。适合正在被数字电路实验折磨的同学也适合想温习组合逻辑设计基础的工程师。1. 先说清楚这个实验到底在考什么1.1 只给两种门不是故意为难你很多同学第一次看到题目就抱怨明明实验室里有与门、有或门、有与非门为什么偏偏限制只能用非门和或非门我后来在工程实践里才慢慢想明白这种限制其实特别真实。芯片量产的时候不太可能为了一个逻辑功能专门定制好几种门电路更多时候是选一种通用门芯片把问题全解决。FPGA内部的查找表底层逻辑也是受限的不是你想要什么门就有什么门。老式TTL电路板上你经常能看到设计者只用一片74LS02二输入或非门加几个非门就解决了整块逻辑因为备料省、成本低、调试也简单。教学实验的这个限制本质上是提前让你适应真实的工程约束。理解了这一层你就会明白实验二重点训练的不是背公式而是两件事一是对逻辑代数和德摩根定律的熟练度能不能把一个看起来只能用与门或门实现的功能手到擒来地改造成或非门和友好形式二是对门电路物理特性的敏感度比如多余输入引脚怎么处理、两级门之间的信号延迟会不会造成毛刺这些在真连线时都是会真实遇到的问题。1.2 或非门凭什么能搭出一切逻辑这里要复习一个关键概念功能完备集。简单说只要有一套门电路能组合出与、或、非这三种基本逻辑就能实现任意组合逻辑。或非门单独看只能做“所有输入都为0时输出1”的判断但它和非门一搭配就厉害了。或非门后面再接一个非门就变成或门。至于与门根据德摩根定律A·B (A B)也就是说“与”运算可以通过两次取反加一次“或”来完成。既然或门和与门都能用“非门或非门”拼出来等于什么逻辑都能搭。所以题目把非门和或非门给你其实就是给你一把能开所有锁的钥匙关键在于你能不能把锁的内部结构看明白并且把你的逻辑表达式翻译成这把钥匙能直接开的锁孔。这一步就是整个实验二的灵魂。2. 拿到3-10电路从题目描述到真值表2.1 我用的3-10样例是什么功能不同教材、不同学校里的3-10题号对应的题目不一定一样。我按下述最常见的情况来讲设计一个监视交通信号灯工作状态的逻辑电路每一组信号灯由红、黄、绿三盏灯组成正常情况下任何时刻必须有且只有一盏灯亮其他状态都属于故障电路输出F置1报警正常时输出0。这个题非常经典变量不多但化简空间足够用来演示“仅用非门和或非门”的实现方法再合适不过。如果你手里的3-10是别的功能比如三人表决器、多路选择器或者奇偶校验器没关系换掉真值表就行后面流程照抄。做实验前一定要把题目里的边界条件问清楚。以交通灯为例是严格“只有一盏灯亮”才算正常还是允许黄灯单独闪烁有的教材里交通灯还有红黄同时亮作为过渡状态的设定。如果条件理解错真值表全错电路设计得再工整也是白搭。所以我拿到题目第一件事是在纸上把逻辑功能的理解写成一句话再跟老师或教材对一遍确认无误才开始列真值表。2.2 三变量真值表要列全不要凭感觉挑项这个电路有三个输入变量红灯R、黄灯Y、绿灯G输出为F。规范做法是把0到7共8个最小项全部列出来顺序按二进制递增000、001、010、011、100、101、110、111。不要一上来就凭感觉挑几行填那样容易漏项。完整真值表如下RYGF说明0001全灭故障0010绿灯亮正常0100黄灯亮正常0111黄绿同亮故障1000红灯亮正常1011红绿同亮故障1101红黄同亮故障1111全亮故障这里有个小细节我故意用R、Y、G而不是教材上常见的A、B、C是为了让每个输入和物理含义直接对应后面连线时不容易接错端口。实验报告里这样写老师看了也会觉得你思路清晰。2.3 先观察到F1的行比F0的行多数一下就知道8行里有5行输出1只有3行输出0。这种情况下直接从F1的项化简会有5个最小项卡诺图要画好几个圈稍微繁琐。而F0的正常状态只有3行分别是001、010、100。如果我们先求出F也就是“正常状态检测”的表达式再取反得到F往往简单很多。后面你会看到这种“反着做”的思路在受限门集设计里格外好用因为最后一步取反正好用上题目提供的非门。3. 逻辑化简卡诺图与德摩根联手3.1 从F出发写出正常状态表达式先写F。F1代表电路正常只有三种情况绿灯单独亮、黄灯单独亮、红灯单独亮。逐项写出来F RYG RYG RYG这里说明一下文中所有带着右上一撇的变量表示取反比如R就是红灯不亮的意思。这个式子已经是标准的与或式了每一项对应一个正常状态。直观看上去它比故障状态的表达式要短不少。3.2 卡诺图化简这一步实际很轻松虽然F已经比较简洁但为了走一遍标准流程还是画一下卡诺图。三变量卡诺图横排是R纵列按格雷码排Y、G00、01、11、10。正常状态的三个最小项在卡诺图里刚好是三个互不相邻的格子没法合并化简后就是上面写的那三项。换句话说F已经是最简与或式不需要再折腾。这里想提醒一点化简不是越复杂越显本事有时候最简形式一眼就看出来真正花功夫的是下一步形式变换。不要死盯着“继续化简”不放把时间留给后面对电路结构更关键的那一步。3.3 用德摩根定律把F变成F的或与式核心操作来了。F是故障输出数学上就是F的非所以对整个等式取反F (F) (RYG RYG RYG)对三个乘积项之和取反德摩根定律会把它展开成三项取反的乘积。具体展开一下F (RYG) \cdot (RYG) \cdot (RYG)然后再对每个乘积项做一次德摩根展开(RYG) R Y G(RYG) R Y G(RYG) R Y G所以最终得到F (R Y G) \cdot (R Y G) \cdot (R Y G)这个形式叫或与式也叫合取范式。你看里面只剩“或”和“取反”两种运算恰好是或非门和非门的强项。之所以费这么大劲变成或与式不是单纯为了好看是因为这样变换之后电路结构能直接映射到手头只有的两种门上。4. 核心环节用两级或非门搭出整个电路4.1 或非门在结构里的两个角色先看清等式结构和或非门之间的关系。或与式里包含三个或项A R Y GB R Y GC R Y G最终F等于这三个或项的与。单个或非门的输出恰好等于“所有输入相或之后取反”也就是说它天生擅长产生A、B、C这样的信号。而现在要的是三个或项相与直接做“与”不好办。于是再用一次德摩根定律F A \cdot B \cdot C (A B C)这个结构非常妙。A、B、C每个正好就是一个三输入或非门的输出而(A B C)又恰好是另一个三输入或非门的输出。所以只需要两个层级、四个三输入或非门就能把F完整实现中间一个与门都不用。这就是“门集受限”情况下逻辑代数发挥威力的地方。4.2 逐级拆解每个门的作用和接线下面是详细接线照着做就能搭出来第一级先处理反变量。三个输入R、Y、G分别经过三个非门得到R、Y、G。然后或非门U1输入接R、Y、G输出P (R Y G)。或非门U2输入接R、Y、G输出Q (R Y G)。或非门U3输入接R、Y、G输出S (R Y G)。第二级只需要一个或非门或非门U4输入接P、Q、S输出F (P Q S)。验证一下典型状态。绿灯单独亮时R0、Y0、G1P (000) 1Q (011) 0S (101) 0F (100) 0输出0正常符合预期。全灭时R0、Y0、G0P (001) 0Q (010) 0S (100) 0F (000) 1输出1故障报警也符合预期。这里面的设计心得值得多说一句第二级的那个或非门表面执行的是或非运算实际却承担了“与”的角色。为什么或非门能当与门用就是因为德摩根定律把(A B C)等价成了一个三者相与的形式。很多同学第一次看这个电路会奇怪第二级明明是或非门怎么就把三个条件“合”起来了其实就是这个道理。实验报告里把这一层逻辑写清楚老师基本能看出你是真理解了。4.3 门数统计、器件选型与二输入或非门的替代方案按上面的方案一共需要非门3个三输入或非门4个。实验室里最常见的或非门芯片是74LS02一片里有4个二输入或非门三输入或非门可以找74LS27。如果手头只有二输入或非门也能搭只是会费一些门。以三输入或项A R Y G为例如果只有二输入或非门可以这样实现第一步用第一个二输入或非门产生(RY)再接一个非门变成RY第二步把这个结果和G一起送进第二个二输入或非门输出就是(RYG)。每个三输入或项大约要消耗2个二输入或非门加1个非门总门数会多一些。做实验前先确认实验箱提供的是几输入或非门再决定连线方案不然到了现场发现门不够用会很被动。另外提一个实用小技巧如果实验室提供的非门数量不够或非门也可以当成非门用。把一个二输入或非门的两个输入端短接在一起对同一信号取或再取反结果就等于取反。74LS02里空余的或非门都可以这样应急这个操作在真实排线时经常能救急。5. 实操过程从仿真到实验箱连线5.1 建议先用仿真软件把逻辑跑通我自己做这个实验时第一步没有急着连线而是先在Multisim里把电路搭出来跑一遍。仿真的意义在于把“逻辑功能对不对”和“物理接线对不对”这两件事分开排查。把真值表8行全部输入一遍输出应当严格符合预期用逻辑分析仪看波形的话还能顺便确认有没有竞争冒险产生的毛刺。很多同学上了实验箱就直接接线结果连错一根线找半天找不出问题。其实仿真通过了再上手实物排错范围会小很多。仿真软件里用TTL芯片模型时记得把VCC和GND电源引脚接上。有些仿真环境即便不接电源也默认能跑但输出电平可能不符合TTL规范反而会误导你以为设计出错。5.2 实验箱连线顺序如果是在数字电路实验箱上操作建议按这个顺序先把三个输入变量R、Y、G接到逻辑电平开关上输出F接到LED指示灯。接三个非门把R、Y、G取反得到R、Y、G。如果非门不够用用或非门输入短接的方式替代。接第一级三个或非门U1、U2、U3按照4.2小节的输入组合把线插好。接第二级或非门U4输入接P、Q、S输出接LED。通电后拨动开关遍历8种组合逐一核对LED状态是否和真值表一致。这个顺序的原则是先局部后整体。每一步连完用万用表或逻辑笔看一眼关键节点电平避免到最后一步面对一大团线出了错完全不知道从哪里查起。实验箱上的线通常是不同颜色建议把电源线、输入线、输出线、中间信号线用不同颜色区分开会省很多事。5.3 常见问题与排查技巧实录下面这些坑有的是我自己踩的有的是帮同学排查时遇到的。第一输入引脚悬空。TTL芯片的输入端悬空时逻辑上经常被当作高电平但也可能因为外界干扰乱跳。如果G这根线没插紧或非门的输入悬空输出就可能完全不符合真值表。处理办法很简单把所有没用到的输入引脚统一处理把多出来的或非门输入端接地。测试时用万用表逐级测电平哪一级输出和预期不符就从那个门往回查。第二把或非门的输入和输出搞反。74LS02的引脚排列并不是输入连着输出顺着一排我第一次用的时候按顺序想当然结果输出恒为低电平查了好久才发现是引脚看错了。后来我养成一个习惯接线前先对照芯片手册把每个门的输入、输出、电源脚在纸上标清楚再动手。第三竞争冒险造成的毛刺信号。用两级或非门实现时不同输入信号到达第二级的时间不一样输出在翻转瞬间可能会出现很窄的尖峰脉冲。如果只是驱动LED指示灯这种毛刺肉眼看不见如果后面接计数器或者寄存器就可能误触发。实验课一般不会深入到这个层面但如果你用示波器观察波形确实能看到一些毛刺这时候可以在输出端并联一个小电容滤除属于很常规的操作手法。第四电源没有共地。如果用两台独立电源分别给芯片供电或者实验箱和信号发生器各自有接地但没共地会导致电平识别错乱。这类问题在实物调试里很隐蔽看起来一切正常但输出就是不对。排查时先量输入引脚的高低电平是否符合预期再判断是不是接地问题。第五也是最实用的一条一定要把中间节点的值也测出来。U1输出P、U2输出Q、U3输出S测试时记录这三根线的电平。理论上正常状态时P、Q、S中应该有两个是1、一个是0故障状态则三个都是0。如果某一行不满足这个规律问题就出在那个具体的或非门及其前级排错范围瞬间缩小。这个“分层定位”的思路做硬件调试时怎么强调都不为过。6. 做完实验二我留下这么几点体会6.1 化简不是数学游戏是工程决策做完实验之后我才意识到逻辑化简不单纯是纸面上的数学运算它直接决定了你的电路能不能用手头现有的器件搭出来。如果只会看着与或式去接与门和或门遇到题目只给非门和或非门就会寸步难行。相反一旦你熟悉了德摩根定律和与或式、或与式这两种标准形式之间的转换几乎所有组合逻辑都能靠一种通用门构造出来。后面学触发器、时序电路时这种“先分析结构再映射到可用器件”的思路还会反复出现早一点养成习惯没有坏处。6.2 如果你是第一次做这种实验不要急着追求门数最少。实验课上可靠和可读性远比省几个门重要。比如我这个方案用了四个三输入或非门有人可能会继续配凑、用二输入或非门把门数省下来但接线复杂度上去了调试也更费劲。优先选择结构规整、层级清晰、中间节点好观测的实现方式实验容易过报告也好写。最后再分享一个小技巧如果你手里的3-10对应的是别的功能别慌把真值表换掉卡诺图化简德摩根翻转或非门两级结构一套很快就能改出一个新电路。这套方法本身才是实验二真正想让你带走的东西。本文还有配套的精品资源点击获取