尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

从8421BCD码到5421/2421/余3码的转换电路设计与逻辑优化

从8421BCD码到5421/2421/余3码的转换电路设计与逻辑优化 1. 从8421BCD码到其他编码一个看似简单却暗藏玄机的设计在数字电路和计算机组成原理的学习与实践中编码转换是一个基础但至关重要的环节。我们最熟悉的莫过于8421BCD码它用四位二进制数来表示一位十进制数直观且易于理解。然而在实际的硬件系统特别是早期的数字仪表、编码器或特定算法的硬件实现中我们常常会遇到其他类型的BCD码比如5421码、2421码和余3码。最近在准备一个硬件实验或者课程设计时我就遇到了一个需求设计一个组合逻辑电路其输入是标准的8421BCD码输出则要同时得到对应的5421码、2421码和余3码。这听起来像是一个简单的真值表映射问题但真正动手设计时你会发现从“知道怎么做”到“做出一个稳定、可靠且易于理解的电路”之间还有不少值得琢磨的地方。特别是当看到“共射-共集组合电路直接耦合”这样的热词时更让我思考如何将编码转换这个纯数字逻辑问题与更底层的晶体管级实现思路联系起来虽然我们最终可能用集成芯片完成但理解其背后的逻辑优化思想对设计任何数字系统都大有裨益。这个项目的核心价值在于它强迫你跳出对单一编码的依赖去理解不同编码的特性及其转换关系。8421码是“有权码”每位有固定的权重8,4,2,15421码和2421码也是有权码但权重分配不同余3码则是“无权码”它是在8421码基础上加30011得到的具有“自补”的特性。设计一个电路同时实现这三种转换并不是简单地将三个独立的转换电路拼在一起而是需要寻找输入与多个输出之间的整体逻辑关系这有可能通过共享部分中间逻辑来简化整体电路。这对于理解组合逻辑的综合与优化、真值表的合并与卡诺图的绘制都是一个非常好的综合训练。无论你是电子工程专业的学生还是正在入门数字电路的爱好者通过这个设计你都能深刻体会到从逻辑抽象到电路实现的全过程并积累解决类似多输出逻辑问题的经验。2. 理解目标编码为何不止有8421在动手画真值表之前我们必须先搞清楚我们要转换成的这几种码制到底是什么以及它们为什么存在。只知道定义是不够的理解其设计动机和特性能帮助我们在设计电路时做出更合理的判断。2.1 8421BCD码我们熟悉的起点8421BCD码是最自然、最常用的二-十进制编码。它将一个十进制数的每一位用其对应的4位二进制数来表示。例如十进制数5用0101表示08 14 02 11 5。它的优点是直观与纯二进制转换简单。但作为本设计的输入我们需要记住8421BCD码只使用0000到1001这十个状态代表0-91010到1111这六个状态是无效的。在设计组合电路时这些无效输入可以作为“无关项”来处理这往往是逻辑简化的关键。2.2 5421码与2421码有权码的变体5421码和2421码同属“有权码”即代码的每一位也有一个固定的权重将代码中为1的位的权重相加即可得到对应的十进制数。5421码权重从高位到低位依次是5, 4, 2, 1。例如十进制数7在5421码中可以是101050207但值得注意的是有些数可能有多种表示法通常我们采用一种标准约定。一种常见的5421码编码表是00000, 10001, 20010, 30011, 40100, 51000, 61001, 71010, 81011, 91100。观察可知0-4的编码与8421码相同从5开始最高位权重5变为1。2421码权重从高位到低位依次是2, 4, 2, 1。它的一个关键特性是“自补性”即一个数的2421码其各位取反1变00变1后得到的是该数对9的补数的2421码。例如一种常见的2421码编码是00000, 10001, 20010, 30011, 40100, 51011, 61100, 71101, 81110, 91111。可以看到0-4的编码也与8421码一致在这种编码方式下5-9的编码则是其对应补数4-0编码的按位取反。设计启示从8421码转换到5421或2421码对于0-4这五个数输出直接等于输入这意味著对应输出位的逻辑表达式可能非常简单直接连通。转换逻辑主要集中在对5-9这五个数的处理上。这提示我们在后续列真值表和化简时可以按输入数值范围进行分区处理可能有助于找到更简洁的逻辑。2.3 余3码独特的无权码余3码是在8421码的基础上加3二进制0011得到的。即余3码 8421码 0011。例如十进制08421码0000 加3后得0011余3码。十进制58421码0101 加3后得1000余3码。它的显著特点也是“自补性”并且因为是由8421码加固定值得来所以其转换逻辑从布尔代数的角度看就是一个简单的加法器逻辑。这为我们设计电路提供了明确的思路可以优先考虑实现一个“加0011”的加法逻辑单元。核心问题浮现现在我们的任务变得具体了。输入是4位8421码A3, A2, A1, A0其中A3是最高位输出有三组4位码5421码输出F5_3, F5_2, F5_1, F5_0、2421码输出F2_3, F2_2, F2_1, F2_0、余3码输出F3_3, F3_2, F3_1, F3_0。我们需要为这12个输出函数分别找到基于4个输入变量的最简逻辑表达式。3. 建立转换真值表与逻辑化简这是整个设计的核心推导阶段。我们不能凭感觉必须严格地列出真值表并利用卡诺图或逻辑代数进行化简。考虑到有12个输出手工操作量不小但我们可以借助观察来简化工作。3.1 构建完整真值表首先我们列出输入8421码从0000到10010到9的十种有效状态。对于1010到1111这六种无效输入在真值表中我们可以将其对应的输出视为“无关项”在卡诺图中用“X”表示这在化简时可以极大程度地简化逻辑。下面是一个精简的真值表示意图由于篇幅仅展示部分关键行和逻辑实际设计需列出全部10行有效输入十进制数输入 (8421) A3A2A1A0输出 (5421) F5_3 F5_2 F5_1 F5_0输出 (2421) F2_3 F2_2 F2_1 F2_0输出 (余3码) F3_3 F3_2 F3_1 F3_000 0 0 00 0 0 00 0 0 00 0 1 110 0 0 10 0 0 10 0 0 10 1 0 020 0 1 00 0 1 00 0 1 00 1 0 130 0 1 10 0 1 10 0 1 10 1 1 040 1 0 00 1 0 00 1 0 00 1 1 150 1 0 11 0 0 01 0 1 11 0 0 060 1 1 01 0 0 11 1 0 01 0 0 170 1 1 11 0 1 01 1 0 11 0 1 081 0 0 01 0 1 11 1 1 01 0 1 191 0 0 11 1 0 01 1 1 11 1 0 0无效1 0 1 0X X X XX X X XX X X X...............注意上表中5421码和2421码的编码方式采用了前文所述的一种常见约定。在实际项目中必须首先明确你采用的编码表标准不同的标准会导致完全不同的逻辑表达式。3.2 分输出进行卡诺图化简有了真值表接下来就是对12个输出函数逐一化简。我们以余3码的最高位F3_3和5421码的最高位F5_3为例演示如何利用无关项进行化简。余3码最高位 F3_3 的化简从真值表看当输入为5(0101)、6(0110)、7(0111)、8(1000)、9(1001)时F3_31。将F3_31的项和所有无效项(1010~1111)填入卡诺图。你会发现通过合理圈入无效项可以得到一个非常简单的表达式。例如F3_3可以化简为A3 A2A1 A2A0。这意味着当8421码的最高位为1或者次高位A2与A1同时为1或者次高位A2与最低位A0同时为1时余3码的最高位就是1。这个逻辑比直接实现“加3”的加法器进位逻辑更简洁。5421码最高位 F5_3 的化简从真值表看当输入为5(0101)、6(0110)、7(0111)、8(1000)、9(1001)时F5_31。有趣的是你会发现这个1的分布和F3_3完全一样在本例采用的编码表下。因此F5_3的卡诺图化简结果很可能与F3_3相同或高度相似。实际上化简后可能得到F5_3 A3 A2A1 A2A0。这是一个重要的发现5421码的最高位和余3码的最高位其逻辑函数可能是一致的实操心得在化简多个输出时不要孤立地进行。并排观察所有输出的卡诺图或者对比它们的真值表列经常能发现不同输出位之间存在的相同或相似的逻辑项。这提示我们在最终的电路实现中可以共享逻辑门。例如如果F3_3和F5_3的逻辑表达式完全相同那么只需要一个与门和一个或门来产生这个信号然后同时连接到两个输出端口即可这能有效减少芯片数量和电路复杂度。3.3 得到最简逻辑表达式集经过对所有12个输出位的卡诺图化简这是一个需要耐心和细致的过程我们可以得到一组最简的“与或”表达式。假设我们最终得到如下一组表达式仅为示例实际结果取决于化简过程和采用的编码表公共中间信号X A2A1 A2A0// 一个可能被多个输出用到的项余3码输出F3_3 A3 XF3_2 A2’A1 A2’A0 A2A1’A0’// ‘ 表示非F3_1 A1’A0 A1A0’F3_0 A0’5421码输出F5_3 A3 X// 与F3_3共享F5_2 A2’A1’ A2A0 A3A1’F5_1 A1A0’ A2’A1A0 A3A1’F5_0 A02421码输出F2_3 A3 A2 A1A0F2_2 A2 A1A0F2_1 A1’A0 A1A0’ A2A1’F2_0 A0关键提示化简时务必充分利用无效输入对应的“无关项”。它们就像“万能牌”可以帮助你扩大卡诺图中“1”的包围圈或“0”的包围圈从而得到项数更少、变量更少的表达式。这是组合逻辑设计中最关键的优化步骤之一。4. 电路实现方案选择从逻辑门到器件得到逻辑表达式后就可以着手设计电路了。这里有几个层次的实现方案从抽象到具体复杂度也不同。4.1 方案一纯逻辑门搭建这是最直接的教学方案。根据化简后的与或表达式用与门、或门、非门这三种基本门电路搭建起来。例如对于表达式F3_3 A3 A2A1 A2A0用两个两输入与门分别实现A2A1和A2A0。用一个三输入或门将A3、(A2A1)、(A2A0)这三个信号相加。优点概念清晰直接对应布尔代数便于理解和验证。缺点使用的门数量多连线复杂物理电路板面积大功耗和延迟也相对较高。特别是如果不同输出共享了部分与项需要在布线时仔细规划避免重复搭建相同逻辑。4.2 方案二使用可编程逻辑器件对于现代数字设计更实用的方法是使用可编程逻辑器件如CPLD或FPGA或者用硬件描述语言如Verilog或VHDL来实现。以Verilog为例代码可以非常直观module bcd_converter( input [3:0] bcd_8421, // 输入8421码 output reg [3:0] bcd_5421, bcd_2421, bcd_excess3 // 输出三种码 ); always (*) begin case(bcd_8421) 4d0: begin bcd_54214b0000; bcd_24214b0000; bcd_excess34b0011; end 4d1: begin bcd_54214b0001; bcd_24214b0001; bcd_excess34b0100; end // ... 依次列出2-9的转换关系 4d9: begin bcd_54214b1100; bcd_24214b1111; bcd_excess34b1100; end default: begin // 处理无效输入可以赋值为任意值或保持原值 bcd_5421 4bxxxx; bcd_2421 4bxxxx; bcd_excess3 4bxxxx; end endcase end endmodule优点设计灵活修改方便只需改代码无需关心底层门级连接综合工具会自动优化逻辑。非常适合功能验证和快速原型开发。缺点需要特定的开发板和工具链对于理解最底层的门电路工作原理帮助有限。4.3 方案三基于通用集成电路如果想用实物芯片搭建又不愿用一大堆分立门电路可以考虑使用中规模集成电路。例如优先编码器/译码器可以将输入视为地址通过配置ROM如EEPROM或可编程阵列逻辑PAL来直接存储输出真值表实现任意编码转换。这更像一个“查找表”实现。加法器对于余3码其本质是加3所以可以直接使用一片4位二进制加法器如74LS283将8421码输入到A端B端固定接0011进位输入CI接0其输出S就是余3码。这是最优雅、最贴合定义的方法。数据选择器利用多路数据选择器如74LS151可以方便地实现任意逻辑函数。将输入变量连接到选择端数据输入端根据真值表接高电平或低电平。每个输出位需要一片或多片数据选择器级联来实现。方案选择建议对于学习目的强烈推荐从“方案一纯逻辑门”开始。虽然繁琐但它能让你透彻理解每一步逻辑化简如何对应到物理门电路深刻体会共享逻辑门的意义。完成门级设计后再用“方案三”中的加法器实现余3码部分作为对比你会对“多种实现路径”有更感性的认识。最后用“方案二”的Verilog描述一下体验现代设计流程的高效。5. 关键细节、调试与扩展思考即使逻辑化简正确电路实现过程中也会遇到很多实际问题。5.1 无效输入的处理与电路稳定性在我们的设计中我们将无效输入1010-1111作为无关项用于化简。这在纯逻辑上是没问题的但实际电路中这些输入状态可能因为干扰或错误而出现。风险如果实际电路输入了这些无效码由于我们将其输出定义为“无关”实际电路会产生一个不确定的输出值取决于芯片内部晶体管的具体状态。这个输出可能是一个非BCD码导致后续电路错误。应对策略前端保证确保产生8421BCD码的源如计数器、键盘编码器不会输出无效状态。添加校验电路在转换电路前端增加一个“非法码检测电路”。当输入为1010-1111时输出一个错误标志如LED亮起并可选地将转换电路的所有输出置为一个已知安全状态如全0。明确定义在真值表中不将无效项设为“X”而是明确指定一个输出值例如全0或全1。这样化简得到的电路对于无效输入会有确定的、可控的输出行为。5.2 门电路延迟与竞争冒险当输入信号变化时由于各条路径上门电路的延迟不同可能会导致输出出现短暂的毛刺非预期的尖峰脉冲这种现象称为“竞争冒险”。检查方法观察逻辑表达式。如果一个输入变量及其反变量同时出现在一个与或表达式中例如F A B A C当BC1时A的变化可能导致输出F出现毛刺。解决方案增加冗余项在卡诺图中通过增加一个原本不必要的包围圈冗余项来消除冒险。例如在上例F AB AC中当BC1时增加冗余项BC则表达式变为F AB AC BC。此时无论A如何变化因为B和C都是1BC项始终为1保证了输出F稳定为1。输出端接滤波电容在输出端对地接一个小电容几十皮法可以滤除高频毛刺但会降低电路的最高工作频率。采用同步电路在输出端使用D触发器在时钟边沿采样数据可以彻底避免毛刺影响后续电路。这是最可靠的方法但将电路从纯组合逻辑变成了时序逻辑。5.3 从逻辑到晶体管“共射-共集”的启示热词“共射-共集组合电路直接耦合”属于模拟/晶体管电路范畴。它提示我们即使我们使用集成逻辑门其内部也是由晶体管如BJT或MOSFET构成的。共射放大电路提供电压增益共集电路射极跟随器提供电流驱动能力和低输出阻抗两者直接耦合可以构成性能更好的放大单元。在逻辑门内部类似的结构用于实现反相、放大和驱动。对于我们的编码转换电路虽然不直接设计晶体管级但理解这一点很重要扇出能力一个逻辑门的输出能驱动多少个同类门的输入。如果你用分立门搭建需要计算前一级门的负载是否超过其扇出能力。电平匹配确保所有芯片使用相同的电源电压如5V TTL或3.3V CMOS高低电平标准要兼容。去耦电容在每片集成电路的电源和地引脚之间就近放置一个0.1uF的陶瓷电容用于滤除电源线上的高频噪声这是保证数字电路稳定工作的必备措施很多初学者会忽略这一点导致电路在特定频率下工作异常。5.4 扩展思考设计一个通用的可配置编码转换器掌握了固定功能的转换电路后可以思考一个更有挑战性的扩展如何设计一个电路通过一些控制信号来选择将8421码转换成5421、2421或余3码中的某一种思路这本质上是一个多路选择问题。我们可以先独立实现三个转换模块就像本文设计的核心部分然后用三组4选1数据选择器如4片74LS153或一组16选1数据选择器如74LS150来作为输出选择开关。增加两位控制信号如S1S000选通5421码输出01选通2421码输出10选通余3码输出。这样我们就得到了一个简易的“编码转换器IP核”。这个设计过程让我深刻体会到数字逻辑设计就像搭积木先分解功能再优化每个子模块最后考虑模块间的连接与控制。从真值表到卡诺图从逻辑表达式到门电路每一步的优化都直接关系到最终电路的效率和成本。而处理无效状态和竞争冒险则是理论走向实践必须跨越的鸿沟。下次如果你需要实现类似的码制转换不妨先坐下来好好画一画卡诺图看看那些“无关项”能给你带来多少惊喜这往往是设计中最有趣的部分。
返回列表