尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

组合逻辑电路实战:从真值表到电路图的设计与分析全流程

组合逻辑电路实战:从真值表到电路图的设计与分析全流程 1. 项目概述从“黑盒”到“白盒”的思维转变干了十几年硬件设计从最初的懵懂小白到如今能独立负责复杂系统我越来越觉得组合逻辑电路是整个数字世界的基石。很多人觉得这玩意儿太基础不就是几个与门、或门、非门搭一搭吗教科书上公式一堆考试背一背就完事了。但真到了实际项目里比如设计一个按键防抖模块、一个七段数码管译码器或者一个简单的数据选择器你会发现从“知道”到“会做”再到“做优”中间隔着十万八千里。组合逻辑电路的分析与设计本质上是一种思维训练它要求你把一个模糊的功能需求翻译成一张清晰、无歧义、且最优的“门级”施工图。这个过程就像你拿到一个只有输入输出描述的“黑盒子”你的任务是通过分析揭开它的内部结构分析或者反过来根据一份功能说明书亲手把这个盒子造出来设计。无论是分析还是设计核心目标都是一致的用最合理的成本门电路数量、连线复杂度、功耗实现最可靠的逻辑功能。今天我就结合自己踩过的坑和总结的经验把组合逻辑电路从分析到设计的完整流程掰开揉碎了讲清楚。无论你是电子相关专业的学生还是刚入行的硬件工程师这篇文章都能帮你建立起一套扎实、可落地的实战方法。2. 核心概念与逻辑代数基础你的设计语言在动手画任何一个电路之前我们必须先统一“语言”。数字电路不说“大概、可能、也许”它只认“0”和“1”。而描述“0”、“1”之间关系的数学工具就是逻辑代数布尔代数。别被“代数”吓到它比高中数学的方程要简单直接得多。2.1 基本逻辑运算三种原子操作所有复杂的组合逻辑电路都是由三种最基本的逻辑门组合而成与AND、或OR、非NOT。你必须像熟悉加减乘除一样熟悉它们。与门AND逻辑乘。所有输入都为1时输出才为1。可以理解为“串联开关”所有开关都闭合灯才亮。它的运算规则是“有0出0全1出1”。在逻辑表达式中用“·”表示有时也省略。例如F A · B 或 F AB。或门OR逻辑加。至少有一个输入为1时输出就为1。可以理解为“并联开关”任意一个开关闭合灯就亮。规则是“有1出1全0出0”。表达式中用“”表示。例如F A B。非门NOT取反。输出总是与输入相反。输入1则输出0输入0则输出1。表达式中用变量上加一横如Ā或加一个撇如A表示。注意这里的“加”和“乘”是逻辑概念不是算术概念。11在逻辑代数里等于1因为“有1出1”而不是算术里的2。这是新手最容易混淆的点之一。2.2 真值表功能的唯一身份证真值表是描述组合逻辑功能最根本、最无歧义的方式。它穷举了所有可能的输入组合并列出对应的输出值。对于一个有n个输入的电路其真值表就有 2^n 行。在设计时我们根据需求先列出真值表在分析时我们通过电路推导出真值表来理解其功能。例如一个2输入与门的真值表ABF0000101001112.3 逻辑函数的标准形式从真值表到表达式有了真值表我们需要把它转化为代数表达式才能进行化简和电路实现。有两种标准形式最小项之和SOP, Sum of Products也叫“积之和”式。先看真值表中输出为1的那些行每一行对应一个“最小项”。最小项是所有输入变量以原变量或反变量形式的与乘组合。然后把所有使输出为1的最小项或加起来。如何写对于输入变量取值为1的写原变量如A取值为0的写反变量如Ā。例如上面真值表中只有最后一行A1, B1输出F1对应的最小项就是 A·B。所以 F AB。最大项之积POS, Product of Sums也叫“和之积”式。先看真值表中输出为0的那些行每一行对应一个“最大项”。最大项是所有输入变量以原变量或反变量形式的或加组合。然后把所有使输出为0的最大项与乘起来。如何写对于输入变量取值为0的写原变量取值为1的写反变量。例如上面真值表中前三行输出F0。第一行A0,B0对应最大项 (AB)第二行A0,B1对应 (AB); 第三行对应 (AB)。所以 F (AB)(AB)(AB)。实操心得在绝大多数情况下我们使用SOP形式因为它更直观而且直接对应着一种非常常用的电路结构——“与或”结构先一级与门后一级或门。很多可编程逻辑器件如PAL、GAL和EDA软件的优化也默认基于SOP。POS形式在某些特定化简场景下可能更简单但初期可以主要掌握SOP。2.4 卡诺图图形化化简的神器从真值表直接写出的逻辑表达式往往不是最简的这意味着电路会用到多余的门成本高、功耗大、可靠性还可能下降。化简逻辑表达式是设计的核心环节。除了公式法卡诺图Karnaugh Map是工程师必备的图形化简工具特别适合处理4变量及以下的问题直观且不易出错。卡诺图实际上是真值表的重新排列相邻的格子在逻辑上也是“相邻”的即只有一个变量不同。化简规则就是圈“1”对于SOP将真值表中输出为1的项填入卡诺图对应位置。画圈包围相邻的“1”圈越大越好2, 4, 8...个“1”。每个圈对应一个简化的“与”项圈内取值不变的变量保留值为1写原变量值为0写反变量变化了的变量消去。将所有圈对应的“与”项“或”起来就得到最简SOP表达式。例如一个三变量函数真值表显示输出F在以下输入组合时为1ĀBC,ABC, ABC, ABC。将其填入卡诺图并画圈可以很容易化简为 F AC BC。这比原始的四个最小项相加要简洁得多。3. 组合逻辑电路的分析流程逆向工程分析就是给你一个现成的电路图让你搞清楚它是干什么的。这是一个“由电路到功能”的逆向过程。标准流程如下我习惯称之为“四步法”3.1 第一步逐级写出逻辑表达式从电路的输入级开始沿着信号流向逐级写出每个门输出端的逻辑表达式。不要跳步一步一步来用括号清晰地标明运算顺序。这一步需要扎实的逻辑门符号识别能力和表达式书写能力。示例假设你看到一个电路输入A、B先经过一个与非门其输出又和另一个输入C一起进入一个或非门...你就需要像这样写设第一个与非门输出为 X (AB) 注意与非门是先与后非然后最终输出 F (X C)。3.2 第二步化简与变换表达式直接写出的表达式可能很复杂不利于理解。利用逻辑代数公式如德摩根定律、吸收律等或卡诺图对其进行化简和变换得到一个最简且易于理解的表达式。德摩根定律尤其重要(AB) A B(AB) AB。它常用于处理与非、或非门。3.3 第三步列出真值表根据化简后的逻辑表达式列出所有输入组合下的输出值形成真值表。这是将代数语言翻译成功能描述的关键一步。对于n个输入老老实实列出2^n行不要偷懒。3.4 第四步功能说明与电路评价观察真值表用自然语言描述这个电路实现了什么功能。例如“这是一个三输入的表决器当至少两个输入为1时输出为1”。更进一步你可以评价这个电路它是否是最简的有没有潜在的竞争冒险风险这个后面会讲如果让你来设计有没有更好的方案避坑技巧分析复杂电路时如果中间信号太多容易乱可以在电路图上用彩笔标出关键节点的表达式。另外对于由大量标准模块如译码器、数据选择器构成的电路不要傻傻地从门级开始分析先识别出这些模块从模块的功能入手进行系统级分析效率会高得多。4. 组合逻辑电路的设计流程从需求到实现设计是分析的逆过程也是工程师的核心工作。流程可以概括为“需求 - 真值表 - 表达式 - 化简 - 电路图 - 验证”。我们通过一个完整的设计案例来贯穿讲解。设计案例设计一个“故障报警指示电路”需求一个系统有3个故障传感器A、B、C。当仅有一个传感器报警输出1时认为是轻微故障点亮黄色指示灯Y当两个或以上传感器报警时认为是严重故障点亮红色指示灯R无报警时指示灯全灭。4.1 第一步逻辑抽象与定义变量这是把模糊的工程问题转化为数学问题的关键一步很多新手在这里就会出错。确定输入变量及其含义显然三个传感器信号就是输入。我们定义A, B, C 1 表示对应传感器报警 0 表示正常。确定输出变量及其含义有两个指示信号。定义Y 1 点亮黄灯轻微故障R 1 点亮红灯严重故障。注意Y和R是两个独立的输出这是一个多输出组合逻辑电路。而且根据描述Y和R不可能同时为1因为“仅有一个”和“两个或以上”是互斥的但可以同时为0无报警。4.2 第二步列出真值表根据文字描述严谨地列出所有8种输入组合下Y和R的值。这一步必须100%准确否则后面全错。ABCY (轻微故障)R (严重故障)说明00000无报警00110仅C报警01010仅B报警01101B,C报警两个10010仅A报警10101A,C报警两个11001A,B报警两个11101A,B,C报警三个注意事项列出真值表后一定要回头对照需求检查一遍尤其是边界条件。比如三个都报警时属于“两个或以上”所以R1Y0这符合需求。确保没有矛盾或遗漏。4.3 第三步根据真值表写出逻辑表达式未化简我们分别写出Y和R的SOP表达式。对于Y黄灯输出为1的行是第2、3、5行。第2行Ā·B·C第3行Ā·B·C第5行A·B·C所以Y ĀBC ABC ABC对于R红灯输出为1的行是第4、6、7、8行。第4行Ā·B·C第6行A·B·C第7行A·B·C第8行A·B·C所以R ĀBC ABC ABC ABC4.4 第四步逻辑化简使用卡诺图对Y和R分别进行化简。Y的卡诺图化简画出三变量卡诺图在ĀBC,ABC, ABC位置填1。画圈后发现这三个1没有相邻的都不挨着无法合并。所以Y已经是最简表达式Y ĀBC AB C ABC。这意味著实现Y需要3个三输入与门和1个三输入或门。R的卡诺图化简在ĀBC, ABC, ABC, ABC位置填1。可以画出一个大圈包围ABC, ABC, ABC,ĀBC仔细看这四个角并不都相邻。实际上可以画出两个圈一个圈包围 ABC 和 ABC消去B得到 AC另一个圈包围 ABC和 ABC消去C得到 AB第三个圈包围ĀBC 和 ABC消去A得到 BC。但注意ABC被重复圈了三次这在卡诺图化简中是允许的称为“重叠律”。因此R AB AC BC。化简结果解读R AB AC BC。这个表达式非常优美它的含义是任意两个输入同时为1则R为1。这完美对应了“两个或以上”的需求。实现它只需要3个两输入与门和1个三输入或门比原来的4个三输入与门简化了很多。4.5 第五步画出逻辑电路图根据化简后的表达式选择门电路类型进行实现。通常我们使用“与门”和“或门”来实现SOP表达式。方案一使用基本与门、或门对于 Y需要3个三输入与门和1个三输入或门。对于 R需要3个两输入与门和1个三输入或门。画出电路图注意两个输出共享了输入A、B、C。方案二使用与非门实现推荐在实际芯片选型中与非门NAND和或非门NOR更为常见因为它们在集成电路中性能更优、结构更简单。我们可以将SOP表达式通过“两次取反”和“德摩根定律”全部用与非门实现。以 R AB AC BC 为例。对R进行两次取反不改变其值R ( (AB AC BC) )。对内部的(AB AC BC)运用德摩根定律(AB AC BC) (AB) · (AC) · (BC)。所以R ( (AB) · (AC) · (BC) )。看这个表达式(AB),(AC),(BC)是三个两输入与非门的输出它们再连接到一个三输入与非门就得到了R。最终电路只需要4个与非门3个两输入1个三输入即可实现R。这种方法称为“与非-与非”结构在工程中极为常用。实操心得在绘制电路图时务必保证图纸清晰、符号标准、连线整齐。使用EDA软件如KiCad、Eagle、Altium Designer的符号库。对于稍复杂的电路在关键节点标注网络名Net Label会极大方便后续检查和调试。另外优先考虑使用“与非门”或“或非门”这种通用性强的单一门类型来实现整个电路这能简化物料清单BOM提高电路的一致性。4.6 第六步验证与仿真设计完成后绝不能直接投板生产必须进行验证。手工验证将你设计的电路图按照分析流程再推导一遍它的真值表看是否与设计需求完全一致。检查所有输入组合。软件仿真这是现代设计的标准流程。使用仿真工具如Logisim、Multisim、ModelSim或FPGA开发工具自带的仿真器搭建电路输入测试向量就是所有可能的输入组合观察输出波形是否与预期真值表一致。仿真可以帮你发现设计阶段难以察觉的时序问题比如竞争冒险。5. 竞争与冒险理论完美之外的现实陷阱前面我们讨论的都是逻辑功能的静态正确性。但在真实的物理世界中信号通过门电路时有延迟这可能导致一种动态错误——竞争冒险Race Hazard。5.1 什么是竞争冒险当一个逻辑门的两个输入信号同时向相反方向变化且变化路径不同延迟不同时在输出端可能产生一个不应有的、短暂的尖峰脉冲毛刺这种现象称为竞争冒险。典型场景考虑一个简单电路 F A A。从逻辑代数看无论A是0还是1F恒等于1。但实际中非门有延迟。当A从0跳变到1时A本身变为1而A经过非门要稍后才从1变为0。在这个短暂的瞬间A和A同时为1于是经过或门F会出现一个短暂的“1 - 0 - 1”的毛刺因为瞬间A1A1或门输出1然后A变为0但A还是1输出保持1。这个毛刺就是冒险。5.2 如何判断竞争冒险在卡诺图上如果两个合并圈蕴含项是相邻但不相交的那么当输入变量在它们之间变化时就可能发生冒险。例如函数 F AB AC。当BC1时F A A这就构成了上述的冒险条件。5.3 如何消除竞争冒险增加冗余项这是逻辑设计层面的方法。在卡诺图上将两个相邻但不相交的圈“桥接”起来增加一个额外的乘积项。对于 F AB AC当BC1时增加冗余项 BC。因为当BC1时BC1无论A如何变化F都被BC拉高为1从而消除了毛刺。此时函数变为 F AB AC BC。注意这个BC项在逻辑化简时是冗余的但为了消除冒险必须保留。输出端接滤波电容在硬件层面在容易产生毛刺的输出端对地接一个小电容如几十皮法可以吸收掉高频的窄毛刺。但缺点是会降低电路的工作速度增加输出波形的上升/下降时间。引入选通脉冲在电路稳定后用一个选通脉冲时钟去采样输出避开毛刺出现的危险时段。这已经涉及到时序电路的思想了。避坑技巧对于高速数字电路竞争冒险是必须严肃对待的问题。一个毛刺可能被后续的触发器误采样导致系统状态错误。在完成逻辑设计后一定要用仿真工具进行时序仿真而不仅仅是功能仿真加入门电路的延迟模型观察输出波形中是否存在毛刺。这是专业设计和业余爱好的一个重要分水岭。6. 中规模集成电路MSI的应用站在巨人的肩膀上实际工程中我们很少直接用一堆分立门电路去搭复杂功能。更多的是使用封装好的、功能更强的中规模集成电路MSI模块如编码器、译码器、数据选择器、加法器、数值比较器等。它们本身就是由基本门电路构成的优化组合逻辑模块使用它们能极大提高设计效率、可靠性和集成度。6.1 译码器Decoder的应用译码器能将一组二进制代码“翻译”成对应的唯一输出信号。例如一个3线-8线译码器如74HC138有3个输入A2,A1,A08个输出Y0~Y7低电平有效。对应每一个输入组合只有一个输出端为低电平。用它实现组合逻辑函数因为它的每个输出都对应一个最小项的非Yimi。所以任何SOP形式的逻辑函数都可以通过将译码器的相应输出接入一个与非门来实现。例如要实现 F(A,B,C) Σm(1,3,5,6)只需将74HC138的Y1,Y3,Y5,Y6引脚连接到一个4输入与非门该与非门的输出就是F。6.2 数据选择器MUX的应用数据选择器相当于一个单刀多掷的数字开关。例如一个8选1数据选择器如74HC151有3个地址选择端A2,A1,A08个数据输入端D0~D71个输出端Y。通过改变地址可以选择D0~D7中的某一个连接到Y输出。用它实现组合逻辑函数将逻辑函数的输入变量接到MUX的地址端然后根据函数的真值表来设置每个数据输入端Dx的电平接高电平VCC或低电平GND。它非常适合实现输入变量数比MUX地址端多一个的函数通过将某一个输入变量接到数据端来实现。6.3 加法器与数值比较器加法器如74HC283是4位超前进位加法器能直接计算两个4位二进制数的和并产生进位输出。用它来搭建算术运算单元比用门电路快得多、也简单得多。数值比较器如74HC85能比较两个4位二进制数的大小并输出大于、等于、小于三种结果。使用MSI的优势设计简化将复杂功能模块化降低设计难度。布线简化减少芯片数量和PCB连线。提高可靠性MSI芯片经过充分测试和优化。提高速度内部采用了超前进位等优化结构。实操心得在现代FPGA/CPLD开发中虽然你写的是硬件描述语言HDL但综合工具最终会将你的代码映射成类似这些MSI模块的底层结构如LUT查找表相当于MUX。理解这些MSI器件的原理对于你写出高效、可综合的HDL代码有直接的指导意义。例如你知道一个8选1 MUX可以实现任意4变量函数那么在代码中对于复杂的多路选择逻辑就可以有意识地引导综合器向这个方向优化。7. 可编程逻辑器件PLD简介设计的演进随着技术发展出现了可编程逻辑器件PLD如PAL、GAL、CPLD和FPGA。它们本质上是将大量的基本逻辑门、触发器以及可编程互连线集成在一块芯片上。用户可以通过硬件描述语言Verilog/VHDL或原理图来定义其逻辑功能然后通过编译、综合、布局布线、下载等步骤将设计“烧录”到芯片中。对于组合逻辑电路设计而言PLD带来了革命性变化设计灵活性无需改动PCB修改代码即可改变硬件功能。集成度高一个芯片可以实现极其复杂的逻辑系统。开发周期短仿真、调试都在软件环境中完成。从传统设计到PLD设计的思维转变在PLD设计中你更多关注的是行为描述和系统架构而不是具体的门级电路连接。例如你要实现一个译码器在Verilog中你只需要写case (input_code) ... endcase工具会自动为你生成最优的电路结构。但这并不意味着底层知识不重要。相反扎实的组合逻辑分析与设计功底能帮助你在编写HDL时预判综合结果避免生成存在竞争冒险或面积、时序不佳的电路写出更“硬件友好”、效率更高的代码。从我个人的经验来看组合逻辑电路的分析与设计能力是硬件工程师的“内功”。无论技术如何演进从分立器件到ASIC再到FPGA其底层的布尔逻辑思想是相通的。把基础打牢把每一步的“为什么”想明白你在面对更复杂的时序电路、系统架构时才会更有底气更能洞察问题的本质。下次当你再看到一个复杂的数字系统时不妨试着在脑海中把它拆解成一个个小的组合逻辑模块你会发现一切都有迹可循。
返回列表