FEATURED · 精选文章

数字电路课设:基于74系列芯片的自动售货机状态机设计详解

发布时间 / 2026/9/2 1:25:04
来源 / 创域科博编辑部
栏目 / 资讯中心
数字电路课设:基于74系列芯片的自动售货机状态机设计详解 简介《数电课设自动售货机》是华中科技大学数字电路课程设计项目的一套完整工程资料面向电子信息类本科生及需要完成类似课设的读者覆盖从电路原理到系统实现的全过程。内容覆盖逻辑门、触发器、计数器、译码器等基础数字电路模块并给出有限状态机建模、货币面值识别、商品出货控制、安全保护机制等系统设计方案可帮助读者理解自动售货机的完整工作流程。压缩包共四百二十六个文件、约四十六点六六兆大部分为Vivado工程相关文件xpr、v、xdc、tcl另有仿真日志log、wdb、C测试程序、批处理脚本及doc/html说明文档目录结构清晰便于定位源码、约束、仿真与报告模块。已有2850人学习下载适合课程设计答辩前快速对照参考。通过该资源可获取可综合的Verilog源码、仿真测试平台、约束文件与自动构建脚本配套完整Vivado工程既能支撑课设设计报告撰写也可用于实际烧录验证与功能扩展。 做数电课设的时候十个组里有八个抽到自动售货机这话一点也不夸张。我当时也是这个题目从最开始以为“投币、出饮料、找钱”很简单到后来发现要把一个完整的时序系统拆成状态机、加法器、比较器、译码显示电路每一步都有讲究。这篇文章把我当时完整的设计思路、芯片选型、仿真和面包板搭接过程、以及踩过的坑都写出来给正在做这个课设的同学一个可以直接参考的版本。你如果用的是74系列芯片方案或者想在报告中多写点干货这篇应该对你有用。1. 需求分析与整体设计思路做课设第一步不是画电路图而是把功能需求一条条列清楚。自动售货机听起来很具象但落到数字电路上其实需要精确到输入有几个、输出有几个、状态怎么迁移否则后面搭电路就是一团乱麻。1.1 先把功能边界定清楚我当时的任务书要求是支持1元和5角两种硬币投币商品单价2.5元当累计投币金额大于等于2.5元时可以购买购买后要显示找零并用LED和蜂鸣器模拟出货。不同学校要求会有差异有的要求两种商品有的要求用Verilog写但底层的功能逻辑基本一致。整理成信号表大概是这样的信号方向信号名含义输入coin_1投入1元硬币按键输入coin_05投入5角硬币按键输入buy确认购买按键输入reset系统复位输出display[3:0]当前金额/找零的BCD码输出disp_out出货LED输出buzzer蜂鸣器提示输出change_led找零指示灯先定清楚功能边界后面选芯片和画电路才有依据。特别是“找零怎么表示”很多同学卡在这里。找零不是真的吐硬币出来而是用一个状态或者LED提示“应找多少”。我当时用数码管显示应找的金额数加一个指示灯说明当前处于找零状态。1.2 为什么核心方案是状态机自动售货机的完整流程是空闲等待投币、累计金额、判断金额是否足够、确认购买、出货、找零、返回空闲。这个过程最明显的特点是有严格先后顺序而且系统需要“记住”当前投了多少、进行到哪一步。这种带记忆、带顺序控制的问题正是时序逻辑里有限状态机的经典应用场景。对比一下三种常见做法纯组合逻辑方案致命的缺陷是把当前金额“记住”这件事做不了。投币之后金额需要保存组合逻辑没有记忆能力所以纯组合逻辑根本不可能实现。单片机方案用单片机写程序确实简单功能也更好扩展但数电课设的目的就是考察状态机、时序逻辑、寄存器这些内容的掌握程度用单片机属于“兵器压制”在很多老师那里会直接扣分甚至要求重做。状态机方案用D触发器或者计数器做状态寄存器再配合组合逻辑做状态转换判断既符合课设考察点又不需要单片机编程能力是稳妥且合理的路线。我在报告里用的状态定义是5个S0空闲、S1投币累计、S2可选商品、S3出货、S4找零。5个状态理论上需要3个二进制位但我为了控制电路复杂度把“可选商品”和“出货”合并成了一个状态通过“已够钱但未确认”和“已确认”两个条件区分这样用2个D触发器74LS74就能覆盖4个状态。如果你们要求必须清晰区分5个状态那也可以用74LS161计数器来当状态寄存器输出Q0、Q1、Q2三根线做状态编码。2. 核心模块设计与芯片选型确定了状态机方案之后整个系统可以拆成几个独立模块投币与金额累计模块、金额比较与状态控制模块、显示与出货模块。下面把每个模块的芯片选型和设计逻辑讲清楚。2.1 金额累加与寄存器电路金额累加是整个设计的核心。关键在于金额怎么用二进制表示。按0.5元作为最小单位1元编码成25角编码成1商品单价2.5元就是5最大金额假设到3元就是6。用4位二进制数完全够用而且4位二进制0到6直接给74LS48译码显示非常方便。累加器我用的是74LS283四位二进制超前进位加法器。注意为什么不用计数器累加74LS161这类计数器只能加1而投1元需要加2投5角需要加1计数器做不了可变步长的累加加法器才是正解。累加电路的结构是当前金额寄存器用74LS74搭的4位寄存器的输出送到74LS283的A端投币面额的编码送到B端。投5角时B端给0001投1元时B端给0010。加法器输出直接送回寄存器的D端在同一个时钟上升沿把新金额锁存。这里最关键的技巧是必须用寄存器形成“输出→加法器→输入”的闭环单纯把加法器输出接回输入是组合逻辑环路会出现毛刺和不稳定这在实物调试时特别明显。需要注意加法器输出是4位但超过63元的情况要处理。我当时做的是如果金额到6就停止累加不让用户投更多。用74LS85比较器判断当前金额是否小于7小于7才允许加法器的结果写入寄存器。这一步相当于给系统加了一个“投币上限”。2.2 金额比较与状态控制电路金额达到多少可以购买需要一个比较器来判断。74LS85是4位数值比较器把寄存器输出的当前金额送到A端商品价格编码0101即2.5元固定接在B端。当A大于等于B时输出高电平作为“金额充足”信号。这个“金额充足”信号会送入状态控制电路。我从两个层面设计状态控制状态寄存器和状态转换条件组合逻辑。状态寄存器用一片74LS74内部有两个D触发器就够了4个状态编码我定义为状态Q1Q0含义S000空闲等待S101投币累计中S210金额足够等待确认购买S311出货中并返回状态转换逻辑用次态卡诺图化简然后接到D触发器的D端。举个例子当前是S1且金额充足时下一次态应该是S2这个条件对应D1 Q0 金额充足D0 非Q1与非Q0等。报告里把状态转换表写清楚再把逻辑表达式列出来这部分是拿分重点。再强调一个容易被忽略的点复位。D触发器的CLR引脚要统一接到复位按键上电后先按一次复位确保状态寄存器进入S0。否则一上电芯片内部状态不确定数码管可能显示乱码系统直接“飞”掉。2.3 显示、出货与找零电路显示部分用的是74LS48 BCD译码器和共阴数码管。74LS48的作用是把4位BCD码翻译成数码管七段显示需要的段码。当前金额直接显示在数码管上四位二进制数0到6正好对应LED数码管的0到6非常直观。驱动LED做出货模拟时有个常见的坑如果直接把LED接在74LS输出引脚和地之间会发现LED亮度不够因为TTL门电路输出高电平的驱动能力并不强。正确做法是把LED阳极接VCC或者经过限流电阻接VCC阴极通过电阻接到芯片输出端用“灌电流”方式点亮也就是输出低电平时LED亮。我当时在出货模块用的就是这个接法用2kΩ电阻限流亮度稳定不烧引脚。找零电路是另一个容易糊弄但值得做好的地方。我看到很多同学的找零部分是“亮了找零LED就行”但我觉得既然题目明确写了要找零最好把找零金额也显示出来。实现上可以利用一个简化技巧因为单价是固定的2.5元找零金额只可能是当前金额52.5元时找0当前金额63元时找21元当前金额7时找3等这种离散的对应关系用组合逻辑直接硬编码比接减法器简单得多。不过如果你希望报告更有含金量可以用74LS283做减法减数取反加1也就是补码减法把当前金额A减去价格5得到找零值。我当时用了补码方案因为报告里可以写“减法运算在实际数字系统中的实现”老师会认为你真正理解了补码。3. 仿真与实物搭建过程设计方案和芯片选型完成后就到了动手阶段。我当时是先在Multisim里仿真验证逻辑正确然后再去实验室面包板上搭实物。这一步看起来费时间实际上能节省大量调试时间。3.1 仿真阶段的分模块验证我强烈建议不要一上来就把整个系统画在一张仿真图里。我自己的习惯是先做三个子电路分别仿真金额累加测试、状态转换测试、显示输出测试。第一个子电路是投币和累加模块。用两个按键开关模拟投币一个给0001一个给0010加法器和寄存器连接好之后在仿真里连续按几次投币键观察寄存器输出是否按1、2、3、4这样递增。这一步能验证累加闭环是否正确也能顺便验证加法器是否出现进位。第二个子电路是状态机部分。用两个虚拟开关模拟当前状态输入再手动给“金额充足”“确认购买”等条件信号观察D触发器的输出是否按照状态转换表走。这相当于是单独测试状态逻辑比直接全系统联调容易定位问题。第三个子电路是显示和驱动部分。验证74LS48接共阴数码管之后BCD码能否正确显示0到6重点检查数码管的公共端接法。仿真阶段这些验证完我基本有八成把握实物不会出大问题。3.2 面包板接线顺序与消抖处理上实物之前先处理一个仿真里不明显、实物里特别致命的问题——按键抖动。机械按键按下的时候触点不是一下闭合而是会抖动几毫秒到十几毫秒。如果按键直接接时钟或者直接接寄存器使能端一次按键可能导致多次触发金额会乱跳。我当时用了RC低通滤波加施密特整形的做法按键信号经过一个10kΩ电阻和10μF电容组成的低通滤波器再进到74LS00构成的施密特整形。这个电路能把按键的抖动信号削平输出一个干净的单脉冲。时间常数选0.1秒左右既不会把正常的快速连按给滤掉又能有效抑制抖动。面包板接线的顺序也很有讲究。我踩过最深的坑是先把所有信号线接完再接电源结果板子一上电某块芯片直接发烫。查了好久才发现是电源正负接反。后来步骤固定为先只接电源和地线用万用表确认板子上所有芯片的VCC和GND位置正确、没有短路再逐块插芯片、逐模块接线。每接完一个模块先暂时通一次电用万用表检查一下该模块供电是否正常。3.3 联调与演示前的检查清单系统联调的时候最容易出现的问题是“每个模块单独都对连起来就错”。我当时倒也没幸免找了一个多小时才定位到问题是某个模块的使能信号逻辑反了。联调阶段我习惯按这个顺序检查先看全局时钟是否到达每一片需要时钟的芯片再看复位时所有寄存器是否回到0然后模拟一次完整流程每走一步用万用表或者逻辑笔检测关键信号的电平。演示之前还有几个细节要检查好数码管显示的数字是否清晰、亮度是否一致LED和蜂鸣器是否正常动作以及“金额充足”状态是否能被正确识别。最好提前准备好演示脚本第一步投几个5角、第二步投1元、第三步按购买键每一步预期看到什么现象都写清楚避免演示的时候自己慌了。4. 常见问题、排查技巧与加分项这部分是实际操作里最花时间的。我把自己遇到的问题和一些同学的“翻车现场”整理出来做成一个速查表照着排查效率会高很多。4.1 问题速查表现象可能原因排查与解决办法投币时金额乱跳一次投成好几块按键抖动导致触发多次给按键加RC滤波或RS触发器消抖数码管乱码或者显示874LS48的BCD输入超过了9检查金额是否超过了设计上限加限制逻辑金额正确但状态机不跳转时钟信号没到D触发器检查时钟线路或用逻辑笔测CLK引脚某个模块芯片发烫电源接反或输出短路断电后检查该芯片VCC/GND排除焊接短路设备显示当前金额但按购买没反应比较器输出未正确连接到状态机用万用表测74LS85的AB输出是否为高找零显示不对补码减法电路加减控制信号接反核对减法器进位输入是否固定接1取反是否完成上电后数码管显示随机数字寄存器上电状态不确定加手动复位电路上电后先按复位键4.2 状态机卡死的高频原因与复位设计状态机卡死是我见过最普遍的问题。所谓卡死就是无论你怎么按按键系统都停在一个状态不动作。最常见的两个原因一个是D触发器的时钟没有正常到达另一个是复位信号一直被拉低导致触发器始终处于复位状态。这里特别想强调复位设计。74LS74的CLR引脚是异步复位端低电平有效。如果你把CLR直接接地那么触发器永远处于复位状态时钟再对也不工作。有些同学为了方便把复位引脚悬空这样更危险TTL芯片悬空输入会识别为高电平看似“应该”不复位但干扰信号一来就可能误复位。正确做法是CLR经过一个10kΩ上拉电阻接VCC再通过一个按键接到地按下按键时CLR拉低实现手动复位平时CLR保持高电平复位信号不干扰工作。复位信号还要保证整块板子同步。我当时把复位按键的信号同时接到所有D触发器的CLR引脚确保状态寄存器和金额寄存器一起清零否则可能出现状态机已经回到S0但金额寄存器还残留旧值的情况系统逻辑就乱了。4.3 几个让课设完整度更高的扩展点如果时间和精力允许可以在基础功能之外加一些扩展提升课设的完成度和报告质量。扩展成两种商品是很自然的方向。单价分别设为2元和2.5元的话需要两个比较器分别比较当前金额和两个价格再通过选择按键确定买哪个。状态机可以增加一个“价格选择”状态用两个选择键分别对应商品A和商品B。另一个比较推荐的扩展是用Verilog或VHDL把系统重新实现一遍。这不是说要放弃74系列芯片改做FPGA而是作为对比验证在报告里可以写“本系统同时用硬件描述语言进行行为级仿真验证了逻辑设计的正确性”。我当时在Quartus里用Verilog写了一个状态机版本代码量很小但反映了对设计本质的理解。这里给一个状态判断的小片段作为参考wire enough (money 5); always (posedge clk or negedge rst_n) begin if (!rst_n) state S0; else begin case (state) S0: state (coin) ? S1 : S0; S1: state (enough) ? S2 : S1; S2: state (buy) ? S3 : S2; S3: state S0; endcase end end这段代码和74系列芯片搭建的状态机完全是同一个逻辑芯片方案是逐级硬件连线Verilog方案是用代码描述状态迁移。能在报告里把两种方式对应起来说明你不是只会照着图纸插线而是真正理解了状态机的本质。最后再分享一个我自己的体会。自动售货机这个课设本质上考的是能不能把一个生活中的顺序流程抽象成状态图再一步步翻译成寄存器、加法器、比较器的组合。画好状态转换图电路只是这个图的物理实现。如果你卡在某个环节先回到状态图检查逻辑再查电路效率会高很多。做完这个课设以后看到任何带“流程”“顺序”的问题第一反应都会是想能不能用状态机去建模这个思维习惯还挺值钱的。本文还有配套的精品资源点击获取
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