ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

基于74LS283的十进制加减法器设计与BCD修正

基于74LS283的十进制加减法器设计与BCD修正

简介:面向数字电路课程设计与实验学习者的一份十进制加减法器课程设计文档,围绕一位十进制数的加、减运算电路展开,可用于理解加减法器、编码译码与数码管显示的工作机制。压缩包内共1个doc文件,约689KB,集中收录设计指标、原理方框图、元器件介绍、设计原理、整体电路与安装调试等内容,并给出Multisim8仿真实现思路。文档结合74LS283或4008、74LS86、74LS08等器件,说明减法补码运算、加法进位处理及二进制码与8421BCD码转换,附9+7=16、9-7=2等测试示例和训练总结,便于读者对照复现电路、梳理设计报告结构并排查常见故障。已有3873人学习,适合课程设计参考与实验复盘。

1. 一块加法器扛下加减两种运算:十进制加减法器的难点在显示不在运算

做十进制加减法器数字电路课程设计,题目摊开看并不复杂:0 到 9 十个输入按键、一个加减切换开关、数码管把结果显示出来。很多人第一反应是去找一块“十进制减法器”芯片,翻遍手册才发现根本没有这种现成器件,最后卡住的也不是怎么减,而是 9+7=16 这种超出 0 到 9 的结果怎么送进译码器——直接接上去,数码管给的是一串看不懂的段码。我的做法是运算部分只保留一片 4 位超前进位加法器,减法用异或门取反加一绕过去,加法超过 9 就用第二片加法器加 6 修正。这套结构器件少、每一级都能单独测,适合要在一两周内做出能上电演示、还能写进报告的场景。

2. 需求拆解与器件选型:把“显示 0 到 18”翻译成电路约束

2.1 四条功能指标落到电路上是什么样子

原始设计指标写的是“学习数字逻辑电路设计方法、熟知加减法器与译码显示原理、培养分析故障的能力”,这些话写进报告没问题,但没法直接指导接线。真正要落到电路上的,是后面那三条功能描述:0 到 9 十个字符和“+”“-”各对应一个按键、一个开关控制加减、数码管显示结果。把它们翻译成电路约束,才是一份方案真正的起点。

第一条约束是输入编码。0 到 9 需要 4 位二进制,8421BCD 的合法码只有 0000 到 1001,1010 到 1111 这六种状态在电路里必须保证不可能被置入。用十个拨码开关手工置数,靠的是操作者自觉;用按键加一片 10 线-4 线优先编码器(74LS147),非法码在物理上就产生不了。这一条直接决定输入模块选哪种做法,也决定答辩时会不会被问“如果我按下两个键会怎样”。

第二条约束是结果位宽。加法最大 9+9=18,需要两位十进制;减法按题目要求被减数不小于减数,结果落在 0 到 9,一位就够。整条显示链路按两位设计,个位一套译码加数码管,十位一套。有人图省事只做一位,9+7 就显示 6,这是最典型的翻车点。

第三条约束是运算方式必须由一个逻辑电平决定,不能靠拔线、换接线柱来切换。演示现场没有时间改线,报告里的方框图也画不出“手动改接”这种操作。所以加与减的切换必须收敛到一个开关 S1 上,由它同时控制取反和进位输入。

第四条约束是显示要稳定可读。数码管是共阴还是共阳、译码驱动器带不带锁存、限流电阻怎么取,这些细节没定下来,后面画总图时会反复返工。把结果空间算清楚也有好处:0 到 9 两两组合共 100 种,加法 100 个用例,减法因为限定 A≥B 只剩 55 个,合计 155 个输入组合——这就是验收时需要覆盖的全部空间,不多不少。

2.2 器件选型:每片芯片在电路里扛什么活

选型的核心思路是“运算只做一次,修正单独做一次”。第一片 4 位全加器负责原始二进制加法,第二片只负责在结果大于 9 时加 6,两片的职责不重叠,出问题时能立刻定位到是哪一级。

