☰
74LS193任意进制计数器设计:从清零置数到级联实战
2026/10/6 18:20:48 网站建设 项目流程

做数字逻辑课设或者自己搭电路,计数器应该是绕不开的一关。我见过不少同学一上来就搜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异步清零高电平有效,输出立即为0000
PL'异步置数低电平有效,输出立即为预置值
A~D并行数据输入置数时使用的预置值
QA~QD计数输出QA为最低位,QD为最高位
CO'加计数进位输出加计数到15时输出低电平,持续一个时钟周期
BO'减计数借位输出减计数到0时输出低电平,持续一个时钟周期

功能表可以进一步浓缩成四行:

MRPL'时钟状态输出动作
1XX清零为0000
00X置入A~D数据
01CPU上升沿,CPD=1加1
01CPD上升沿,CPU=1减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-1,N这个状态出现的时间极短,一出现就被清零,所以外部看到的就是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'(数据端0000)
60110QC 与 QBQC 与 QA 与非
101010QD 与 QBQD 与 QA 与非
121100QD 与 QCQD 与 QB 与 QA 与非
151111QD 与 QC 与 QB 与 QAQD 与 QC 与 QB 与非

这里有个小规律:清零法里,只需要取N的二进制中1对应的输出位做与运算,就可以保证第一次出现这些位全为1的时候正好是N状态。比如N=10,二进制1010,1位是QD和QB,检测QD与QB;N=12,二进制1100,检测QD与QC。因为任何比N小的数都不可能同时满足这几个"1位"都为1,所以这个表达式是安全、准确的。

3.2 实操示例:十进制(0~9)计数器

现在动手做第一个核心例子:用一片74LS193实现0到9循环的十进制计数器。

芯片的电源和地先接好,VCC接5V,GND接地。在VCC旁边放一个0.1uF的去耦电容,这是TTL电路很实用的习惯,能避免计数器在高速翻转时把电源拉出噪声。CPU端接时钟源,实验时一般用1Hz到1kHz的方波,方便观察;CPD端直接接高电平,因为我们只做加计数。PL'端也接高电平,因为这里不用置数功能。A~D四个数据输入端全部接低电平,防止悬空引入干扰。

接下来处理清零反馈。十进制N=10,二进制是1010,按照上表,取QD和QB做与运算,接到MR端。用一片二输入与门(比如74LS08,或者用74LS00与非门再加一级反相)实现。当计数器从9(1001)走到10(1010)时,QD和QB同时为1,与门输出高电平,MR被拉高,计数器被清回0000。于是QA~QD的输出波形就是从0000到1001循环,周期正好10个时钟。

如果你想直接接数码管显示,把QA~QD接到4511的BCD输入端,4511输出段码接共阴数码管,这套链路和"74160十进制计数器→4511→共阴数码管"完全兼容,只是前面的计数模块从固定芯片换成了自己搭的反馈电路。4511自带锁存功能,这个特性可以在一定程度上把清零毛刺挡在显示之外,所以实验效果往往还不错。

接线清单我习惯这么写:

74LS193引脚接法
CPU1Hz~1kHz方波
CPDVCC
MR与门输出(QD与QB)
PL'VCC
A~DGND
QA~QD4511/示波器

如果你手边没有与门,也可以用两个非门和一个与非门凑,但那样延迟更大,毛刺更明显,不如直接找74LS08来得稳。

3.3 实操示例:24进制(0~23)级联计数器

第二个核心例子是24进制,这也是秒表、时钟、分频电路里的经典需求。24大于16,单芯片放不下,所以要两片74LS193级联。

这里我推荐的是"先扩成256,再整体清零"方案,而不是一上来就把低位做成十进制。具体做法是:第一片74LS193(U1)作为低4位,第二片74LS193(U2)作为高4位,两片都保持完整的0~15计数能力。U1的CPU接外部时钟,U1的CO'接到U2的CPU,U2的CPD接高电平。这样U1每从15跳回0一次,CO'就会产生一个低脉冲,随后回高,这个上升沿恰好让U2加1,于是U1和U2合在一起就是一个从0到255的8位二进制计数器。

接下来做清零逻辑。24的8位二进制是00011000,对应关系是:U2(高4位)=0001,其中只有U2的QA为1;U1(低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的CO'
CPDVCCVCC
MR与门输出与门输出
PL'VCCVCC
A~DGNDGND
CO'接U2的CPU悬空

有一点必须提醒:这个方案输出的不是BCD码。整体计数到23以后,U1会经历0~15,U2会经历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{1'b0}}; else if (cnt_done) q <= {WIDTH{1'b0}}; else q <= q + 1'b1; 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最适合用来建立"时序直觉"。它能让你直观看到异步复位到底有多快、组合反馈的毛刺是怎么产生的、级联进位到底需要多干净的边沿。这些感觉,光看数据手册和仿真波形是养不出来的。先把这颗小芯片玩明白,再去碰更复杂的数字系统,你会少走很多弯路。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询