ARTICLE DETAIL

资讯详情

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

74LS193任意进制计数器设计:从清零置数到级联实战

74LS193任意进制计数器设计:从清零置数到级联实战 做数字逻辑课设或者自己搭电路计数器应该是绕不开的一关。我见过不少同学一上来就搜74160、74LS192或者干脆用74160十进制计数器→4511→共阴数码管这条经典链路搭一个固定十进制显示电路跑通了还挺高兴结果老师接下来一句那你自己改成7进制、12进制、24进制试试当场就卡住了。74LS193这颗芯片恰恰就是来收拾这种任意进制需求的。它本身是一个4位二进制同步加/减计数器带两个独立的时钟输入端加减方向可以随意切换清零端和置数端都是异步操作配合少量组合逻辑门就能把计数模数做到2到16之间的任意值多片级联以后还能继续往上扩展。下面我会从芯片动作原理开始讲把清零、置数、循环置数这些手法的门道拆明白再给你一套可以直接照抄的十进制和24进制设计流程最后聊几个我在调试时真踩过的时序坑。新手能按步骤搭出来老手也能从中挑出一些以前没细想过的细节。1. 74LS193是什么先摸清这颗芯片的脾气1.1 双时钟结构加、减计数各自走各的门74LS193的逻辑功能从名字就能看出大半193是TTL系列里的二进制可逆计数器编号它的兄弟74LS192是十进制版本LS表示低功耗肖特基工艺工作电压5V典型传播延迟在十几纳秒量级适合做课程实验和中小规模数字系统。它最显眼的特点是双时钟一个加计数时钟CPU一个减计数时钟CPD两个都是上升沿触发。你想让它往上数就在CPU端送脉冲同时把CPD端接高电平想让它往下数就在CPD端送脉冲同时把CPU端接高电平。两个时钟互不干扰这在做先加后减的场合非常省事。除了时钟74LS193还有两组非常关键的输入MR清零端和PL置数端。MR是异步清零高电平有效只要它变高输出QA~QD立刻归零根本不用等时钟PL是异步置数低电平有效只要它变低就把并行数据端A、B、C、D上的值直接写到输出上。这两个端的异步意味着它们不受时钟约束、响应极快既是74LS193做任意进制时最方便的地方也是产生毛刺的根源后面我会重点展开。引脚功能我整理成一个简表方便搭电路时候对着查端口名称功能CPU加计数时钟上升沿使计数器加1此时CPD应为高CPD减计数时钟上升沿使计数器减1此时CPU应为高MR异步清零高电平有效输出立即为0000PL异步置数低电平有效输出立即为预置值A~D并行数据输入置数时使用的预置值QA~QD计数输出QA为最低位QD为最高位CO加计数进位输出加计数到15时输出低电平持续一个时钟周期BO减计数借位输出减计数到0时输出低电平持续一个时钟周期功能表可以进一步浓缩成四行MRPL时钟状态输出动作1XX清零为000000X置入A~D数据01CPU上升沿CPD1加101CPD上升沿CPU1减1从功能表能看到74LS193并不是一个单纯的四位计数器而是一个可以随时归零、随时装数、随时改方向的可编程计数单元。这种结构决定了它做任意进制时不需要额外的译码复位电路只需要把几根输出线接回MR或PL就能形成反馈。1.2 和74160这类固定进制计数器比优势在哪很多数字逻辑教材的第一个计数器实验会用74160配合4511译码器和共阴数码管做十进制显示74160负责从0数到9译码器把BCD码变成段码数码管把数字显示出来。这套链路的最大优点是开箱即用几乎不用动脑子但缺点是74160内部已经固定死了模数10如果你想做7进制、12进制、17进制就得另想办法。74LS193的思路完全不同。它默认就是4位二进制从0000一路数到1111模数是16。要做7进制就让它在数到7的瞬间清零要做12进制就让它在数到12的瞬间清零要做24进制就用两片级联以后在24的瞬间清零。换句话说任意进制不是芯片给你预置好的功能而是你用芯片的清零/置数/进位能力加上少量反馈逻辑自己定制出来的。这正是数字逻辑实验最想让你练的东西把状态转换、组合反馈、时序配合这些概念串起来。两种方案对比一下对比项74160固定十进制链路74LS193计数范围固定0~9单片可改2~16级联可扩展加减方向只能加可加可减自定义进制需要换芯片或复杂反馈简单反馈逻辑即可典型搭档4511共阴数码管与门/与非门4511数码管适合场景固定十进制显示灵活模数、可逆计数、分频器所以如果你只是交一个0到9循环显示的实验用74160确实省事但只要题目稍微变一下比如做12进制或做一个可逆的按键计数器74LS193的优势就会立刻显现出来。这也是为什么很多学校在数字逻辑基础实验的后半段都会专门安排74LS193的任意进制设计。2. 任意进制设计的底层逻辑清零、置数还是循环置数2.1 三种手法的原理和取舍74LS193做任意进制目的不外乎两个把原本0~15的计数范围收缩成我们想要的0~N-1或者改成任意设定的M个状态循环。主流手法有三种我一个个说清楚。第一种是反馈清零法。把计数器的输出拿一部分做组合逻辑当计数到N的时候产生一个有效电平送给MR端把输出清成0000。因为MR是高电平有效所以反馈逻辑一般是用与门把N对应的几个输出位挑出来。由于计数器本来就是要从0数到N-1N这个状态出现的时间极短一出现就被清零所以外部看到的就是0到N-1循环。这是最直白、最符合直觉的做法。第二种是反馈置数法。这次不等到N而是等计数到N-1的时候产生一个低电平送给PL端把并行数据端预设的值通常是0000装进计数器。功能上和清零法一样计数的范围仍然是0到N-1区别在于它触发的是置数而不是清零。由于置数端是低电平有效反馈逻辑多用与非门。第三种是进位循环置数法也叫预置态循环法。它不依赖清零而是利用74LS193自己的进位输出CO。做法是把CO直接接到PL同时在并行数据端A~D预置一个数P计数器从P往15数数到15时CO变低触发置数把P又装回去形成P→15→P的循环。如果P 16 - M那么一次循环正好M个状态。这个方法的妙处是不需要额外的与门/与非门只需要把数据端接成P对应的电平但对计数初值有要求输出不是从0开始的实际使用时要自己换算。三种方法可以对照下面的表方法检测/触发条件反馈到计数范围典型门电路反馈清零计数到NMR高有效0~N-1与门反馈置数计数到N-1PL低有效数据端置00~N-1与非门进位循环置数计数到15PL低有效数据端置PP~15无额外门从我实操的角度看反馈清零法最好写实验报告、最容易理解所以课堂演示一般用它反馈置数法稍微多一点接线但计数过程的输出从不会短暂出现N这个越界值后续接译码显示时更干净进位循环置数法最省门电路适合做特定分频比比如直接做一个从6到15循环的十状态计数器来等效十进制分频但需要你习惯非零起点。2.2 反馈清零法的边界异步清零与毛刺用反馈清零法的时候很多同学会忽略一个关键点74LS193的MR是异步清零端不是同步清零端。同步清零的意思是清零条件满足后要等下一个时钟有效沿到来才真正清零异步清零则是清零条件一变高输出马上就清零完全不等时钟。74LS193属于后者所以在清零瞬间电路里会有一个肉眼看不见、示波器上却非常明显的越界状态。举个例子做模10计数时正常状态是0~9。第10个时钟上升沿到来计数器先短暂变成1010也就是10这个状态。10状态一出现QD和QB同时为1反馈与门立刻输出高电平给MR输出被清零。这个10状态存在的时间大约就是反馈门的传输延迟加上MR复位动作的延迟通常只有几十纳秒。如果驱动的是数码管译码器这几十纳秒的毛刺未必会被人眼察觉但如果后面接的是锁存器、比较器或者别的时序电路这个毛刺完全可能被当成一个有效状态锁存进去造成整个系统偶尔抽风。还要注意反馈清零法的毛刺是结构性的不是你接线没接好。只要MR是异步的检测N的组合逻辑就必然存在竞争冒险。要缓解毛刺有三个实用办法第一在MR端对地并联一个100pF到1nF的小电容把窄尖峰滤掉但电容不能太大否则清零信号本身也会被拖慢第二把反馈信号用D触发器先同步一拍再送回MR让清零动作持续一个完整时钟周期这是工程上更干净的做法第三改用反馈置数法虽然置数信号同样有毛刺但由于输出被拉到预设值0000越界值被替换成一个合法状态对后续逻辑的影响小很多。这一段想说的核心是看懂极性、看懂异步时序比记住接线图重要得多。74LS193的MR、PL都是一有效就立刻行动的端你给出的反馈信号必须足够可靠否则它就会把不可靠传遍整个系统。3. 从十进制到24进制一套能直接抄的完整设计3.1 通用设计流程先把模数转成二进制下面给出一套我自己给学生讲课时常用的设计流程适合所有基于74LS193的任意进制设计。第一步确定模数N判断单片能不能装下。74LS193的4位二进制最大就是16所以单个芯片只能实现2到16之间的模数。N大于16就得先做级联把两片变成8位计数器范围扩到256再在这个更大的范围上做清零或置数。第二步把N写成二进制。如果是单片设计N就是4位二进制数如果是级联设计N就是8位二进制数。写出来之后找出哪些位是1这些位就是反馈逻辑要检测的对象。第三步选择反馈方法。清零法就把所有为1的位取与送到MR置数法就把N-1的二进制中为1的位取与非送到PL。注意清零法检测的是N本身置数法检测的是N-1这是最容易搞混的地方。第四步接好不参与反馈的引脚。MR或PL不用的时候要接成无效电平数据端A~D不用时建议接低电平避免悬空CPD在做加计数时接高电平CPU在做减计数时接高电平。第五步上电验证。用示波器看QA~QD的波形确认循环周期是否等于N个时钟周期再看CO或BO是否在预期位置出现脉冲这个脉冲经常被用来级联或触发外部电路。为了方便直接查我列几个常用模数的反馈表达式。下面的表达式都假设QD是最高位、QA是最低位。模数NN的二进制(QD QC QB QA)清零法反馈到MR置数法反馈到PL数据端000060110QC 与 QBQC 与 QA 与非101010QD 与 QBQD 与 QA 与非121100QD 与 QCQD 与 QB 与 QA 与非151111QD 与 QC 与 QB 与 QAQD 与 QC 与 QB 与非这里有个小规律清零法里只需要取N的二进制中1对应的输出位做与运算就可以保证第一次出现这些位全为1的时候正好是N状态。比如N10二进制10101位是QD和QB检测QD与QBN12二进制1100检测QD与QC。因为任何比N小的数都不可能同时满足这几个1位都为1所以这个表达式是安全、准确的。3.2 实操示例十进制0~9计数器现在动手做第一个核心例子用一片74LS193实现0到9循环的十进制计数器。芯片的电源和地先接好VCC接5VGND接地。在VCC旁边放一个0.1uF的去耦电容这是TTL电路很实用的习惯能避免计数器在高速翻转时把电源拉出噪声。CPU端接时钟源实验时一般用1Hz到1kHz的方波方便观察CPD端直接接高电平因为我们只做加计数。PL端也接高电平因为这里不用置数功能。A~D四个数据输入端全部接低电平防止悬空引入干扰。接下来处理清零反馈。十进制N10二进制是1010按照上表取QD和QB做与运算接到MR端。用一片二输入与门比如74LS08或者用74LS00与非门再加一级反相实现。当计数器从91001走到101010时QD和QB同时为1与门输出高电平MR被拉高计数器被清回0000。于是QA~QD的输出波形就是从0000到1001循环周期正好10个时钟。如果你想直接接数码管显示把QA~QD接到4511的BCD输入端4511输出段码接共阴数码管这套链路和74160十进制计数器→4511→共阴数码管完全兼容只是前面的计数模块从固定芯片换成了自己搭的反馈电路。4511自带锁存功能这个特性可以在一定程度上把清零毛刺挡在显示之外所以实验效果往往还不错。接线清单我习惯这么写74LS193引脚接法CPU1Hz~1kHz方波CPDVCCMR与门输出QD与QBPLVCCA~DGNDQA~QD4511/示波器如果你手边没有与门也可以用两个非门和一个与非门凑但那样延迟更大毛刺更明显不如直接找74LS08来得稳。3.3 实操示例24进制0~23级联计数器第二个核心例子是24进制这也是秒表、时钟、分频电路里的经典需求。24大于16单芯片放不下所以要两片74LS193级联。这里我推荐的是先扩成256再整体清零方案而不是一上来就把低位做成十进制。具体做法是第一片74LS193U1作为低4位第二片74LS193U2作为高4位两片都保持完整的0~15计数能力。U1的CPU接外部时钟U1的CO接到U2的CPUU2的CPD接高电平。这样U1每从15跳回0一次CO就会产生一个低脉冲随后回高这个上升沿恰好让U2加1于是U1和U2合在一起就是一个从0到255的8位二进制计数器。接下来做清零逻辑。24的8位二进制是00011000对应关系是U2高4位0001其中只有U2的QA为1U1低4位1000其中只有U1的QD为1。所以只需要把U2的QA和U1的QD送入一个二输入与门输出接到两片74LS193的MR端。当整个计数器走到24时U2的QA和U1的QD同时为1与门输出高电平两片同时清零整个计数范围就是0到23正好24个状态。接线可以这样记信号U1低4位U2高4位CPU外部时钟接U1的COCPDVCCVCCMR与门输出与门输出PLVCCVCCA~DGNDGNDCO接U2的CPU悬空有一点必须提醒这个方案输出的不是BCD码。整体计数到23以后U1会经历0~15U2会经历0~2但U1的8~15状态对于BCD数码管来说是不合法显示。如果你要的是0~23的十进制数码管显示就应该把U1做成模10、U2做成模3让U1从9跳到0时给U2一个进位脉冲。但那个方案在高位时钟沿的处理上更容易出毛刺调试难度比整体清零高所以纯做功能验证时我更推荐先用整体清零法跑通逻辑真的需要BCD显示再在输出端加译码/转换电路。4. 调试时的常见坑示波器上看不到的毛病4.1 清零毛刺和竞争冒险第一次搭74LS193反馈清零电路很多人会碰到一个诡异现象逻辑上明明没问题可计数器偶尔会跳过某个数或者数码管闪一下不该出现的数字。这时候别急着怀疑芯片坏了大概率是异步清零毛刺在作祟。前面讲过MR是异步清零反馈与门的输出在N状态出现的那一瞬间会拉高但N状态本身存在时间极短于是MR端看到的其实是一个几十纳秒宽的尖峰。如果这个尖峰幅度不够、宽度不够芯片可能没有完全响应如果刚好响应输出又被清掉反馈条件消失MR重新变低。整个过程的时序非常敏感尤其在你把反馈门的延迟和MR的延迟叠加之后清零的精确时刻会随着温度、电压变化而漂移。这就是为什么同一个电路上午跑得好好的下午就抽风。解决办法前面提过三种MR端并小电容、D触发器同步扩展清零脉冲、改置数法。我再补充一个更细的实操细节如果你用示波器看MR端探头的电容本身就可能会改变毛刺形状所以不要一上来就认定波形是对的先把探头夹在反馈门输出和MR之间分别看一次对比两者时序才能判断到底是反馈逻辑慢还是MR动作慢。4.2 时钟源抖动555和机械开关双双甩锅很多实验里的时钟不是信号发生器给的而是用555计数器电路搭的或者干脆是一个按键手动触发。这两种时钟源都有一个共同问题抖动。用555做脉冲发生器时如果输出直接接CPU端脉冲沿的上升时间不够陡或者电源纹波大74LS193可能会在一个边沿上误触发两次计数导致计数值随机多跳。处理办法是555输出经过一级施密特触发器整形74HC14等再接计数器或者把555的供电和计数器供电严格分开共地但不要在同一个去耦电容上取电。如果是按键手动触发问题更典型。机械按键按下和松开的瞬间触点会来回弹跳几十毫秒产生一串不规则的脉冲74LS193会把每一次弹跳都当成一个时钟沿计数值一下子蹦出去好几位。这时候必须在按键输出后面加消抖电路简单的RC低通加施密特整形就能解决也可以用74LS00搭一个典型RS触发器消抖电路。千万别指望软件延时或者人手按得稳数字电路不认识手感。4.3 级联信号异常进位线没你想的那么强做24进制级联时最容易出问题的是U1的CO到U2的CPU这条线。CO是低电平有效的进位输出它在U1数到15时拉低在U1翻回0时恢复高电平。这个信号本身只有大约一个时钟周期的持续时间而且它驱动的是下一级计数器的时钟输入端对边沿质量要求比较高。如果你发现U2有时候不加1、有时候加两次先查两个地方第一确认CO到U2的CPU之间没有接反相器因为U2需要的是上升沿触发而CO恢复高电平的过程才是上升沿第二确认U2的CPD确实接在高电平如果CPD悬空或者受干扰变低U2可能进入减计数模式计时结果自然乱套。另外级联后两片芯片的供电也要一起考虑。U1的CO要驱动U2的CPU同时还可能驱动示波器探头负载电容一上去边沿会变缓。如果条件允许在CO到U2的CPU之间加一个74HC14施密特缓冲器整形能明显提高级联可靠性。别嫌多一片芯片麻烦调试省下来的时间比买芯片的钱贵多了。5. 74LS193的思想迁移从硬件到Verilog再到工程应用5.1 用Verilog写一个参数化任意进制计数器理解74LS193的反馈逻辑之后再去看Verilog计数器会轻松很多因为核心思想是一样的把计数范围限制在0到N-1到边界就回零。区别只在于硬件里用的是异步MR而FPGA工程习惯用同步复位。下面这段代码是我常用的一种参数化写法通过parameter N修改进制综合出来就是一个任意模数的计数器。需要说明的是这里为了和74LS193对比只写了4位宽N超过16时需要把WIDTH相应加宽。module counter_n #( parameter N 10, parameter WIDTH 4 )( input wire clk, input wire rst_n, output reg [WIDTH-1:0] q ); wire cnt_done (q N - 1); always (posedge clk or negedge rst_n) begin if (!rst_n) q {WIDTH{1b0}}; else if (cnt_done) q {WIDTH{1b0}}; else q q 1b1; end endmodule对比一下就能看出Verilog版本把清零和检测到N-1写成了一个同步的边界判断Q只在时钟上升沿更新所以不会出现74LS193那种越界毛刺。这不是说Verilog更高级而是说同步时序天然规避了异步反馈的竞争冒险。如果你非要在FPGA里复刻74LS193的异步清零反馈也能写但综合工具会给你报一堆时序违例实际跑起来也容易出问题。还是那句话先理解硬件为什么会有毛刺再理解HDL为什么要坚持同步设计。5.2 停车场、易拉罐线、PLC里的计数器74LS193这种数脉冲、到数清零/置数、可加可减的套路放在更大的工程视野里其实无处不在。最容易对应上的是可逆计数场景。比如基于32的简易停车场车位计数器入口传感器给一个脉冲出口传感器给一个脉冲需要的是进1、出-1这正好就是74LS193双时钟加/减的设计初衷。用两个传感器分别驱动CPU和CPD再用一个数码管显示剩余车位纯硬件就能搭出来不需要单片机。再比如易拉罐计数这类产线应用光电传感器每过一个罐子产生一个脉冲计数器累加到设定值就输出控制信号让包装机构动作。74LS193加一个比较器就能实现这个设定值到点触发的功能省掉单片机的外围电路。甚至在PLC里面三菱PLC的C计数器、西门子S7-1200的计数器指令本质也是输入脉冲计数范围复位/置数只不过它们跑在扫描周期里处理的是数字量的边沿而不是电路里的时钟沿。51单片机的定时计数器讲解里也总说计数器就是对外部脉冲计数底层逻辑和74LS193完全一致。所以不要觉得74LS193是一颗过时的芯片。它可能不会出现在每一块新板子上但它把计数器最核心的机制——时钟、进位、清零、置数、双向计数——全部浓缩在了一颗16脚芯片里。你把它的门道嚼碎了再去看单片机定时器、PLC计数器、FPGA里的parameter计数器都只会觉得眼熟。5.3 后续还可以怎么扩展如果你做完十进制和24进制还想再多练练我建议按这几个方向往下走。第一个方向是加显示。74LS193输出是BCD/二进制信号接4511加共阴数码管是最经典的显示方案但如果要做运行中的实时显示要注意清零毛刺可能被译码器短暂捕获。可以在4511的锁存使能端加一个延时控制只在计数稳定的半周期锁存一次。第二个方向是加分频。74LS193本身就是一个N分频器因为它每N个输入时钟周期输出一个进位/清零周期。想要干净的方波分频输出可以把分频后的信号再接一级D触发器整形边沿会比从MR端直接取出来的信号漂亮得多。第三个方向是玩转可逆计数。用两个按键或者两组传感器分别接CPU和CPD再做上下限判断就能做成一个双向计数的小系统。这个方向如果深入下去你会开始考虑计数到0之后要不要禁止减计数、计数到上限之后要不要禁止加计数这其实就是工程里边界处理的雏形。我自己的体会是74LS193最适合用来建立时序直觉。它能让你直观看到异步复位到底有多快、组合反馈的毛刺是怎么产生的、级联进位到底需要多干净的边沿。这些感觉光看数据手册和仿真波形是养不出来的。先把这颗小芯片玩明白再去碰更复杂的数字系统你会少走很多弯路。
返回列表