器件型号在电路中的角色关键引脚替代方案
4 位超前进位全加器74LS283第一片做 A+B 与补码减法,第二片做加 6 修正A1~A4、B1~B4、S1~S4、C0、C4CD4008
四异或门74LS86对 B 的 4 位逐位取反,一端统一接 S14 组输入输出74LS86 一片刚好够用
二输入与门74LS08产生修正判断项 S3S2、S3S14 组与门74HC08
三输入或门74LS27(或非门取反)把三个修正条件合成一个加 6 信号3 组输入三输入或门型号较少,多绕一级反相
七段译码驱动器74HC4511把 4 位 BCD 译成段码,带锁存A B C D、a~g、LE、BI、LTCD4511
七段数码管共阴 0.56 寸显示个位与十位共阴共阳要跟驱动器匹配共阳需换驱动极性
拨码开关/按键—置入两个一位十进制数每位一个开关按键方案需加编码器

74LS283 和 CD4008 功能上都能做 4 位加法,但两者引脚排列完全不同,不是“插上去就能换”的关系。做法是先在仿真里把 283 的封装定死,报告里的引脚图、接线表全部按它画;如果实验室只剩 4008,就把整张接线表重画一遍,而不是对着旧图硬改。这一点在动手前就要跟同组的人对齐,否则两个人画的图对不上。

另一处容易被忽略的是电平匹配。74LS 系列是 TTL 工艺,5V 供电下输出高电平典型值在 2.7V 到 3.4V 之间;74HC4511 是 CMOS 输入,5V 供电时输入高电平门限约 3.5V。仿真的理想模型不体现这个差别,实物上就可能出现数码管时亮时暗。稳妥的做法是给驱动 4511 的那几根信号线加 4.7k 上拉电阻,或者直接选用 74HCT4511(TTL 电平兼容)。

2.3 仿真环境与文件组织

仿真在 Multisim 里做,按“单元电路—模块电路—整机总图”三层组织文件。单元电路阶段每个文件只放一个待验证的小电路,比如一片 283 加四个开关,单独跑一遍 9+7 看 S 端和 C4 输出对不对;模块电路把输入级、运算级、显示级分别接好;最后才是整机总图。这样做的直接好处是,总图跑不出正确结果时,能退回到某一级单独复测,而不是对着几百根线猜。

文件命名上带版本号和日期,改一版另存一份,不要在同一个文件上反复覆盖。仿真电路里所有开关、数码管、电源都要有明确标注,尤其是 S1 这个加减切换开关,图上必须写清“0=加、1=减”。这条标注后面写报告、答辩讲原理时都要用到,先标清楚能省掉很多口头解释。

3. 总体架构:四个模块与一条被开关翻转的数据通路

3.1 模块划分与信号流

整机拆成四个模块,每个模块有明确的输入输出边界,接口定义清楚之后可以几个人分头画。

模块输入输出核心器件单独测试方法
输入置数0~9 十个开关/按键4 位 A、4 位 B(8421BCD)拨码开关或 74LS147逐个置数,看译码显示是否为对应数字
运算方式选择开关 S1、B 的 4 位取反后的 B、进位输入 C074LS86拨动 S1,量四个异或门输出是否翻转
运算核心A、取反后的 B、C0和 S、进位 C4、修正后 BCD两片 74LS283 + 门电路分别测第一片和第二片的输出
译码显示运算核心输出的 BCD两位数码管显示74HC4511×2 + 数码管单独给 0000~1001,看段码

信号的主通路是这样走的:十个输入开关给出两个 8421BCD 数 A 和 B,B 的 4 位先经过异或门阵列,异或门的另一端统一接 S1;第一片 283 把 A 和“处理过的 B”加起来,同时接收 S1 作为进位输入;第一片的 4 位和进入第二片 283 的 A 端,修正信号决定第二片是加 0 还是加 6;最后两片 283 的进位共同决定十位,第二片的和决定个位,分别送两片 74HC4511 译码,驱动数码管。

