资讯动态

74LS161和74LS160核心区别:同步预置、反馈清零与级联设计全解析

发布时间:2026/9/28 7:26:59 来源:尧图企业网站定制
做数字逻辑设计这么多年我见过太多人在 74LS161 和 74LS160 上栽跟头。这两颗芯片外形几乎一样引脚布局完全一致名字就差一个数字很多人直接把它们当同一种芯片互换结果做出来的计数器要么“多跳几个数”要么清零瞬间输出一个毛刺搞得整个系统时序全乱。其实这两颗芯片一个是二进制计数器一个是十进制计数器核心计数序列不同后续的进位、清零、预置行为就有本质区别。这篇文章我会把这两颗芯片从引脚到真值表、从时序到N进制设计讲清楚。重点放在最容易被忽视的“为什么”上为什么反馈清零法会有毛刺为什么同步预置法更稳为什么级联时进位要先接ENT而不是随便找一根线最后我会给出Verilog复刻代码、测试平台以及用 74LS160 → 4511 → 共阴数码管 的完整接线方案让计数器不再只是实验箱里的“方块符号”而是你真正能掌控的电路。1. “161”和“160”只差一个数字差的是整个计数世界1.1 同为四位宽输出却一个是模16一个是模10先解决一个最基础的问题74LS161 和 74LS160 的计数序列到底差在哪里。74LS161 是 4 位二进制同步计数器输出 QA、QB、QC、QD 组成一个从 0000 到 1111 的 16 个状态循环。换句话说它的计数模数是 16英文里叫 modulo-16 counter写出来就是 0→1→2→……→15→0→1……。74LS160 则是 4 位十进制计数器它在 1001也就是数字 9之后会直接回到 0000不会出现 1010、1011 这些二进制状态。它的计数模数是 10写出来是 0→1→2→……→9→0→1……。这两颗芯片的输出引脚同样是四位宽也都由同一个时钟驱动但它们“走”的状态空间完全不同。这个差异直接决定了你的系统里该选哪一颗需要二进制连续计数、或者后续要做 2 的幂次分频选 74LS161。需要直接给人看的十进制计数比如秒表、记数器、按键次数统计选 74LS160。如果拿 160 当 161 用会发现计数到 9 就提前归零拿 161 当 160 用会发现计数到 15 才归零而且输出里会出现 A、B、C、D、E、F 这些非十进制状态接到 4511 之类的 BCD 译码器上根本显示不对。另外还要澄清一个概念这两颗芯片都叫“同步计数器”意思是片内的四个触发器由同一个时钟沿触发同时翻转不存在逐级延迟累积的问题。但它们的清零端 CLR 是异步的置数端 LOAD 是同步的。这两个特性会在后面设计 N 进制计数器时产生完全不同的行为。1.2 十六个引脚每个引脚在真实电路中都有自己的“角色”引脚功能不需要死记但必须理解。以 74LS161 为例引脚定义和 74LS160 完全对应只是计数器终值不同。引脚名称作用1CLR异步清零低电平有效。只要拉低输出立即全部归零2CLK时钟输入上升沿触发计数3A并行数据输入预置数时使用4B并行数据输入5C并行数据输入6D并行数据输入7ENP计数使能 P高电平有效8GND地9LOAD同步置数低电平有效10ENT计数使能 T高电平有效同时控制进位输出11QD输出最高位12QC输出13QB输出14QA输出最低位15RCO进位输出16VCC电源5V功能表是理解芯片行为的核心我直接写成下面这样CLRLOADENPENTCLK行为LXXXXQA-QD 立即清零HLXX上升沿将 D-C-B-A 装载到输出HHHH上升沿计数加一HHLXX保持HHXLX保持看到这张表首先要建立一个认知CLR 是异步的跟时钟没关系LOAD 是同步的必须在时钟上升沿到来前准备好数据。ENP 和 ENT 同时为高才计数任何一个为低都保持。最后一行 “保持” 并不是多余功能在多片计数器同步级联时正好用得上。2. 计数器不看“闪灯看时序”同步计数与RCO进位输出的底层逻辑2.1 同步触发为什么能避免逐级延迟很多人第一次接触计数器是从“异步计数器”开始的也就是把前一级的 Q 接到后一级的 CLK串成一串。这种电路结构简单但每一位的输出都比前一位晚了整整一个触发器的传播延迟。假设一个触发器延迟是 20ns四片级联就是 80ns频率稍微上去高位还没稳定下一个时钟沿就到了计数结果直接错乱。74LS161 和 74LS160 的内部结构完全不同四个触发器由同一个 CLK 同时驱动。外部条件满足时所有触发器的下一状态根据当前输入逻辑统一计算在同一个时钟上升沿瞬间完成翻转。这就叫“同步”。同步计数器的优点不是计数更快而是计数结果可预测。你用示波器看 QA、QB、QC、QD它们基本在同一时刻变化不存在某一位“慢半拍”的问题。对后续的译码电路和锁存器来说这非常重要。不过要注意“同步计数”说的是芯片内部触发器翻转的同步并不代表组合逻辑输出比如反馈清零信号、进位信号不会产生毛刺。恰好相反后面要讲的反馈清零法出问题就出在组合逻辑上。2.2 RCO进位是如何被算出来的RCO 是很多人容易忽略的引脚也是多片级联时的关键。74LS161 的 RCO 表达式是RCO ENT (QA QB QC QD)也就是十六进制计数到 1111 时RCO 输出为高。要注意ENT 必须为高这是芯片手册里白纸黑字写的。74LS160 同理RCO ENT (QA QB QC QD) // 但只当状态为 1001 时成立在十进制计数器里只有当计数到 10019时 RCO 才为高。RCO 的“高电平窗口”不是一个瞬时脉冲而是持续整个终端状态的完整时钟周期。比如 161 在 1111 这个状态期间只要 ENT 是高RCO 就一直是高在下一个时钟沿到来后计数器翻回 0000RCO 才随之拉低。这个特性意味着你可以把低位的 RCO 直接接到高位的 ENT 或 ENP实现“级联”。低位计数到终值时RCO 把高位芯片的使能打开下一个时钟沿高位加一低位同时回到零。3. N进制设计清零法快预置法稳关键在毛刺和瞬态3.1 反馈清零从模6到任意模数的快捷公式所谓 N 进制计数器就是让计数器按 0,1,2,...,N-1,0,1... 循环而不是按照芯片本身的 16 或 10。N 小于芯片最大模数时都要靠外部反馈来实现。反馈清零法的思路很简单用一个组合逻辑检测“第 N 个状态”一旦达到就异步清零。比如用 74LS161 做模 6 计数器计数序列希望是0000 → 0001 → 0010 → 0011 → 0100 → 0101 → 0000 ...也就是计数到 01015之后就回零。可是清零端是异步的我们只能在“下一个状态”出现时触发清零。那什么时候触发答案是当计数器刚进入 01106时立刻把 CLR 拉低。检测 0110 这个状态只需要 QD0、QC1、QB1、QA0最简逻辑就是QC QB。把这两根线接到一个与门再把与门输出接 CLR清零逻辑CLR QC · QB一旦输出变成 0110CLR 为低输出立刻被清成 0000。从用户视角看计数器好像是在 0101 之后直接回零。再举一个例子用 74LS161 做模 12 计数器。计数到 101111之后要回零所以需要检测 110012。最简检测逻辑是QD QC。只要这两个位都为 1就认为到了第 12 个状态。这里特别注意不要只用 QD 或者只用一个位去检测否则可能提前触发。如果用 74LS160 做模 7检测的是 0111清零逻辑就是QC QB QA。同理这个指令就是“数到7立即拉低”。反馈清零法的优点非常明显逻辑简单一个与门就搞定。适用于 161 也适用于 160。不需要给数据引脚 D-C-B-A 事先接线。缺点同样明显第 N 个状态会出现一个极短的“瞬态”比如模 6 计数器在归零前其实会短暂进入 0110这个状态只存在几十纳秒但理论上确实存在。如果反馈信号后级接了边沿触发的电路比如另一个计数器、锁存器、分频器这个瞬态可能被当成有效时钟造成一次误触发。所以反馈清零法只能用在“后续电路不关心瞬态”的场合比如直接驱动指示灯、数码管、继电器。3.2 同步预置给计数器装一个“寄存器自动回填”机制同步预置法是更好的选择它利用 LOAD 引脚来实现“到终点回填初值”。基本思路是当计数器到达 N-1 时也就是最后一个有效状态把 LOAD 拉低在下一个时钟上升沿芯片把 D-C-B-A 上的数据并行装载进去。如果我们把数据和数据接成 0000那下一个状态就直接回到 0整个过程中不会出现“瞬时溢出状态”。以 74LS161 做模 6 计数器为例检测 01015这个状态然后让 LOAD 0检测逻辑LOAD (QC ~QB QA)等等0101 对应 QC1、QB0、QA1QD0完整逻辑是LOAD QD ~QD? // 等等我重新写一下0101 的二进制QD0QC1QB0QA1。所以检测逻辑为LOAD ~QD QC ~QB QA这个信号可以在计数器处于 0101 的整个时钟周期内保持低电平。在下一个时钟上升沿芯片检测到 LOAD 为低就把 D-C-B-A接成 0000装载到输出状态直接从 0101 跳到 0000不会出现 0110。这里必须强调一个关键差异同步预置法的“目标状态”——比如 0110——从始至终都不会出现在输出端。因为它不是靠等计数器“走到”目标状态再强行清零而是在倒数第二个状态就准备好了“回卷”指令由时钟边沿安全地完成跳变。做模 12 计数器用 161计数到 101111时置回 0检测逻辑就是LOAD QD QB QA // 1011 的三位有效位把 LOAD 接到这个组合逻辑输出D-C-B-A 全部接低电平。用 74LS160 做模 7计数到 01106时置回 0检测逻辑LOAD QC QB ~QA // 0110同样输出不会出现 0111。3.3 两种方案怎么选以及非零初值的进阶用法日常设计里我的建议很简单如果计数器后面接的是显示电路、继电器、LED反馈清零法完全够用逻辑最简洁。如果计数器后面还要带动其他时序逻辑比如再级联一级计数器、或者输出要作为另一个芯片的时钟请务必用同步预置法。如果系统对电磁兼容和信号完整性要求更高也尽量用同步预置法。毛刺本质上是一根窄脉冲在长走线上会辐射噪声。同步预置法还有一个隐藏优势它不要求初值必须是 0。通过改变 D-C-B-A 的接线可以让计数器在任意区间循环。举个例子用 74LS161 做“只从 2 数到 7”的计数器。计数序列是0010 → 0011 → 0100 → 0101 → 0110 → 0111 → 0010 → ...这是一个模 6 计数器但输出范围不是 0-5而是 2-7。实现方法是把 D-C-B-A 接成 0010当检测到 0111 时拉低 LOAD。下一个时钟沿将 0010 装载进去重新从 2 开始走。用公式表示如果要让计数器在 [A, B] 区间循环就在 B 状态拉低 LOADD-C-B-A 接 A模数等于 B-A1。这个技巧在需要“区间计数”的场景特别好用。比如按键值限定在一个范围内循环调整硬件计数器直接就能完成不需要软件判断。4. 一个计数器不够用级联时的进位链设计与模数合并4.1 两片161变成模256两片160变成模100单个 161 最大只能做到模 16单个 160 最大只能做到模 10要覆盖更大的计数范围就必须级联。级联的本质是把低位计数器的进位输出接到高位计数器的使能端让高位在低位“走满一圈”后加一。最简单的接法如下两片 74LS161左边是低位右边是高位。两个芯片的 CLK 接到同一个时钟源。低位的 RCO 接到高位的 ENT。高位的 ENP 接高电平。低位的 ENP 和 ENT 都接高电平。当低位计数到 1111 时低位 RCO 变为高高位 ENT 打开下一个时钟上升沿到达时低位从 1111 回 0000高位加一。因为两个芯片共用同一个时钟所以高位和低位始终同步推进。两片 161 级联后最大计数范围是 16 × 16 256。如果 D-C-B-A 全部悬空或接低它就是一个从 0 到 255 的二进制计数器。同理两片 160 级联后最大范围是 10 × 10 100可以显示 00 到 99这个结构在数字钟、计数器仪表里非常常见。这里要特别提醒RCO 接的是高位的 ENT不是 CLK。有些人误以为进位应该作为高位时钟结果高位芯片由 RCO 的上升沿触发但由于 RCO 和时钟是异步的计数器就会抖动时序关系完全乱套。正确的做法永远是把所有芯片接到同一个时钟只通过使能端来控制高位是否加一。4.2 非整数倍模数的处理以两片161做模120级联之后总模数不一定非要是 16×16256。如果要做模 120有两条路线。一条路线是把两片 161 级联成模 256然后对 256 这个“大模数”做反馈清零或同步预置。120 的二进制是 0111 1000。也就是说当高位 0111、低位 1000 同时出现时就到了第 120 个状态。检测 0111 1000 需要跨片组合QD_high QC_high QB_high QD_low如果做反馈清零直接把这个逻辑接到两片芯片的 CLR两片 CLR 并联如果做同步预置则接到两片 LOAD并联D-C-B-A 全部接低。另一条路线是先拆因子。120 10 × 12也就是用一片 160 做模 10再用一片 161 做模 12然后把两片级联。但注意这里的“模 10”用 160 本身就能直接实现“模12”需要用 161 加同步预置再用进位关系串联起来。实际工程里我更喜欢先考虑“级联 同步预置 统一清零”的组合方案因为这样整个电路只有一个时钟域控制逻辑集中后期调试方便。拆分因子的做法虽然在某些场景能省器件但会让两个芯片的行为模式不同排查问题时要多算一层。5. 用Verilog把74LS161“抄”一遍RTL建模与仿真验证5.1 从真值表到可综合的RTL代码数字电路设计进入 FPGA 时代以后直接用逻辑门搭计数器的情况变少了但 74LS161 这套行为模型依然有参考价值。因为它体现了时序逻辑中“复位、预置、使能、进位”四个核心要素照样可以用 Verilog 精确复刻。下面是 74LS161 的 Verilog 模型module ls161_counter ( input wire clk, input wire clr_n, input wire load_n, input wire enp, input wire ent, input wire [3:0] data, output reg [3:0] q, output wire rco ); always (posedge clk or negedge clr_n) begin if (!clr_n) begin q 4b0000; // 异步清零 end else if (!load_n) begin q data; // 同步置数 end else if (enp ent) begin q q 4b0001; // 计数加一 end // 其余情况保持 q 不变 end assign rco ent (q 4b1111); endmodule仔细看这段代码它在 always 块里把功能表逐条翻译成了行为描述。关键点是异步清零用negedge clr_n放进了敏感列表保证 clr_n 一拉低就能立刻出错。同步置数在时钟上升沿判断load_n不会产生额外毛刺。rco必须在 count 等于 1111 并且 ent 为高时才为高和硬件行为完全一致。74LS160 的模型只需要改几处module ls160_counter ( input wire clk, input wire clr_n, input wire load_n, input wire enp, input wire ent, input wire [3:0] data, output reg [3:0] q, output wire rco ); always (posedge clk or negedge clr_n) begin if (!clr_n) begin q 4b0000; end else if (!load_n) begin q data; end else if (enp ent) begin if (q 4b1001) q 4b0000; else q q 4b0001; end end assign rco ent (q 4b1001); endmodule区别就在两处一是 160 在 1001 时下一个状态直接回到 0000二是 RCO 的判定条件是 1001 而不是 1111。写这部分代码的时候很多初学者会犯一个错误把if (!clr_n)的判断放在else if后面。要记住异步清零优先级最高必须放在最前面否则仿真行为会跟真值表不一致。5.2 测试平台验证模6计数器行为光有模型还不够写个 testbench 验证一下计数器行为和我们的预期是否一致。下面这个测试平台用ls161_counter实现了模 6 计数timescale 1ns / 1ps module tb_counter; reg clk 0; reg clr_n 0; reg load_n 1; reg enp 1; reg ent 1; reg [3:0] data 4b0000; wire [3:0] q; wire rco; ls161_counter uut ( .clk(clk), .clr_n(clr_n), .load_n(load_n), .enp(enp), .ent(ent), .data(data), .q(q), .rco(rco) ); // 产生 10ns 周期的时钟 always #5 clk ~clk; // 模 6 设计在 q 5 时拉低 load_n下一个时钟沿装载 data0 always (posedge clk) begin if (q 4b0101) load_n 1b0; else load_n 1b1; end initial begin // 复位释放 #10 clr_n 1b1; // 运行足够时间观察几个周期 #200 $finish; end initial begin $monitor(TIME%0t | q%b | load_n%b | rco%b, $time, q, load_n, rco); end endmodule仿真跑完能看到 q 的输出序列是0000 → 0001 → 0010 → 0011 → 0100 → 0101 → 0000 → 0001 ...注意 load_n 在 q0101 时变低下一个时钟沿装载 data0。整个流程没有出现 0110 这个状态这就是同步预置法在仿真层面的体现。如果你用反馈清零法在仿真时就能看到 0110 短暂出现的一拍。虽然那一拍看上去很短但在真实硬件里它就是一个几十纳秒宽的毛刺足以触发后续电路误动作。6. 计数器不是孤岛数码管显示与实物调试中的常见坑6.1 74LS160 → 4511 → 共阴数码管完整接线计数器往往需要把结果显示出来最经典的组合就是 74LS160 配合 CD4511 去驱动共阴数码管。4511 是 BCD 码到七段译码器它接收 0000-1001 的 BCD 码输出对应的七段电平直接驱动共阴数码管。接线逻辑如下74LS160 的 QA、QB、QC、QD 分别接 CD4511 的 A、B、C、D 四个输入。CD4511 的 a-g 七段输出分别接数码管的 a-g 段引脚。数码管的公共阴极端接地。4511 的 VDD 接 5VVSS 接地。4511 的 LT灯测试、BI消隐、LE锁存使能按器件手册要求处理。实际使用中保持消隐和灯测试处于非激活状态把 LE 接低电平让数据直通是最简单稳定的做法。用 74LS160 而不是 74LS161 的好处是输出永远是 0000-1001不会出现 1010-1111 这些 4511 无法正确解释的状态。如果非要用 161超过 9 之后数码管会显示一些奇怪的图案看起来就像“乱码”。如果你要做两位数的显示就在 4.1 节的两片 160 级联结构基础上把两片 160 的输出分别接到两组 4511 和数码管上就能组成一个 00-99 的计数显示系统。6.2 实物调试里最容易翻车的五个细节很多人在仿真器里跑得飞起一上电就“不工作”其实问题往往出在这些地方。第一输入引脚不能悬空。ENP、ENT、CLR、LOAD 这四个控制脚只要悬空芯片就会因为输入电平不确定而乱计数。不用的数据输入端 D-C-B-A 也一样如果它们悬空置数时可能装进随机值。即使只需要回零也要把这四个脚老老实实接低电平或者通过电阻拉到确定电平。第二电源去耦不能省。计数器是时序芯片电源纹波会造成误触发。每片芯片旁边至少放一个 100nF 的瓷片电容靠近 VCC 和 GND 引脚这一点在面包板上尤其重要。第三按键输入需要防抖。如果计数器由按键触发机械按键的抖动会让一颗按键产生多次计数。硬件上可以加 RC 滤波或者用施密特触发器整形软件上则可以做一个简单的去抖判断。这个坑几乎人人会踩。第四测量时不要把示波器探头乱夹。计数器的 QA 和 CLK 都是边沿信号探头接地线过长会引入噪声看起来像毛刺。尽量用最短的地线或者在探头上加一个 10 倍衰减来减小负载。第五RCO 不带负载能力想象中那么强。如果你把一片计数器的 RCO 直接驱动太多东西比如同时接高位 ENT 和一颗 LED电平可能被拉低导致级联失效。正确的做法是把 LED 串电阻并联到 RCO 引脚或者干脆用一个缓冲门把 RCO 信号再扇出一次。我在实际调试中还有一个习惯先用低速时钟比如 1Hz验证逻辑再用高速时钟验证时序。低速时用肉眼或逻辑分析仪看计数序列高速时再用示波器看边沿关系。这样可以把功能问题和时序问题分开排查而不是混在一起越调越乱。说到底74LS161 和 74LS160 虽然已经是几十年前的芯片但它们背后的计数、使能、进位、清零和预置这些概念直到今天依然贯穿在 FPGA、单片机定时器、PLC 计数器的设计中。你把这几颗芯片吃透了回头再看 Verilog 里的always块、单片机里的定时器配置会发现很多逻辑都是相通的。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