手把手教你用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。

主要连接步骤如下:

  1. 时钟连接:将外部时钟信号直接连接到第一片74LS161(低位片)的CLK引脚。同时,将第一片的进位输出RCO连接到第二片(高位片)的ENT使能端。第二片的CLK也连接至同一个外部时钟。这样,只有当低位片计满(达到15)且使能有效时,高位片才会在下一个时钟脉冲计数一次,实现了正确的级联进位。
  2. 使能设置:将两片芯片的ENP和ENT(对于低位片,ENT接高电平或控制逻辑)都接高电平(Vcc),确保它们处于允许计数状态。
  3. 反馈逻辑设计:这是实现模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的有效信号。
  4. 置数数据端连接:为了实现归零,我们需要将两片芯片的置数数据输入端A、B、C、D全部接地(逻辑0)。这样,当LDN有效时,加载的数据就是“00000”。
  5. 清零端处理:异步清零端CLRN在本设计中不使用,为了避免误动作,应将其接高电平(Vcc)。
  6. 溢出信号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 创建新工程

首先,为你的设计建立一个专属的工作目录,避免文件混乱。

  1. 启动Quartus II 9.0。
  2. 点击菜单栏 File -> New Project Wizard。
  3. 目录、名称、顶层实体:在第一个页面,浏览选择你创建的工作目录。在“Project name”中输入项目名,例如 M20_Counter。最关键的一步:“Top-level design entity”必须与项目名一致,也输入 M20_Counter。这定义了设计的顶层模块名。
  4. 添加文件:下一页,如果你有已存在的设计文件可以添加,否则直接点“Next”。
  5. 器件选择:在“Family”中选择一个器件系列,例如“Cyclone II”。对于仿真而言,具体型号影响不大,你可以选择一个通用的型号如EP2C5T144C6,或者直接选择“Auto device selected by the Fitter”。取消“Show in Available device list”下方的所有封装、引脚数等限制,以加快筛选速度。
  6. EDA工具设置:后续页面关于第三方EDA工具的设置,保持默认即可。
  7. 总结:最后确认信息无误,点击“Finish”完成工程创建。

3.2 绘制原理图 (Block Diagram/Schematic)

工程创建好后,我们需要绘制电路图。

  1. 点击 File -> New,在弹出的对话框中选择 Design Files 标签页下的 Block Diagram/Schematic File,点击“OK”。这将打开一个空白的原理图编辑窗口。
  2. 放置元件:在空白处双击,会弹出“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。
  3. 连接导线与命名网络:
    • 使用左侧工具栏的“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。
  4. 保存文件:点击 File -> Save As,确保保存为 .bdf 文件,并且文件名最好与顶层实体名一致(M20_Counter.bdf)。

3.3 编译工程与排错

原理图绘制完成后,必须经过编译(Compilation),软件才会对其进行综合、布局布线等处理,并检查错误。

  1. 点击工具栏上那个紫色的“Start Compilation”三角形按钮(或Processing -> Start Compilation)。
  2. 编译过程会在下方“Messages”窗口显示信息。如果一切顺利,你会看到“Full Compilation was successful”的提示。
  3. 常见编译错误与解决:
    • 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...:这是一个关于时序约束的警告,对于我们的功能仿真可以暂时忽略。

如果遇到错误,双击“Messages”窗口中的错误信息,Quartus II通常会高亮显示原理图中相关的问题部分,方便定位。

4. 功能仿真验证设计

编译成功只代表语法和基本连接无误,电路逻辑是否正确,必须通过仿真(Simulation)来验证。我们将进行功能仿真(Functional Simulation),验证计数序列和溢出信号是否符合预期。

4.1 创建波形仿真文件

  1. 点击 File -> New,选择 University Program VWF(Vector Waveform File,大学计划波形文件)。这是Quartus II 9.0自带的一个简易仿真工具,适合基础功能验证。
  2. 在打开的波形编辑器窗口左侧“Name”空白处右键,选择 Insert Node or Bus...。
  3. 在弹出的对话框中,点击 Node Finder... 按钮。
  4. 在“Node Finder”对话框中,点击 List 按钮。这会将当前设计的所有输入输出端口(即我们定义的CLK、OV、Q0-Q4等引脚)列在下方“Nodes Found”窗口中。
  5. 选中所有节点(可以按住Ctrl键多选),点击右箭头 >> 将它们添加到“Selected Nodes”窗口,然后点击“OK”。再点击“OK”关闭插入节点对话框。现在所有信号都出现在波形编辑器左侧。

4.2 设置输入激励与仿真参数

我们需要给输入信号(主要是CLK)赋予波形,以模拟实际的工作情况。

  1. 设置CLK时钟:在波形窗口中,点击“CLK”信号对应的“Value”区域,使其波形段被选中。然后点击工具栏上的“Overwrite Clock”图标(一个时钟波形图案)。在弹出的对话框中,设置时钟周期。例如,将“Period”设置为50ns,占空比“Duty cycle”保持50%。点击“OK”。你会看到CLK信号变成了规则的方波。
  2. 设置仿真时间:在波形编辑器窗口的左侧,找到“Simulation time”区域。将仿真结束时间(End Time)设置为足够长,以观察到多个计数周期。例如,设置为2us(微秒)。因为我们的时钟周期是50ns,模20计数需要20个时钟周期,即1000ns(1us),设置2us可以观察到两个完整的计数循环。
  3. 保存波形文件:点击 File -> Save,将波形文件保存为 .vwf 文件,通常与工程名一致即可。

4.3 运行仿真并分析结果

  1. 点击工具栏上的“Start Functional Simulation”图标(一个带蓝色播放箭头的图标)。Quartus II会启动仿真引擎。
  2. 仿真结束后,会自动打开一个新的“Simulation Report”窗口,并显示仿真波形。
  3. 分析波形:
    • 观察计数序列:重点关注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上升沿时翻转,实现进位。

如果仿真波形与上述描述不符,比如计数器跳过了某个状态、没有在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重新实现这个计数器,并进行对比仿真,这能极大提升你的数字设计能力。

调试实战技巧:在实验室搭建实际电路时,如果计数器工作不正常,可以遵循以下步骤排查:

  1. 电源与地:用万用表确保所有芯片的Vcc和GND引脚电压正确且稳定。
  2. 时钟信号:用示波器检查CLK信号是否正常,幅度、频率是否符合要求,是否有毛刺。
  3. 静态电平:在时钟暂停时,用逻辑笔或万用表测量各个控制引脚(ENP, ENT, LDN, CLRN)的电平是否与设计一致。
  4. 动态跟踪:最好使用逻辑分析仪或多通道示波器,同时抓取CLK、关键输出位(如Q0, Q4)和OV信号,对照仿真波形逐一比对,可以快速定位是哪个环节的计数或逻辑出了问题。

最后,别忘了保存好你的Quartus II工程文件和仿真波形。它们不仅是这次设计的成果,更是未来回顾和复用经验的宝贵资料。数字电路的设计,正是在这种“理论-仿真-实践-调试”的循环中不断精进的。希望这个从芯片手册到仿真波形的完整流程,能帮你扎实地走好这一步。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