按这个划分,每个模块都能脱离整机单独上电测试。实际调试时大部分故障都集中在模块交界处,比如异或门输出到 283 的 B 端断了一根,或者十位进位少接了一路,模块内部反而不太容易出问题。

3.2 S1 一个开关干两件事

整个设计里最巧的一处,是那个加减切换开关同时接到四个异或门的一个输入端和第一片 283 的进位输入 C0。它不是一个简单的“模式选择”,而是直接参与运算。

S1 电平异或门输出C0第一片 283 实际完成结果含义
0B⊕0 = B0A + B加法,和正常输出
1B⊕1 = B̄1A + B̄ + 1 = A − B(模 16)减法,C4=1 表示无借位

道理在补码的定义里:4 位二进制是模 16 运算,B 的补码等于 B 取反加一,所以 A + B̄ + 1 在模 16 意义下就等于 A − B。开关拨到减法一侧时,四个异或门把 B 的每一位翻过来,同时 C0 送一个 1 进去,正好凑成那个“加一”。一个单刀开关没有增加任何器件,就把加减两种运算合并到了同一片加法器上。

这里有个必须讲清楚的细节:C4 的含义在加法和减法下不一样。做加法时 C4=1 表示和超过 15,是十位进位的来源;做减法时 C4=1 表示 A≥B 没有借位,C4=0 才表示不够减。题目限定了被减数不小于减数,所以正常演示时 C4 恒为 1,可以直接忽略,或者反相后接一个“借位”指示灯,提示操作者输入超出了约定范围。

3.3 位宽、显示位与扩展余量

第一片 283 是 4 位加法器,两个 4 位输入最大能到 1111+1111,结果 30,两位十进制完全够用。但要注意输入被限制在 0 到 9,所以真实的和最大只有 18,这给修正逻辑留了很大余量——加 6 之后最大 24,第二片的 4 位输出仍然不会溢出到需要三位显示。

有一种常见的扩展设想,是把电路改成两位十进制数相加减,比如 99+99。那就需要两片 283 级联成 8 位加法器,低位片的 C4 接高位片的 C0,同时每一级都要配独立的 BCD 修正和译码,器件数量翻三倍,调试量也翻三倍。课程设计阶段不建议这么做,除非题目明确要求;把一位十进制的加减法做到 155 个用例全部通过,比做一个到处是错误的两级电路更有说服力。

4. 运算通路实现:补码减法、BCD 加法修正与译码显示

4.1 减法通路:四个异或门加一个进位输入

减法通路的全部硬件就是一片 74LS86,它内部有四个独立的二输入异或门,刚好一位一个。接线时把四个异或门的一个输入端并在一起接到 S1,另一个输入端分别接 B 的 B1、B2、B3、B4,输出接第一片 283 的 B1、B2、B3、B4,同时把 S1 接到 283 的 C0。

以 9−7 为例走一遍:A=1001,B=0111。S1=1 时异或门输出 B̄=1000,C0=1,第一片算的是 1001 + 1000 + 1 = 10010,取低 4 位得 0010,C4=1。0010 就是十进制 2,十位显示 0,个位显示 2,符合 09−07=02。

真正容易出错的是位序。74LS283 的引脚命名里 B1 是最低位、B4 是最高位,但封装图上四个引脚往往是从左到右排下来的,看图时不注意就会把最高的 B4 接到最低位上去。表现出来就是置入 0111 结果出来一堆奇怪的值,而且越看越像“少了一位”。校验办法很土但很有效:接完之后逐位单比特测试,分别置入 0001、0010、0100、1000,数码管应该依次显示 1、2、4、8,四个都对了位序就不会错。

还有一处需要提前想好:如果某次演示时被减数小于减数,C4 会变成 0,第一片输出的是差的补码而不是原码,数码管显示的就是错的值。题目虽然限定了 A≥B,但答辩老师很可能会问“如果 3 减 7 会怎样”。标准答案是:此时 C4=0 表示产生借位,需要对结果再取一次补码才是绝对值,本设计按指标约定不做这一处理,但 C4 反相后可以作为借位指示输出。

