手把手教你用74LS161芯片搭建M=20计数器(附Quartus II仿真步骤)
手把手教你用74LS161芯片搭建M=20计数器(附Quartus II仿真步骤)
最近在整理实验室的旧资料,翻出了几片经典的74LS161芯片,不禁想起当年在数字电路实验课上,为了搭出一个能正常工作的计数器,和面包板、跳线“搏斗”的时光。对于电子工程专业的初学者,或者正在学习数字逻辑设计的同学来说,理解计数器的工作原理并将其从理论图纸变为实际可运行的电路,是至关重要的一步。这篇文章,我们就来聚焦一个非常经典且实用的项目:使用74LS161同步二进制计数器,构建一个模20(M=20)的计数器。我们将完全从实际操作的角度出发,不仅会讲清楚芯片如何级联、如何设置反馈逻辑实现任意模值,更会带你一步步在Quartus II软件中完成从原理图绘制到波形仿真的全过程,过程中可能遇到的编译错误、引脚设置问题,我们也会一并探讨解决方案。无论你是为了完成课程设计,还是单纯想夯实数字电路的基础,这篇详尽的指南都将为你提供清晰的路径。
1. 理解核心:74LS161芯片与模N计数器设计原理
在动手连接任何一根导线或点击任何一个软件按钮之前,我们必须先吃透手中的“武器”——74LS161,以及我们想要实现的“目标”——模20计数器。这能让你在后续操作中知其然,更知其所以然,即便遇到问题也能快速定位。
74LS161是一颗经典的4位同步二进制加法计数器。所谓“同步”,是指其内部所有触发器都在同一个时钟脉冲(CLK)的边沿(通常是上升沿)同时动作,这比异步计数器有更快的速度和更稳定的输出。“4位”意味着它单颗芯片的计数范围是0到15(2^4 - 1)。它有几个关键的控制引脚,决定了它的工作模式:
- CLK (Clock): 时钟输入端,上升沿触发计数。
- CLRN (Clear, 异步清零): 低电平有效。当它为低电平时,立即将输出Qa-Qd清零,不受时钟控制。
- LDN (Load, 同步置数): 低电平有效。在下一个时钟上升沿到来时,将输入端A-D的数据并行装载到输出端Qa-Qd。
- ENP, ENT (计数使能): 两者都为高电平时,芯片才在时钟上升沿进行计数。ENT还影响到进位输出RCO。
- RCO (Ripple Carry Output, 进位输出): 当计数达到最大值(15)且ENT为高时,RCO输出高电平,用于芯片级联。
那么,如何用这颗最大只能数到15的芯片,来数到19呢?答案就是芯片级联。模20(0-19)需要至少5位二进制数来表示(2^5=32 > 20)。因此,我们需要两颗74LS161。我们将第一颗芯片作为低4位(Bit0-Bit3),第二颗芯片的最低有效位作为第5位(Bit4)。这样,两级芯片串联,构成了一个5位计数器,理论计数范围是0-31。
接下来的核心技巧在于反馈归零法。我们不是让这个5位计数器自由地从0数到31,而是要在它数到目标值“19”的瞬间,强制它在下个时钟周期回到0。19的二进制是10011(对应Q4 Q3 Q2 Q1 Q0,其中Q4来自第二片芯片的QA,Q0-Q3来自第一片芯片的QD-QA)。我们的逻辑是:检测到这个特定的二进制状态(10011),并产生一个有效的控制信号。通常,我们会选择利用同步置数或异步清零功能来实现归零。
注意:使用异步清零(CLRN)在检测到状态19时立即清零,会产生一个极短暂的“毛刺”状态(19→0),这在实际电路中可能引发问题。而使用同步置数(LDN),在状态19的时钟周期内准备好置数数据0,并在下一个时钟上升沿稳定地加载0,是更可靠、更常用的方法。本文将以同步置数法为例进行设计。
2. 硬件电路设计与引脚连接规划
理解了原理,我们就可以在纸上(或直接在EDA软件中)规划电路连接了。这是将思路转化为具体操作的关键一步。
我们计划使用同步置数法。这意味着,当计数器输出为19(10011)时,我们需要让LDN引脚变为低电平,同时在数据输入端A-D准备好要置入的数“0000”。这样,在下一个CLK上升沿,计数器就会从19跳转到0。
主要连接步骤如下:
- 时钟连接:将外部时钟信号直接连接到第一片74LS161(低位片)的CLK引脚。同时,将第一片的进位输出RCO连接到第二片(高位片)的ENT使能端。第二片的CLK也连接至同一个外部时钟。这样,只有当低位片计满(达到15)且使能有效时,高位片才会在下一个时钟脉冲计数一次,实现了正确的级联进位。
- 使能设置:将两片芯片的ENP和ENT(对于低位片,ENT接高电平或控制逻辑)都接高电平(Vcc),确保它们处于允许计数状态。
- 反馈逻辑设计:这是实现模20的核心。我们需要在输出为10011时,让LDN=0。
- 观察10011:对应高位片的QA=1(Q4),低位片的QA=1(Q0)和QB=1(Q1)。注意,低位片的QC对应Q2=0,QD对应Q3=0。
- 因此,我们可以将高位片的QA、低位片的QA和QB,这三个输出端连接到一个三输入与门的输入端。与门的输出即为“状态19检测信号”。
- 但是,74LS161的LDN是低电平有效。我们需要的是在状态19时给出低电平。所以,我们应该使用一个与非门。将上述三个输出接入一个三输入与非门,当且仅当三者全为1时,与非门输出0,正好作为LDN的有效信号。
- 置数数据端连接:为了实现归零,我们需要将两片芯片的置数数据输入端A、B、C、D全部接地(逻辑0)。这样,当LDN有效时,加载的数据就是“00000”。
- 清零端处理:异步清零端CLRN在本设计中不使用,为了避免误动作,应将其接高电平(Vcc)。
- 溢出信号OV生成:题目要求计数值为19时,溢出信号OV输出高电平。这个信号恰好就是我们前面用于检测状态19的信号的反相。既然我们用与非门在状态19时输出了低电平(给LDN),那么我们只需要将这个信号再通过一个非门反相,就能得到高电平有效的OV信号。或者,可以直接用与门生成状态19检测信号(高电平有效),一路反相后给LDN,另一路直接作为OV。
为了更清晰地展示芯片间的连接关系,我们可以用以下表格来梳理关键信号:
| 信号名称 | 来源 | 目的地 | 功能说明 |
|---|---|---|---|
| 系统CLK | 外部时钟源 | 芯片1(低)CLK, 芯片2(高)CLK | 提供同步时钟 |
| 芯片1 RCO | 芯片1引脚RCO | 芯片2 ENT | 低位片计满时使能高位片计数 |
| 反馈信号 | 芯片2 QA, 芯片1 QA, QB | 三输入与非门输入端 | 检测二进制状态10011 (19) |
| LDN控制 | 三输入与非门输出 | 芯片1 LDN, 芯片2 LDN | 状态19时变为低电平,触发同步置零 |
| 数据输入 A-D | 逻辑地 (GND) | 芯片1 & 芯片2 的 A, B, C, D引脚 | 置数时加载的数据全为0 |
| OV输出 | 三输入与非门输出 | 非门(或与门输出直接) | 状态19周期内输出高电平 |
3. Quartus II 9.0 原理图输入与编译
现在,我们进入软件操作环节。我们将使用Altera的Quartus II 9.0(Web Edition版本即可)来完成数字电路的设计与仿真。这个版本虽然较老,但其核心功能对于此类基础设计完全够用,且界面直观。
3.1 创建新工程
首先,为你的设计建立一个专属的工作目录,避免文件混乱。
- 启动Quartus II 9.0。
- 点击菜单栏
File->New Project Wizard。 - 目录、名称、顶层实体:在第一个页面,浏览选择你创建的工作目录。在“Project name”中输入项目名,例如
M20_Counter。最关键的一步:“Top-level design entity”必须与项目名一致,也输入M20_Counter。这定义了设计的顶层模块名。 - 添加文件:下一页,如果你有已存在的设计文件可以添加,否则直接点“Next”。
- 器件选择:在“Family”中选择一个器件系列,例如“Cyclone II”。对于仿真而言,具体型号影响不大,你可以选择一个通用的型号如
EP2C5T144C6,或者直接选择“Auto device selected by the Fitter”。取消“Show in Available device list”下方的所有封装、引脚数等限制,以加快筛选速度。 - EDA工具设置:后续页面关于第三方EDA工具的设置,保持默认即可。
- 总结:最后确认信息无误,点击“Finish”完成工程创建。
3.2 绘制原理图 (Block Diagram/Schematic)
工程创建好后,我们需要绘制电路图。
- 点击
File->New,在弹出的对话框中选择Design Files标签页下的Block Diagram/Schematic File,点击“OK”。这将打开一个空白的原理图编辑窗口。 - 放置元件:在空白处双击,会弹出“Symbol”对话框。这就是我们的元件库。
- 首先放置两个74LS161芯片。在“Libraries”栏,展开
others->maxplus2库(这是Quartus II兼容老版本元件的库),找到74161元件,点击“OK”,然后在原理图上点击两次放置两个实例。你可以将其重命名为U1和U2。 - 放置逻辑门。同样双击空白处,在
primitives->logic库中找到nand3(三输入与非门)和not(非门),各放置一个。 - 放置输入输出端口。在
primitives->pin库中找到input和output引脚。我们需要一个input引脚作为时钟CLK,一个output引脚作为溢出指示OV。还需要将两个芯片的5位输出引出,可以放置5个output引脚,或者使用总线形式。为简单起见,我们先放置5个单独的output引脚,分别命名为Q0, Q1, Q2, Q3, Q4。
- 首先放置两个74LS161芯片。在“Libraries”栏,展开
- 连接导线与命名网络:
- 使用左侧工具栏的“Orthogonal Node Tool”(直角连线工具)或“Conduit Tool”(总线工具)进行连接。
- 按照第二节设计的方案进行连接:
- 连接CLK输入引脚到U1和U2的CLK引脚。
- 连接U1的RCO到U2的ENT。
- 将U1和U2的ENP、ENT(U1的ENT)接高电平(
VCC,在primitives->other库中)。将两片芯片的CLRN也接高电平(VCC)。 - 将两片芯片的A、B、C、D数据输入端全部接地(
GND,在primitives->other库中)。 - 连接反馈逻辑:将U2的QA、U1的QA、U1的QB三个输出连接到
nand3的三个输入端。 - 将
nand3的输出连接到U1和U2的LDN引脚。 - 将
nand3的输出再连接到not非门的输入,将非门的输出连接到OV输出引脚。 - 最后,将U1的QA、QB、QC、QD分别连接到输出引脚Q0、Q1、Q2、Q3;将U2的QA连接到输出引脚Q4。
- 保存文件:点击
File->Save As,确保保存为.bdf文件,并且文件名最好与顶层实体名一致(M20_Counter.bdf)。
3.3 编译工程与排错
原理图绘制完成后,必须经过编译(Compilation),软件才会对其进行综合、布局布线等处理,并检查错误。
- 点击工具栏上那个紫色的“Start Compilation”三角形按钮(或Processing -> Start Compilation)。
- 编译过程会在下方“Messages”窗口显示信息。如果一切顺利,你会看到“Full Compilation was successful”的提示。
- 常见编译错误与解决:
- Error (12006): Node “xxx” is missing source... 或 Warning (13024): Output pins are stuck at VCC or GND:这通常是因为某些引脚没有正确连接,悬空了。请仔细检查所有输入输出引脚、电源和地是否都已连接。特别是
VCC和GND符号,必须连接到每个需要它们的引脚。 - Error (12152): Can’t elaborate user hierarchy “xxx”:可能原理图中有未定义的模块或连接线存在歧义。检查所有元件是否来自正确的库,连线是否在交叉点正确连接(连接点应有实心圆点)。
- Critical Warning (332012): Synopsys Design Constraints File file not found...:这是一个关于时序约束的警告,对于我们的功能仿真可以暂时忽略。
- Error (12006): Node “xxx” is missing source... 或 Warning (13024): Output pins are stuck at VCC or GND:这通常是因为某些引脚没有正确连接,悬空了。请仔细检查所有输入输出引脚、电源和地是否都已连接。特别是
如果遇到错误,双击“Messages”窗口中的错误信息,Quartus II通常会高亮显示原理图中相关的问题部分,方便定位。
4. 功能仿真验证设计
编译成功只代表语法和基本连接无误,电路逻辑是否正确,必须通过仿真(Simulation)来验证。我们将进行功能仿真(Functional Simulation),验证计数序列和溢出信号是否符合预期。
4.1 创建波形仿真文件
- 点击
File->New,选择University Program VWF(Vector Waveform File,大学计划波形文件)。这是Quartus II 9.0自带的一个简易仿真工具,适合基础功能验证。 - 在打开的波形编辑器窗口左侧“Name”空白处右键,选择
Insert Node or Bus...。 - 在弹出的对话框中,点击
Node Finder...按钮。 - 在“Node Finder”对话框中,点击
List按钮。这会将当前设计的所有输入输出端口(即我们定义的CLK、OV、Q0-Q4等引脚)列在下方“Nodes Found”窗口中。 - 选中所有节点(可以按住Ctrl键多选),点击右箭头
>>将它们添加到“Selected Nodes”窗口,然后点击“OK”。再点击“OK”关闭插入节点对话框。现在所有信号都出现在波形编辑器左侧。
4.2 设置输入激励与仿真参数
我们需要给输入信号(主要是CLK)赋予波形,以模拟实际的工作情况。
- 设置CLK时钟:在波形窗口中,点击“CLK”信号对应的“Value”区域,使其波形段被选中。然后点击工具栏上的“Overwrite Clock”图标(一个时钟波形图案)。在弹出的对话框中,设置时钟周期。例如,将“Period”设置为
50ns,占空比“Duty cycle”保持50%。点击“OK”。你会看到CLK信号变成了规则的方波。 - 设置仿真时间:在波形编辑器窗口的左侧,找到“Simulation time”区域。将仿真结束时间(End Time)设置为足够长,以观察到多个计数周期。例如,设置为
2us(微秒)。因为我们的时钟周期是50ns,模20计数需要20个时钟周期,即1000ns(1us),设置2us可以观察到两个完整的计数循环。 - 保存波形文件:点击
File->Save,将波形文件保存为.vwf文件,通常与工程名一致即可。
4.3 运行仿真并分析结果
- 点击工具栏上的“Start Functional Simulation”图标(一个带蓝色播放箭头的图标)。Quartus II会启动仿真引擎。
- 仿真结束后,会自动打开一个新的“Simulation Report”窗口,并显示仿真波形。
- 分析波形:
- 观察计数序列:重点关注Q4, Q3, Q2, Q1, Q0这5位输出。它们应该以二进制形式从
00000(0)开始,每个CLK上升沿加1,依次变为00001(1)、00010(2)……直到10011(19)。 - 验证归零逻辑:在计数值达到
10011(19)的那个时钟周期内,你应该能看到LDN信号(如果你把它也加入了波形观察列表)变为低电平。紧接着,在下一个CLK上升沿,计数器输出应该跳变回00000(0),而不是继续变成10100(20)。这是同步置数法成功的关键标志。 - 验证溢出信号OV:观察OV信号。它应该在计数值为19的整个时钟周期内保持高电平,在其他周期保持低电平。这与我们的设计需求完全一致。
- 检查进位:观察低位片(U1)的RCO信号和高位片(U2)的QA。RCO会在U1计到15(
1111)时变高,并在下一个时钟下降(当U1归零时)变低。U2的QA(即Q4)会在RCO有效且CLK上升沿时翻转,实现进位。
- 观察计数序列:重点关注Q4, Q3, Q2, Q1, Q0这5位输出。它们应该以二进制形式从
如果仿真波形与上述描述不符,比如计数器跳过了某个状态、没有在19归零、或者OV信号不对,就需要回到原理图,仔细检查反馈逻辑(与非门的输入连接是否正确)、置数端连接(是否全部接地)、以及使能端的连接(ENP, ENT是否均为高电平)。
5. 深入探讨:从仿真到实践的思考与优化建议
通过Quartus II的仿真,我们已经在理想环境下验证了设计的正确性。但这距离一个真正稳定可靠的硬件电路还有几步之遥。这里分享一些从仿真到面包板或PCB实践时需要关注的点,以及可能的优化方向。
时序考虑与毛刺问题:我们采用的是同步置数法,这本身比异步清零法更能避免毛刺。但在高速时钟下,仍需关注逻辑门的传播延迟。从计数器输出变化,到经过与非门、非门产生OV信号,存在一个微小延迟。如果OV信号需要驱动其他同步电路,这个延迟必须在系统时钟周期内稳定下来。在Quartus II中,你可以进行时序仿真(Timing Simulation),它会考虑器件内部的真实延迟,给出更接近实际的结果。如果时序仿真失败(出现亚稳态或错误),可能需要降低系统时钟频率,或优化关键路径。
资源利用与扩展性:我们用了两片4位计数器实现了一个5位模20计数器。实际上,74LS161的功能很灵活。你可以尝试只用一片74LS161,结合同步置数功能,实现10进制、12进制等小于16的计数器。对于更大的模值,级联更多芯片即可。设计思路是相通的:确定所需位数,用反馈逻辑检测“模值-1”的状态,并控制LDN或CLRN。
在Quartus II中尝试其他设计方法:除了原理图输入,Quartus II也支持硬件描述语言(HDL)如VHDL或Verilog。用代码来描述同样的模20计数器会更加简洁。例如,一个简单的行为级Verilog描述可能只需要十几行代码。这对于复杂设计来说,可读性和可维护性远高于原理图。当你熟悉了基本概念后,强烈建议尝试用Verilog或VHDL重新实现这个计数器,并进行对比仿真,这能极大提升你的数字设计能力。
调试实战技巧:在实验室搭建实际电路时,如果计数器工作不正常,可以遵循以下步骤排查:
- 电源与地:用万用表确保所有芯片的Vcc和GND引脚电压正确且稳定。
- 时钟信号:用示波器检查CLK信号是否正常,幅度、频率是否符合要求,是否有毛刺。
- 静态电平:在时钟暂停时,用逻辑笔或万用表测量各个控制引脚(ENP, ENT, LDN, CLRN)的电平是否与设计一致。
- 动态跟踪:最好使用逻辑分析仪或多通道示波器,同时抓取CLK、关键输出位(如Q0, Q4)和OV信号,对照仿真波形逐一比对,可以快速定位是哪个环节的计数或逻辑出了问题。
最后,别忘了保存好你的Quartus II工程文件和仿真波形。它们不仅是这次设计的成果,更是未来回顾和复用经验的宝贵资料。数字电路的设计,正是在这种“理论-仿真-实践-调试”的循环中不断精进的。希望这个从芯片手册到仿真波形的完整流程,能帮你扎实地走好这一步。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)