ARTICLE DETAIL

资讯详情

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

74LS193任意进制计数器设计:从清零毛刺到模60电路实战

74LS193任意进制计数器设计:从清零毛刺到模60电路实战 做数字逻辑课设的时候我拿着74LS193在面包板上拼任意进制计数器第一次通电看到LED按自己设计的状态跳心里挺高兴结果用示波器一测清零端上全是窄毛刺后级电路时不时就误触发一次。后来把反馈清零改成反馈置数又把清零信号做了一次整形整个电路才真正稳定下来。这篇就围绕74LS193计数器在任意进制设计里的关键应用展开把原理、电路、实测踩坑和验证方法一次说透适合正在做数字逻辑实验、课程设计或者想用计数器搭分频器的朋友参考。1. 为什么是74LS193可预置、双时钟、异步控制带来的灵活性1.1 从芯片控制端看它的“先天优势”74LS193是一颗4位二进制同步加/减计数器但它的特殊之处不只在于“能加能减”更重要的是它把清除和置数都做成了异步操作。这个特性在做任意进制设计时非常关键只要组合逻辑检测到目标状态立刻就能让计数器回到初始值不需要像同步置数那样等待一个时钟边沿。它的主要控制端有这些MR清零端高电平有效只要MR为高无论时钟是什么状态输出QA~QD立即全为0PL置数端低电平有效PL为低时数据输入端A~D的值会异步装入计数器UP加计数时钟上升沿触发DOWN减计数时钟上升沿触发TCU和TCD是进位和借位输出主要用于片间级联。实际用的时候控制逻辑就是一张真值表。输入状态输出行为MR1QA~QD清零异步MR0PL0QA~QD装入A~D异步MR0PL1UP有上升沿加计数MR0PL1DOWN有上升沿减计数MR0PL1UP、DOWN均无上升沿保持重点说一下“异步”这两个字。很多同学在74LS16x系列上习惯了同步清零、同步置数转到74LS193后还总觉得要等时钟沿结果反馈逻辑接上去以后计数器状态乱跳。实际上74LS193的MR和PL都不是由时钟同步的它们一旦有效输出立刻响应。这个特性既是优点也是麻烦优点是反馈回路不用考虑时序窗口只要组合逻辑判断条件成立就能复位缺点是复位脉冲宽度完全取决于反馈路径的传播延迟非常窄后面章节会专门展开。1.2 与常用计数器对比193更适合哪些场景数字逻辑课上常见的计数器片很多这里列个对比表方便选型。器件工作方式清零方式置数方式典型场景74LS1934位二进制加/减双时钟异步高有效异步低有效任意进制、可逆计数、级联DIY74LS1604位BCD十进制加计数异步低有效同步低有效最简单的十进制计数74LS1614位二进制加计数异步低有效同步低有效通用二进制计数74LS1634位二进制加计数同步低有效同步低有效对毛刺敏感的高可靠分频CD4518双BCD加计数异步高有效无预置端低功耗CMOS简单十进制如果是做课设里的“模N计数器”我最常用的其实是74LS193而不是74LS161。原因是74LS161的复位虽然是异步的但它的置数是同步的用复位法做任意进制倒也没问题可一旦要多片级联、甚至做可逆计数74LS193更顺手。74LS163做成同步清零虽然波形漂亮但它的复位信号必须满足建立时间和保持时间很多新手在这里翻车复位信号持续太短计数器偶尔不复位。74LS193的异步清零和异步置数让反馈逻辑变得非常直接代价是脉冲毛刺要比同步方案多一点。我的建议很明确如果是课程验证优先用74LS193把任意进制的“逻辑闭环”跑通如果是产品设计老老实实选同步复位的计数器或CPLD/FPGA省得后续为毛刺问题头疼。2. 任意进制设计的两条路线反馈清零法和反馈置数法2.1 反馈清零法的实现原理与“M状态瞬态”问题反馈清零法的思路很简单计数器从0开始加计数当计数到目标模数M时让输出状态经过组合逻辑产生一个清零信号把计数器拉回0。以模12为例状态序列是0、1、2……11、12瞬态、0也就是说第12个脉冲到来后计数器瞬间变成1100这个状态被门电路捕捉到MR立即变高计数器被清回0000。这里需要特别注意反馈清零法检测的不是M-1而是M。很多人习惯写成“当计数到M-1时清零”那是同步复位思路放在74LS193这种异步清零芯片上反而会提前一个状态复位因为反馈信号一到MR立刻生效不需要等下一个时钟。正确做法是按状态表画出M对应的二进制编码用卡诺图化简后生成反馈方程。反馈方程通常写成这个样子如果检测状态N二进制表示为D3D2D1D0则清零信号F D3 × D2 × D1 × D0其中为1的位用原变量为0的位用反变量。做实际电路时可以适当化简但化简必须验证在0到M-1的计数序列里化简后的组合逻辑绝不能在其他状态也输出高电平否则会提前清零。M状态瞬态是反馈清零法最核心的问题因为MR是异步的反馈门一旦检测到M输出立刻变化经过门的传播延迟后MR生效输出被清零清零后M状态消失MR又恢复低电平。整个过程只有几十纳秒产生一个非常窄的负脉冲或者正脉冲取决于接法。如果后面还有其他电路这个窄脉冲可能被当作有效信号采到。2.2 反馈置数法的初值设置与输出区间选择反馈置数法避免让计数器跑到M状态而是在某个指定状态把预置值重新装入。最常见的做法是利用74LS193的PL端当输出达到上限值比如1111时PL拉低把A~D上的初值装入。循环长度等于上限值减初值再加1。举个例子如果想做模10分频可以把初值设为60110计数状态为6、7、8、9、10、11、12、13、14、15到达15后TCU输出进位信号同时把PL拉低下一轮又从6开始。这个电路输出并不是0~9而是6~15但频率关系完全正确每10个输入脉冲产生一个进位或置数脉冲。所以反馈置数法更常用于可编程分频器而不是需要输出自然0~N-1序列的计数器。如果要求输出从0开始也可以不用等待到1111改为在M-1状态触发PL并预置0。比如模12可以在状态111011时产生PL低电平数据端A~D全部接0这样计数器从11直接跳到0。这种做法的好处是不出现状态12所以不会产生“多出来一个状态”的瞬态但坏处是状态11的持续时间会被压缩如果你用LED显示可能看不出差异但用示波器看QA~QD会发现11状态明显比其它状态短。所以选择清零还是置数本质上是选择“M瞬态”还是“状态压缩”两个副作用。我个人倾向于验证逻辑用清零法更直观做稳定分频用置数法更安全。2.3 新手最容易踩的三个误区误区一MR和PL的默认电平搞反。74LS193的MR平时必须接低电平PL平时必须接高电平。一旦PL悬空有些芯片会因为输入悬空而被误判为低电平导致一直处于置数状态计数器永远不跑。TTL芯片悬空输入通常呈现高电平但这并不保证可靠最好用电平拉高。误区二反馈清零信号直接取自输出引脚同时驱动大量后级。一个74LS193的输出高电平灌电流能力有限如果你把QA~QD接了好几个LED又同时把反馈门接在同一个引脚上输出电平会被拉低反馈逻辑可能在有的时候判断错误计数器偶尔多计一次或少计一次。正确做法是先缓冲再分路。误区三把清零法用在需要级联的场合却没有处理脉冲宽度。多片级联时第一级的清零毛刺很可能作为“有效沿”进入第二级时钟端导致高位错误计数。解决方法是把清零信号经过一个单稳电路或D触发器整形保证至少有一个完整的时钟周期宽度。3. 实战案例用74LS193搭一个模12和模60计数器3.1 模12计数器状态真值表、反馈方程和完整连线先从单片的模12开始。设计目标是让QA~QD表示的二进制数从0000到1011循环对应十进制0到11第12个脉冲到来后回到0000。写出关键状态输入脉冲序号QD QC QB QA十进制00 0 0 00101 0 1 010111 0 1 111121 1 0 012发生清零清零条件最严格的写法是MR QD · QC · QB非 · QA非。因为在0~11状态里QDQC1的情况从未出现所以实际可以化简成MR QD · QC也就是用一个两输入与门把QD和QC接进去输出接MR即可。简化后计数器在12、13、14、15状态都会让MR为高但因为异步清零一到12就被清掉了后面几个状态不会真正出现。如果你担心清得太慢或者负载重建议还是用严格组合。需要用反相器把QB和QA取反再接一个四输入与门。多一个门的事但波形干净一些。完整连线清单引脚/元件接法74LS193的VCC5V74LS193的GNDGNDUP计数脉冲源上升沿触发DOWN5V禁用减计数MR与门输出平时为0检测到12时为1PL5V禁止置数A、B、C、DGND预置值不用QA~QD各串一个330Ω电阻接LED做指示与门可用74LS08或用74LS00两个与非门组合这里要注意如果用手动按键产生计数脉冲必须在按键输出端加消抖电路否则机械抖动会被当成多个上升沿计数器会一次跳好几步。最简单的消抖可以用两个与非门组成RS触发器也可以用一个施密特触发反相器加RC低通。3.2 模60计数器两片级联的进位设计与整体清零思路模60需要两片74LS193。个位按十进制计数十位按六进制计数两片组合起来正好是60个状态从00到59。个位要接成十进制所以当它状态到101010时清零。反馈取QD和QB两个位因为0~9中不存在QDQB1而101010里有所以清零条件可以写成MR1 QD · QB。这一片在0~9循环但严格说10状态会出现一个短瞬态可以直接被清零。难点在十位的进位信号。个位从9跳到0的那一瞬间十位需要加1。如果直接用74LS193的TCU进位输出需要等个位到15才产生不符合十进制需求。正确做法是提取个位状态9的指示信号F9 QD · QA因为0~9中只有9同时满足QD1和QA1。把这个信号反相后接到十位UP端。当个位处于8时F9为0反相输出高进入9时F9为1反相输出低离开9进入10后F9回到0反相输出由低跳高正好给十位提供一个上升沿。这样十位就会在个位完成一次满十循环后加1。十位本身要按六进制工作也就是循环0~5到6时清零。十位状态6用二进制表示是0110十位的QC和QB同时为1就是6或7而在0~5中不存在这种组合所以清零条件可以写成MR2 QC · QB。当第60个脉冲到来时十位从5变成6立即被清零个位此时也正好是0整个计数器回到00。这样一来两片74LS193的接线如下信号接法个片UP系统计数脉冲个片DOWN5V个片MR个位检测10的与门输出个片PL5V个片A~DGNDF9反相信号接到十片UP十片DOWN5V十片MR十位检测6的与门输出十片PL5V十片A~DGNDQA~QD两片接数码管译码器或LED这里有一个容易被忽略的点十位的UP信号平时是高电平反相器输出高而不是接低电平。74LS193的加时钟输入端在不需要脉冲时保持高电平是正常状态因为计数发生在上升沿不是高电平有效。如果反相器输出在平时为低那反而会出错。4. 实测踩坑记录毛刺、竞争冒险和负载问题4.1 异步清零毛刺为什么明明“看着正常”却偶发错误把两片级联后的模60电路接到示波器上我第一眼看到个位MR信号时有点懵正常应该是每10个脉冲出现一次宽一点的复位脉冲实际上却是一个很窄的尖峰宽度不到50ns。LED显示看起来完全正常因为它对这么窄的脉冲不敏感但后级电路就不是这么回事了。问题根源在异步清零的特性MR一旦为高芯片内部立即清零输出QA~QD变化清零条件随即消失MR又变回低。所以MR的有效时间并不是由外部时钟控制的而是由“门电路延迟芯片内部清零时间”决定。只要反馈门的传播延迟和芯片的清零传播延迟之和不够大MR脉冲就非常窄。如果这个窄脉冲被下一级采样恰恰又出现在时钟边沿附近就会导致随机误触发。解决思路有几个。用同步复位计数器当然最干净但如果必须用74LS193我会在MR信号上加一个很小的RC低通比如100Ω电阻加100pF电容把脉冲稍微展宽一点让它达到芯片手册要求的最小脉冲宽度。注意电容不能太大否则复位信号撤销得慢计数器在下一次计数开始前还没完全解放同样会出问题。另一种更工程化的做法是引入一个D触发器做同步化把反馈门输出接到D触发器数据端计数时钟反相后作为D触发器时钟这样MR信号能维持一个完整时钟周期。缺点是电路复杂对面包板新手不友好。4.2 按键消抖与脉冲源处理一个按下去冒出三四个脉冲很多同学调试计数器时用面包板上的自锁按钮或者普通轻触开关直接做脉冲源结果发现按一下计数器跳了好几个数。这是最典型的机械抖动问题按键闭合瞬间金属触点会弹跳几次产生一串宽度不定的脉冲。74LS193对上升沿敏感每一串抖动中的每个上升沿都会让它加一次。最省事的消抖方法是先用信号发生器输出方波来验证逻辑确认逻辑没问题后再处理按键。需要接按键时我一般用一个RS触发器消抖两个与非门交叉连接按键一端接S一端接R输出端接74LS193的UP。这样按键按下和释放都只产生一次可靠的边沿。如果不想多搭电路也可以用施密特触发反相器加RC积分按键输出先经过一个1kΩ电阻和1μF电容组成的低通滤波器再用施密特门整形。这个方案的抗抖动能力不错而且元器件好找。需要注意的是RC时间常数太大会导致方波边沿变慢计数器最高工作频率反而受限制。4.3 负载效应与电源去耦芯片被“累垮”的细节74LS193的高电平驱动能力并不强手册上高电平输出电流一般只有0.4mA左右。如果直接把公共阳极数码管的段选或LED跨接到输出端电流需求远超芯片能力QA~QD的高电平会被拉低到2V以下后级组合逻辑可能判断错误计数器出现“偶发漏计数”。正确做法是给每个LED串一个限流电阻并且用一个缓冲器驱动比如74LS245或者ULN2003。如果只是做逻辑指示可以用高阻输入的逻辑探头不要直接从输出引脚取大电流。反馈门电路也一样尽量用CMOS门74HC08、CD4081去读取74LS193的输出因为CMOS输入阻抗高几乎不给前级增加负担。另外面包板上的电源线一定要加0.1μF去耦电容最好每片74LS193的VCC和GND之间都并一个。芯片翻转时电源电流会产生噪声没有去耦电容计数频率高一点就会出现各种莫名其妙的毛刺。这是我在做模60级联时踩过的一个坑两个芯片共用一个电源没有加电容结果十位偶尔会多跳一位换了电容后问题消失。4.4 连接到单片机时的电平与同步问题有的项目会把74LS193的输出接到单片机的IO口读取计数值。74LS193输出是TTL电平对5V单片机可以直接连但要注意时序问题。异步清零时计数器输出会出现极短的非目标状态如果单片机恰好在清零瞬间采样就可能读到一个错误的数。我建议在硬件上做一个16位寄存器的同步采样比如用一个74LS373或74HC573锁存器的时钟由系统统一控制或者更简单把计数器的清零输出接到单片机外部中断引脚在清零完成后再读取。如果只能用普通IO轮询那就在程序里连续读三次取两次相同的结果用软件过滤毛刺。如果单片机是3.3V供电最好加电平转换至少要用电阻分压。TTL输出高电平虽然能到2.4V以上对3.3V单片机的高电平阈值来说勉强够但噪声容限很窄长线连接时更容易出错。5. 通用设计流程、仿真验证与级联扩展5.1 任意进制设计的通用五步法做多了就能总结出一套固定的流程。第一步确定模数N和状态序列比如从0到N-1循环还是从某个初值开始第二步选择清零法还是置数法第三步根据状态序列写出反馈状态和反馈方程第四步用卡诺图化简并且在0到N-1的每个状态上验证化简后的方程不会误触发第五步仿真或实物验证。以模47为例二进制是00101111如果你用两片74LS193级联成8位计数器反馈清零的检测条件就是高四位为0010、低四位为1111。这个反馈逻辑可以用两片比较器来实现会比一堆与门简单。若觉得整体清零逻辑太复杂也可以换成反馈置数法设置一个初值让8位计数器一直加到255再通过TCU重新预置循环长度直接由初值决定反馈逻辑只有一个进位信号设计难度大大降低。所以实际项目里我不会死磕“必须从0开始输出”的序列而是看后续需要什么输出。需要BCD数码管显示就尽量用清零法得到0~N-1自然序列需要分频比就无脑用置数法逻辑简单可靠。5.2 如何验证真的做到了“任意进制”频率计和示波器思路很多同学验证计数器时喜欢看LEDLED慢闪看起来正常就认为成功。其实更严格的验证方法是测反馈标志信号的频率。比如模12计数器它的反馈清零信号每12个输入脉冲出现一次如果输入信号频率是12kHz那么反馈标志频率正好是1kHz。用频率计或者示波器频率测量功能能非常直观地确认进制是否正确。不要直接拿最高位QD去测频率然后除2的幂因为模12时QD并不规则翻转除下来没有意义。正确测法是给反馈门单独留一个测试点或者把反馈信号用三极管做一个缓冲输出接到频率计。如果你用置数法可以测进位输出TCU或借位输出TCD它们的频率是输入频率除以循环长度定义很清晰。用示波器看波形时把触发模式设为上升沿观察反馈信号相对输入脉冲的位置。如果反馈信号每次都出现在同一个计数值上说明逻辑稳定如果位置抖动多半是组合逻辑存在竞争冒险需要重新检查反馈门。5.3 从74LS193到可编程分频器与Verilog对照如果你想把74LS193玩得更深最实用的扩展是做成可编程分频器。两片级联成8位减法计数器数据输入端接8位拨码开关把DOWN作为计数时钟TCD借位输出作为分频输出同时接到PL端。每当计数器借位时TCD输出一个脉冲同时会把新的初值装入重复减法。这样8位初值N对应的分频系数就是256-N如果初值不能为0用拨码开关就能在线改变分频比。这段逻辑用Verilog写出来也很简洁核心就是一个“计数到目标值清零或重载”的状态机。比如模12计数器module counter_m12 ( input clk, input rst_n, output reg [3:0] q ); always (posedge clk or negedge rst_n) begin if (!rst_n) q 4d0; else if (q 4d11) q 4d0; else q q 1b1; end endmodule这里用的是同步复位和74LS193的异步清零思路不同但状态循环的核心仍然是“反馈比较”。你如果先理解了硬件反馈再转FPGA会非常快因为本质上都是定义模数、比较目标、控制回绕。5.4 个人经验小结做了几个不同进制的计数器后我发现最省心的组合是验证思路用74LS193清零法做可靠分频用74LS193置数法真正上产品就换74LS163或FPGA。最后分享一个小技巧调试时把MR信号单独引到示波器探头用最高带宽看如果清零脉冲窄得看不清就在MR对地接一个几十皮法的电容让脉冲稍微变宽这样既能观察又不至于影响功能。这个习惯帮我排查过很多“看起来正常运行但级联就出错”的奇怪问题希望能帮你少走弯路。
返回列表