4.2 加法通路:和大于 9 时加 6 的修正逻辑

加法的问题出在编码不在运算。第一片 283 给出的是纯二进制和,而数码管和译码器只认 8421BCD,一旦和超过 1001,同一个四位码在两种编码体系里代表的意思就对不上了。5+5 得到 1010,译码器不认;9+7 得到 10000,低四位是 0000,直接显示会变成 0。

修正的逻辑很简单:凡和大于 9,就给结果加 6,让它跳过 1010 到 1111 这六个非法码。

十进制和第一片输出 S3S2S1S0C4修正判断加 6 后显示
910010否100109
1010100是1000010
1211000是1001012
1511110是1010115
1600001是0011016
1800101是0100018

把 10 到 18 这九种情况列成真值表化简,修正条件可以写成 Y = C4 + S3S2 + S3S1。三项分别对应“和已经超过 15”、“和在 12 到 15 之间”、“和在 10 到 11 或 14 到 15 之间”,合起来正好覆盖 10 到 18。C4 这一项不要漏,9+7 得到 10000 时低四位是 0000,光看 S3、S2、S1 全是 0,只有进位把它捞回来。

用门电路实现时,两个二输入与门(74LS08)分别算出 S3S2 和 S3S1,再和一个 C4 一起送进三输入或门。三输入或门在常见型号里不好找,多数人用 74LS27 三输入或非门再取一次反,逻辑等价。

修正动作由第二片 74LS283 完成:它的 A 端接第一片的和 S1~S4,B 端接成 (Y, Y, 0, 0)——也就是 Y 接 B4 和 B3,B2、B1 接地,C0 接地,这样当 Y=1 时它算的就是“和加 6”。第二片输出的低四位就是修正后的个位 BCD 码。

这里有个必须说透的点:十位不是只取第二片的进位。5+5 时第一片 C4=0,第二片算 1010+0110=10000,C4=1,十位由第二片给出;9+7 时第一片 C4=1,第二片算 0000+0110=0110,C4=0,十位得由第一片给出。所以十位信号应该是两片进位相或,加一个二输入或门即可。只接其中一路,就会出现“有的加法显示对、有的少个十几”的诡异现象。

4.3 译码显示:74HC4511 的三个控制脚

译码用 74HC4511,它把 4 位 BCD 译成七段码,内部带锁存。三个控制脚必须接对,否则会出现“数码管全灭”“数字卡住不变”这类看起来像芯片坏了的现象:LT 是灯测试,低有效,正常工作时接高电平;BI 是消隐,低有效,正常工作时接高电平;LE 是锁存使能,高电平时锁存、低电平时透明,本设计不需要锁存,直接接地。

十位数码管的接法要简单得多:它只会显示 0 或 1,把十位信号接到 4511 的 D1(最低位数据输入),D2、D3、D4 接地即可,不需要额外的译码逻辑。

数码管选共阴还是共阳,取决于驱动器的输出极性,两者必须成对匹配。段输出到数码管之间串 330Ω 到 470Ω 的限流电阻,Multisim 里可以用理想数码管省掉,但画实物接线图时必须补上。仿真阶段还有一个常见误区:虚拟器件没有扇出限制、没有传播延迟、没有电平门限,仿真跑通不代表实物能跑通,这一点在验收前要专门留出时间做实物验证。

4.4 用脚本和模型把期望值钉死

155 个输入组合靠手算期望值不现实,也容易算错。做法是写几行脚本把期望值表生成出来,仿真跑完直接对着表逐行勾,错了立刻知道是哪个输入组合出的问题。

