ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Multisim仿真八位流水灯:D触发器与74LS138时序逻辑设计

Multisim仿真八位流水灯:D触发器与74LS138时序逻辑设计 1. 项目概述与总体设计思路1.1 做这个项目的初衷流水灯这个东西在数字电路学习中几乎是绕不开的一个经典课题。很多人第一次接触它可能是在单片机课上用Keil写个for循环把端口电平一个个写过去就完事了。但说实话那种做法对理解数字电路的本质帮助不大因为流水灯背后的核心其实是时序逻辑数据在时钟的驱动下逐级移动形成一个循环往复的状态序列。我这次选择用Multisim做仿真主要原因是它上手快、元件库全不需要真买一堆74系列芯片和面包板改参数、看波形都特别方便。整套电路的核心器件是74LS138译码器和D触发器用它们组合出一个八位流水灯效果。你可能会问为什么不用现成的移位寄存器芯片比如74LS164或CD4015反而要绕一圈用D触发器加译码器这个我在下面会详细解释这里先提前说一句这个方案的真正价值不在点亮八个灯本身而在于它逼你把计数器、译码器、时序关系这几个数字电路最基础的知识点串起来用一遍。1.2 方案选型与替代方案对比在动手搭建之前我先做了几版方案对比这也是我在做项目时的一个习惯先列几个可行的路线评估完再动手而不是拿起鼠标就开画。这里把当时考虑的几种方案整理出来方案核心器件优点缺点方案A555定时器 74LS138译码器电路简单只体现译码功能无法体现时序逻辑换个花样要改硬件方案BD触发器级联成移位寄存器 74LS138时序、译码、组合逻辑全覆盖器件数量略多初次上手要理解环形计数器方案C直接用74LS194/74LS164移位寄存器连线最少效果直接内部原理被芯片封装吞掉了学习价值低我最终选了方案B。理由很简单这个项目的目的不是做产品而是搞懂原理。74LS194是很方便一接上去就能看到流水效果但你很难直观地理解数据是怎么在触发器之间接力的。而用D触发器级联你能清晰地看到每个触发器的输出波形理解时钟上升沿到来时数据如何从高位传向低位或反向这对后续学状态机、学时序分析都有帮助。1.3 整体功能与预期效果这个电路最终要实现的效果是八个LED依次点亮形成灯光从一端向另一端流动的视觉效果。通过调整时钟频率可以快慢可调通过接74LS138的地址输入端还可以实现不同点亮方式的切换——当然这是扩展玩法基础版先把连续的流水效果跑通。用一句话概括这个系统的输入输出关系外部提供一个方波时钟信号可由555或信号发生器提供D触发器组成的移位寄存器在时钟边沿驱动下产生8个依次有效的高/低电平状态再经过74LS138译码如果用它做选通和驱动后控制8个LED按要求点亮。说到这有人可能会问D触发器组成的环形计数器本身就能直接输出8个状态为什么还要加74LS138这里有一个核心区别环形计数器的输出是独热码one-hot8个输出里同时只有1个为1它天然就可以直接驱动LED的流水效果。而74LS138做的事情其实是在你用二进制计数器比如3个D触发器的情况下把3位二进制计数结果展开成8路独立输出。换句话说如果把D触发器当成大脑那74LS138就是解码器把计数器的状态翻译成人眼能看到的灯的位置。在仿真中我两种接法都会演示因为这两种接法各有用武之地搞懂以后画板子、写Verilog都能用得上。2. D触发器与环形计数器流水灯的灵魂2.1 D触发器的工作方式与记忆本质要理解整个电路必须先吃透D触发器。D触发器在数字电路里的角色可以理解成一个带闸门的存储单元。它有一个数据输入端D、一个时钟输入端CLK和一个输出端Q。在时钟CLK的上升沿从0跳变到1的那一瞬间D端的数据被锁存到内部并反映到Q端而在其他时间无论D端怎么变化Q都保持不变。这个特性用一句话记忆时钟沿一到D端的值瞬间传到Q时钟走了Q自己稳住保持。这也就是为什么D触发器能用来做存储器、计数器、移位寄存器因为它们都需要某个时刻把数据锁住的能力。在Multisim里我用的是74LS74这个芯片它内部集成了两个独立的D触发器。画电路时别忘了每个74LS74有电源VCC和地GND引脚在Multisim某些版本里这些隐藏引脚默认已经接好电源但如果你用的是实际面包板断电和漏接电源是导致电路不工作的最常见原因。仿真时如果没有给逻辑芯片供电很多时候芯片会直接输出高阻态或不定态现象就是灯全灭或乱闪非常迷惑人。2.2 移位寄存器是怎么传数据的四路D触发器首尾相接就构成了移位寄存器。怎么接假设我用四个触发器分别命名为F0、F1、F2、F3把F0的Q接到F1的DF1的Q接到F2的DF2的Q接到F3的D这样一个触发器的输出就是下一个触发器的输入。现在给一个初始数据上电瞬间如果F0的D端为1其余为0那么在第一个时钟上升沿到来时F0的输出Q0变为1F1的输出Q1变为0不对仔细想一下第一个上升沿时F0的D端还是1Q0变1F1的D端在沿之前是F0初始输出Q0_initial假设0所以Q1保持0。第二个上升沿来时F0的D若已变为0则Q0变0而F1的D是Q0上一步的1所以Q1变1。数据就是这样一步一步向后传的。这就是流水的本质每个时钟上升沿原有的1状态向后移动一位。如果你把八个D触发器的Q端分别接上八个LED那一圈接完当然就看出一个灯光在跑。这里有一个很多人会搞混的点级联方向。有的资料说Q0接D1、Q1接D2这是从右往左流也有人喜欢反向接的那是从左往右流。效果无所谓关键是每个触发器的Q必须接到相邻触发器的D不能跳级也不能同时接到两个D端除非你想做特殊的预置功能。2.3 环形计数器让灯转圈跑的关键反馈但是问题来了按照上面的接法数据传到最后一位之后就没了。要想让它循环起来必须把最后一位的输出反馈到第一位的输入。比如八位流水灯把F7的Q接到F0的D这就构成了环形计数器。此时F0的D不再是外部手动给定的信号而是来自F7的Q。这样一来只要系统初值正确1状态会在闭合的环里永远转下去灯的流水效果就能自动循环。这里非常关键的一点是初值预置。仿真刚开始时所有触发器输出往往是0也可能是随机的X态如果全是0环形计数器会陷入死锁不管来多少个时钟所有D端都是0永远没有1冒出来灯全灭。所以必须想办法让某个触发器初始输出为1。常见做法有两种利用D触发器的异步置位端PR或PRE和清零端CLR在启动瞬间给第一个触发器置1其余清零。在Multisim仿真中手动设置初始逻辑状态。比如按一下某个按键给第一级的D端一个短暂的高电平先把1注入环内然后再拨到闭环状态。第一种做法更贴近硬件实际。74LS74的PR端Preset是低电平有效给它一个短暂的低脉冲Q立即置1这个操作不受时钟控制所以叫异步置位。实际建模仿真时我会用两个开关分别控制置位和清零上电后先按一下置位开关再放开然后开启时钟流水效果就出来了。2.4 为什么还要一个74LS138刚才说了八个D触发器环形计数器的输出本身就是独热码任意时刻8个输出中恰好1个为1。这样直接接LED已经能实现流水灯了。那74LS138的角色到底是什么74LS138是一个3线—8线译码器。输入端有3根地址线A、B、C和3个使能端输出8个引脚每个时刻只有一个输出有效低电平有效。它接收一个二进制编码的输入并把对应的那一路输出拉低。现代单片机里也很常见比如扩展IO口当你只有3个引脚却要控制8个LED时就能派上用场。在我们的系统里如果把三个D触发器接成三位二进制计数器而不是8位环形计数器那么74LS138就负责把000、001、010……111这8个状态翻译成对应的一路LED点亮。用这种方式写出来的电路器件总数可能更少3个D触发器1个74LS138比8个D触发器省了不少。流水效果和前面完全一样但数据形态完全不同——前者是独热码直接点亮后者是二进制计数译码点亮。我把这两种方案都做了一遍仿真目的就是让你看清同一个功能电路结构可以完全不同关键在于你想让学生或读者掌握哪种设计思路。3. 从零搭电路Multisim实操全过程3.1 元件清单与选型细节在打开Multisim之前先列一份元件清单标好数量避免画到一半到处找元件元件型号数量用途D触发器74LS74N4片每片含2个触发器构成八位环形计数器/移位寄存器3线-8线译码器74LS138N1片译码输出控制LEDLEDLED_RED或LED_GREEN8个显示流水效果电阻330Ω或470Ω8个LED限流时钟源函数信号发生器或555电路1个提供方波时钟开关/按键逻辑开关2个预置信控制电源VCC5V和GND—芯片供电选择74LS74而不是CMOS版74HC74的原因是Multisim自带的仿真模型兼容性好而且在TTL电平下逻辑电平明确不容易出现CMOS悬空输入导致的各种神秘现象。如果你手头只有74HC74也可以替代只要注意电源电压为3.3V或5V即可Multisim仿真里逻辑电平接收基本无差别。关于LED限流电阻的计算74LS系列芯片的灌电流/拉电流能力有限。74LS138在输出低电平时最大灌电流可以达到8mA左右此时LED的正向压降若是2V电源5V限流电阻R (5-2)/0.008 ≈ 375Ω所以选470Ω比较安全如果用330Ω电流大约9mA稍微超过芯片极限但在仿真里不太会烧实际硬件就得注意。共阴接法LED阴极接74LS138输出阳极通过电阻接5V时由于74LS138输出低电平有效正好用低电平点亮LED逻辑直观。3.2 环形计数器侧的连线顺序先用四片74LS74搭出八位环形计数器。每一个D触发器拿两个出来用。Multisim元件库路径一般为Place Component - Group: TTL - Family: 74LS - Component: 74LS74N - OK。对于八位环形计数器把8个D触发器编号为F0~F7。线路规则每个触发器的Q连接到下一级的DF0-F1、F1-F2……F7-F0。每个触发器的CLR清零端短接在一起接一个逻辑开关开关另一端接高电平否则清零端悬空状态不定。在仿真里Multisim的TTL芯片输入引脚悬空默认相当于高电平但这不代表我们不需要接——你最好明确拉高或拉低减少变量。第一个触发器F0的PR端再接另一个逻辑开关开关另一端接高电平按下时接地低有效用来预置1。其余触发器的PR端接高电平禁用它。每个触发器的D端不要有多余的分支除了前一级的Q之外不再输入其他信号。接线时最容易出的问题是Multisim里元件引脚密集放大视图后容易把线接到相邻引脚的网格上导致逻辑关系错误但肉眼看起来没错。我的经验是在连线完成后把鼠标移到每条线上用CtrlR/CtrlM做翻转对齐再用Simulate - Instruments - Logic Analyzer观察几个关键节点确认接线后再继续接下一部分。3.3 时钟与反馈为什么时钟频率要从慢到快时钟源我选用Multisim的Function Generator函数信号发生器设置参数如下波形方波Square频率1 Hz刚开始调试时用1Hz慢速肉眼能看清单个灯的移动调通了以后再提高到10Hz或更高感受连续性幅值5VTTL兼容占空比50%你可能会想既然是流水灯当然越快越好为什么一开始要用1Hz我刚接触仿真时也吃过这个亏一上来就设50Hz结果灯闪成一片根本分辨不清是数据传错了还是方向错了。调试时序逻辑电路的第一原则放慢时钟让状态看得见。把函数信号发生器的输出接在每个D触发器的CLK端。如果八个触发器的时钟都接同一个节点那它们会在同一时刻动作这是保证同步时序的基础。很多新手在这里会犯的一个错误是时钟信号线一个一个连过去中途不小心连错到别的引脚导致某些触发器采集时钟沿的时间不一致流水顺序就乱了。仿真中的连线建议用总线Bus连接或者命名一个CLK网络标签把八个CLK引脚全部用相同标签连接。Multisim里按CtrlShiftB创建总线或者直接在连线上右键选择Place Net Name命名网络这样一眼就能看出哪些引脚是同一个时钟网络避免乱飞线。3.4 74LS138译码实现三种使能端一个都不能错74LS138的引脚名称容易把人绕晕它有G1使能高电平有效、G2A和G2B使能低电平有效。三个使能端通过一个与逻辑控制芯片是否工作。只有G11、G2A0、G2B0时译码功能才生效输出端才有正确的译码结果。只要有一个条件不满足所有输出都无效全部高电平不点亮LED。我在互联时这样接G1接VCC逻辑1G2A接GND逻辑0G2B接GND逻辑0地址输入C、B、A分别接环形计数器的高三位输出如Q7、Q6、Q5这里有个容易忽视的点由于74LS138是低电平有效它的输出Y0~Y7中被选中的那一脚为低电平其余均为高电平。如果直接用输出引脚驱动LED必须采用LED阳极通过电阻接VCC、阴极接74LS138输出的形式也就是常说的灌电流驱动方式。如果你把LED接成高电平点亮阳极接74LS138输出那就把逻辑反了——灯会变成七个亮、一个灭效果正好相反。如果你的实际方案是D触发器直驱LED不经过74LS138那就是另一种极性逻辑74LS74的输出高电平时LED亮所以LED阳极通过限流电阻接触发器Q阴极接地即可。两种接法我都验证过备注在原理图里方便对比。3.5 一次点亮启动步骤和参数设置整机连线完成后我先做静态检查打开Simulate - Instrument - Multimeter分别测量电源电压是否5V、地线是否接通、芯片电源引脚是否都有电压。然后按下面的顺序上电启动先断开时钟源把函数信号发生器的输出开关关闭。所有D触发器清零CLR端给一个短暂的低电平脉冲按一下清零开关再松开。给F0预置1按下F0的PR开关再松开此时F0的Q应为1其余Q为0。开启时钟源频率1Hz观察LED。实测正常情况下你会看到八个LED中最初只有第1个亮下一秒第2个亮再下一秒第3个亮依次传递循环往复。如果发现跳的步长不对、一次亮两个、或者直接全灭大概率是以下原因之一时钟没有同步接到所有触发器部分触发器没有变化。反馈线F7-F0没接导致1状态传到F7就消失。初始化失败环里没有1状态或环里有多个1状态导致多个灯同时亮。74LS138使能引脚接错导致输出错误。4. 仿真调试与常见问题排查4.1 用逻辑分析仪检查关键波形Multisim里最强大的调试工具就是逻辑分析仪Logic Analyzer。它可以在一个界面里同时显示多路信号的时序关系这对于观察环形计数器的8路输出特别方便。在菜单Simulate - Instruments - Logic Analyzer中启动然后把这个仪器的16个通道分别接到F0~F7的输出上。设置采样时钟为1kHz远快于流水灯工作频率触发方式选上升沿触发。运行仿真后你会看到8路波形像楼梯一样依次起落。这里做个简单的时序分析假设时钟周期为TF0的Q输出的上升沿比F1的Q输出的上升沿滞后恰好一个T。如果实际波形中发现有些输出同时变化说明两个触发器之间的数据链路存在问题比如F1的D端接到了F0的Q之外的其他信号或者反馈路径有分支产生了竞争。再讲一个实用的观察技巧设置逻辑分析仪的触发条件为Channel 0上升沿或者Pattern触发先把波形稳定下来再分析。如果没有触发波形会乱跑你很难稳定地看到某个周期下的完整状态序列。把触发设置对了整个8路状态转移图就像查真值表一样一目了然。4.2 仿真报错数据库访问问题写到这里我必须提一下Multisim数据库访问错误这个高频问题。在爽快地画电路之前很多人在软件打开或放置元件时会遇到数据库访问发生错误或主数据库无法访问之类的弹窗这在首次安装或绿色版软件里特别常见。这个问题通常和Multisim的Database路径设置有关。解决办法是关闭Multisim。找到安装目录下的database文件夹检查是否有写权限有时需要以管理员身份运行软件。在菜单Options - Global Preferences - Database中把数据库路径重新指向默认目录例如C:\Users\Public\Documents\National Instruments\Circuit Design Suite 14.x或修复安装。如果软件本身打不开或者元件库加载不出来还有一个比较省事的办法开始菜单 - NI License Manager或NI Launcher里修复授权然后重新启动。实测下来绝大部分问题出在安装不完整或杀毒软件误删了数据库文件重新安装能解决的占到八成以上。4.3 仿真速度变慢或仪器不全怎么处理Multisim在仿真大型电路时速度会有明显下降。我见过有人把1Hz时钟和1000Hz采样率同时跑逻辑分析仪大量采样结果仿真界面卡成PPT。这里有几个优化手段把仿真速度调到最快Simulate - Mixed-Mode Simulation Settings中把Simulation speed调到Fast。减少不必要的高频信号源时钟频率能低就低尤其是调试阶段够肉眼观察就行。逻辑分析仪的采样率不要设置成远高于信号频率合适即可。比如时钟频率1Hz采样率100Hz就足够设太高会生成大量数据拖慢波形刷新。关闭电压表/电流表的实时刷新如果用多个万用表建议在关键节点测完再断开避免每个仿真步长都触发测量更新。使用真实芯片型号的仿真模型部分用户会发现Multisim仪器不全或某些虚拟仪器不可用。这个多半是版本功能差异比如简化版没有逻辑分析仪。如果找不到可以改用示波器观察单点波形或者用四个探针同时看也能达到类似效果。顺带说一个非常容易被忽略的点Multisim绿色汉化版经常出现仪器面板显示不全或界面错乱的问题这种版本在关键作业中不可靠。我的建议是尽量用官方安装包先装英文版运行正常后再按需汉化。4.4 调试心得从波形反推电路错误做了这么多年数字电路仿真我最大的体会是几乎所有连线错误都能在波形上看出端倪。给新手一个系统的排查流程先看时钟信号CLK节点是否有方波幅值、频率是否符合预期。连时钟都没有后面全白搭。再看第一级触发器F0的Q波形是否跳变。如果F0不工作检查PR/CLR初始化是否操作正确D端是否来自正确来源。依次看各级级联信号F1是否比F0延迟一个周期。如果延迟周期数不对检查该级D端连线。最后看LED两端电压确认74LS138译码输出极性或者D触发器直驱时Q端到地的电平是否正确。这个顺序本质上就是从源头到末端逐级验证。很多新手一上来就盯着最终的LED看灯不亮就抓瞎——但实际上只要花两分钟看一下中间级波形问题立刻定位。4.5 从仿真到实物还能怎么玩仿真调通之后如果你有真芯片和面包板完全可以照图搭一个实物版本。TIPS实物焊接或插面包板时74LS74的CLR和PR引脚如果不用必须接高电平否则悬空引脚拾取噪声会导致触发器误翻转。没有函数信号发生器时用555定时器构成多谐振荡器产生时钟频率用可调电阻调节就能实现旋钮调速度。如果想给这盏流水灯加入方向控制来回往返、左右循环可以把环形计数器换成双向移位寄存器思路或者用逻辑门做方向选择把反馈路径在两个方向间切换。更高阶玩法把74LS138的地址线接到一个3bit二进制计数器上然后在时钟到来时改变计数初值实现闪烁、跳跃、单点跑、双点跑等多种模式切换。我觉得这才是做数字电路实验的正确姿势先仿真验证逻辑再搭硬件烧脑最后加功能拓展思维。仿真只是第一步千万别止步于此。设置好关键参数一步步把电路搭起来用逻辑分析仪和示波器调试期间遇到的问题一个一个记录下来——这一趟下来你对74LS138和D触发器的理解绝对比单纯背十遍真值表要深刻得多。我在实际调试中还有一个习惯每次跑仿真前都会先截图保存一次逻辑分析仪的波形图标好日期和参数这样回头对比时能清晰看到修改了什么之后波形发生什么变化。虽然Multisim的波形显示可以刷新重来但截图对比是排查改了一根线之后效果反而更糟这类问题的最佳武器。希望这篇内容能帮你在流水灯这个经典项目上少走几个弯路把这套看时序、查波形、调参数的数字电路调试方法真正变成自己的内功。
返回列表