# 生成 0~9 加减法的期望值表,导出 CSV,供 Multisim 波形逐条比对 import csv rows = [] for a in range(10): for b in range(10): s = a + b # 加法结果按两位十进制记录,十位在前、个位在后 rows.append((a, b, "+", f"{s // 10}{s % 10}")) if a >= b: # 减法只覆盖 A≥B 的 55 种组合 rows.append((a, b, "-", f"0{a - b}")) with open("vec.csv", "w", newline="", encoding="utf-8") as f: w = csv.writer(f) w.writerow(["A", "B", "OP", "EXPECT"]) w.writerows(rows) print(len(rows)) # 100 条加法 + 55 条减法,共 155 条

脚本只负责产生期望值,不参与电路本身。它的价值在于把“我觉得应该对”变成一张可以打勾的表,答辩时把这张表和仿真截图一起贴出来,比口头说“全都测过了”有力得多。参数上唯一要改的是减法条件:如果指导老师允许被减数小于减数,if a >= b这一行就要去掉,期望值也要改成对 16 取补后再求绝对值。

另一件事是用一段行为级模型做交叉验证。门级电路看的是波形,模型看的是逻辑,两者对不上就说明某个门的接法有问题。

// 4 位 BCD 加法修正的行为模型,仅用于和门级仿真结果对照,不参与综合 module bcd_add_cmp ( input [3:0] a, // 第一片 283 的 A 端 input [3:0] b, // 第一片 283 的 B 端 output [3:0] tens, // 十位数码管输入 output [3:0] ones // 个位数码管输入 ); wire [4:0] raw = a + b; // 第一片的和与进位 wire c4 = raw[4]; // 第一片 C4 wire fix = c4 | (raw[3] & raw[2]) | (raw[3] & raw[1]); // Y = C4 + S3S2 + S3S1 wire [4:0] corr = raw[3:0] + (fix ? 5'd6 : 5'd0); // 第二片完成加 6 assign ones = corr[3:0]; assign tens = {3'b000, c4 | corr[4]}; // 十位由两片进位相或 endmodule

这段模型的三个中间信号和门级电路一一对应:raw是第一片的输出,fix是那两个与门加或门的合成结果,corr是第二片的输出,最后一行c4 | corr[4]对应的就是那一路容易漏掉的或门。仿真时把门级波形和模型输出并排放在一张图上,任何一处不一致都能直接定位到具体是哪一级。

5. 避坑与排查:五处最容易翻车的地方

5.1 输入与开关类

第一处:拨码开关一端悬空。现象是不碰任何开关,数码管上的数字自己跳变,或者手一靠近就变。原因是开关只接了信号线,另一端没有确定的电平,TTL 输入端悬空在逻辑上算高电平,但抗干扰能力极差。解决办法是把每个开关做成单刀双掷,一端接 VCC、一端接 GND,中间抽头出信号;或者用 10k 下拉电阻把每个输入位钉在低电平,开关只负责往上拉。这一条在仿真里完全看不出来,只有上实物才会暴露。

第二处:S1 的极性定义前后不一致。现象是选了加法,结果却减了,或者报告里原理图画的是“高电平加法”、测试步骤写的却是“低电平加法”。原因很简单,取反加一的推导里 S1=1 对应减法,写报告时两处描述没对齐。解决办法是在画总图之前就把约定写在图上:S1=0 做加法、S1=1 做减法,原理段、接线表、测试步骤三处统一用这一句。答辩被问到开关极性时,直接指着图上的标注回答,比临场回忆可靠。

5.2 运算与进位类

第三处:B 的位序接反。现象是置入 7,数码管显示出来的值怎么算都不对,而且规律很像“乘二”。原因是 74LS283 的 B1 是最低位,封装图却常常把 B4 画在左边,按图从左往右接就反了。解决办法是接完立刻做单比特测试:分别置 0001、0010、0100、1000,显示 1、2、4、8 才算接对。这个测试只要两分钟,能省掉后面几个小时的排查。

第四处:十位进位只取了一路。现象是 5+5 能显示 10,9+7 却显示 06。原因是加法结果超过 15 时,进位由第一片 283 给出,第二片反而没有进位;没超过 15 但大于 9 时,进位由第二片给出。解决办法是加一个二输入或门,把两片 283 的 C4 相或之后再送十位数码管。判断方法也简单:把所有加法用例按“和是否大于 15”分成两组各测一遍,只错其中一组就说明是这个问题。

第五处:TTL 驱动 CMOS 的电平余量不足。现象很有迷惑性——仿真全部正确,实物上数码管有时正常有时乱码,用手碰一下板子显示还会变。原因是 74LS 系列的高电平输出典型值只有 3.4V 左右,而 74HC4511 在 5V 供电下的输入高电平门限约 3.5V,刚好卡在临界点上。解决办法是给这几根信号线加 4.7k 上拉电阻到 5V,或者把译码器换成 74HCT4511,它的输入门限按 TTL 电平设计,可以直接对接。

5.3 显示与仿真类

第六处其实也值得单列:74HC4511 的控制脚处理不当。现象是数码管全灭,或者数字卡在某个值上不跟着输入变。原因是 LE 悬空时电平不确定,芯片可能进入锁存状态;BI 被拉低则整片消隐。解决办法是把 LT 和 BI 都接高电平、LE 直接接地,三个脚一个不留地处理掉。排查顺序建议是先量这三个脚的电平,再看段输出,最后才怀疑数码管本身——很多时候换了两块数码管,问题其实在控制脚上。

仿真层面还有一个心态上的坑:Multisim 里的器件是理想模型,没有扇出限制、没有毫秒级的传播延迟、没有接触电阻。仿真跑通只说明逻辑是对的,不说明电路能焊出来。留出至少半天做实物验证,比在仿真里反复优化波形更值。

6. 验收与答辩:用一组测试向量把电路自证清楚

验收时最忌讳的是“我随便拨几下,能显示就交差”。老师只要挑一个边界值就能问出问题。稳妥的做法是提前准备一张测试向量表,挑八条覆盖所有分支的用例,现场按顺序走一遍,走完这张表,电路的正确性基本就自证了。

序号AB运算期望显示这条用例覆盖什么
100加00全零输入,检查上电初始状态
245加09和刚好等于 9,不触发修正
355加10和刚好等于 10,修正边界,十位来自第二片进位
497加16和超过 15,十位来自第一片进位
599加18最大和,修正后仍不溢出
697减02常规减法,C4=1 无借位
799减00差为零的边界
850减05减数为零,检查 B 取反后是否仍正确

第 2、3、4 条是这张表的核心。三条用例分别对应“不修正”“第二片进位”“第一片进位”三种情况,只要这三条全对,BCD 修正和十位进位这两块最容易出错的地方就都被覆盖了。第 8 条也值得留,减数为 0 时 B 取反变成 1111,加一之后正好回绕到 0,能顺带验证补码通路的完整性。

答辩讲述的顺序,我一般建议按“约束—架构—关键推导—现场演示”四步走。先讲那四条电路约束,说明为什么结果要两位、为什么运算方式必须收敛到一个开关;再讲四个模块的划分和信号流,让老师知道你不是照着图抄的;然后挑“为什么加 6”和“为什么十位要两片进位相或”这两个点做推导,这两处最能体现是否真懂;最后现场演示上面那张表。整个过程控制在五六分钟,留出时间回答问题。

有个细节别忽略:提前准备好“如果被减数小于减数会怎样”的答案。这是最常被追问的一个问题,答“会产生借位,C4 变 0,此时输出的是补码,需要再取一次补码才是绝对值,本设计按指标约定限定 A≥B,所以没有做这一级”就够了,既说明你知道原理,也说明你清楚设计的边界在哪。

从那以后我每次带人做这类课设,都强制要求先写测试向量表再画总图——表写不出来,说明需求还没想清楚,画出来的图大概率要推倒重来。希望帮到你。

本文还有配套的精品资源,点击获取

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进