ARTICLE DETAIL

资讯详情

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

74LS160实现任意进制计数器:从原理到实战全解析

74LS160实现任意进制计数器:从原理到实战全解析 整理工作台的时候翻出一盒落灰的74LS160一下子想起当年刚学数字电路时拿它搭电子钟、做分频器、折腾任意进制计数器的日子。前阵子圈子里还在聊硅光芯片这类前沿技术芯片制程和材料确实发展飞快但74LS160这种几十年前的TTL中规模芯片恰恰是我认为理解数字系统最好的切片。它小到一眼能看穿内部逻辑大到足够装下同步时序、反馈控制、竞争冒险这些真正的硬功夫。这篇就用它把“任意进制计数器”这件事讲透包括内部原理、设计思路、可抄作业的电路还有我踩过的坑。这篇内容适合刚学完数电基础、想动手做实验的学生也适合要准备面试或者做单片机外设扩展的开发者。看完你会清楚两件事74LS160到底是怎么工作的以及遇到“模几”的计数器需求时怎么一步步把电路画出来、调通、排错。1. 74LS160芯片原理与内部结构解析1.1 74LS160到底是什么74LS160是一颗同步十进制加法计数器属于74LS系列中规模TTL逻辑芯片。所谓同步是指芯片内部四个触发器的时钟端全部接在一起所有状态翻转都发生在同一个时钟上升沿所谓十进制是指它的输出Q3-Q0按0000到1001循环也就是二进制编码的0到9计数到9后再来一个时钟回到0同时产生进位。先看引脚功能这是后面所有设计的基础。引脚名方向功能说明CLK输入时钟上升沿触发计数MR输入异步清零低电平有效PE输入同步预置低电平有效CEP输入计数使能高电平有效CET输入计数使能高电平有效同时控制TC输出D3-D0输入预置数据输入Q3-Q0输出计数输出TC输出进位输出计数到9且CET为高时输出高电平VCC/GND电源5V供电很多人分不清74LS160和74LS161其实它们引脚完全兼容区别只有一点74LS160是十进制计数范围0000到100174LS161是十六进制计数范围0000到1111。后续做任意进制时如果误用了74LS161电路可能直接乱套这一条后面排查问题时会再提。74LS160之所以经典还在于它支持级联扩展。四片74LS160串起来就能做成一个0到9999的计数器配四个数码管就是最简单的频率计显示电路。它的CEPCET和TC引脚天生就是为同步级联设计的。1.2 内部工作原理一个时钟沿上的“团伙作案”理解74LS160内部工作原理不要一上来就抠门级电路先看状态转移逻辑。芯片内部是四个主从JK触发器时钟共享所以是同步时序。它的次态逻辑可以等效写成这样最低位Q0每个时钟沿都翻转J0K01Q1当Q01且Q30时翻转否则保持0J1Q3非*Q0K1Q0Q2当Q1Q01时翻转J2K2Q1*Q0Q3当Q2Q1Q01时置1当Q01时清0J3Q2Q1Q0K3Q0沿着这个逻辑从0000开始推0000到0001Q0翻转0001到0010Q1翻转0010到0011Q0翻转0011到0100Q2翻转0100到0101Q0翻转0101到0110Q1翻转0110到0111Q0翻转0111到1000Q3置11000到1001Q0翻转1001到0000Q3清0Q1保持0看到没关键是1001到0000这一步。正常的四位二进制此时应该进到1010但Q3的K端被接成Q0在状态1001时Q01所以Q3被强制清0同时Q1的J端在Q31时被禁止翻转所以直接回到0000。这就是十进制计数器的内部“非法状态屏蔽”它在逻辑层面把1010到1111这六个状态全部跳过去了。这里顺便说一句芯片制造的题外话。现在很多模拟芯片和混合信号芯片出厂前都要做trim修调用激光或者eFuse去调整内部电阻网络让基准电压、振荡频率更精确。74LS160这种纯数字中规模TTL芯片不需要trim但“修调”这个概念放在板级设计里其实就是我们调反馈电阻、调复位电容的过程。理解芯片内部怎么处理偏差能帮你更好地理解外部电路怎么配合它。74LS160还有一个特性容易被忽略自校正能力。如果上电瞬间芯片落在1010到1111这些非法状态内部反馈逻辑会在几个时钟周期内把它拉回有效循环。以状态1011为例按上面的方程推下一个时钟会回到0000所以芯片不会一直卡死在非法状态。但别因此就不做上电复位后面实操部分会详细说。1.3 进位输出TC的时序细节TC引脚是级联的关键它的表达式是TC Q3 * Q0 * CET。也就是说只有在计数到1001这个状态并且CET为高电平时TC才输出高电平。这个高电平会持续整个状态9的时钟周期直到下一个时钟沿把芯片带回0000TC才拉低。TC的时序意义在于它给高位芯片提供了一个“我即将溢出”的指示信号。在同步级联电路里低位的TC直接接到高位的CEP和CET低位计数到9时高位使能下一个时钟沿低位回0、高位加1。两个芯片在同一时刻翻转没有累积延迟。还有一个容易混淆的点MR和PE的异步/同步特性。MR是异步清零意思是只要MR拉低不管时钟处于什么状态输出立刻变0000PE是同步预置必须等到下一个时钟上升沿D3-D0的数据才能被装入。这个区别直接决定了清零法和置数法的电路结构、毛刺特性下一章展开讲。2. 任意进制计数器设计思路从状态空间看“取模”2.1 为什么模数转换是计数的本质计数器的本质是在状态空间里跑圈。一个n位二进制计数器有2的n次方个状态但它只是默认跑满整个圈。任意进制计数器要做的事情就是在这个大圈里截取N个连续状态让它只在这N个状态里循环这就是“模N”。用钟表来类比很好理解。12小时制时钟就是模12计数器它永远不会显示13点60分钟制就是模60计数器分钟到59后自动回0。74LS160本身是模10计数器我们要做的就是把一个模10的芯片或者多片级联合起来改造成模N的电路N可以是5、7、13、37、60、24、86400只要需求合理都行。设计任意进制计数器核心就一句话决定从哪里“截断”以及截断后怎么“跳回起点”。截断的方法只有两大类——清零法和置数法。理解这两类方法的本质差异比背十个电路图都有用。2.2 清零法和置数法两种反馈方案的底层逻辑清零法的思路很暴力让计数器从0开始正常计数一旦检测到目标状态N立刻通过MR引脚把芯片异步清零让状态跳回0000。比如模5计数器让它数0、1、2、3、4到50101的瞬间清零于是它永远在0到4之间循环。置数法的思路更温和让计数器正常计数检测到某个状态后通过PE引脚在下一个时钟沿把预设数据D3-D0装进芯片从预设值重新开始。置数法又分两种常见变体。第一种是预置0法。例如模5计数器检测状态40100在状态4期间拉低PE下一个时钟沿把0000装入于是状态序列是0、1、2、3、4、0、1、2、3、4。第二种是TC反馈置数法。用74LS160天然的TC信号状态9时输出高电平取反后接PE同时把D3-D0设为某个初值。比如D5则状态序列是5、6、7、8、9、5、6、7、8、9这也是模5。这种方法的电路最简洁但只适用于需要从某个中间值往上数到9的场景。把两者放在一起对比差异非常明显对比项清零法置数法反馈检测状态检测N瞬间清零检测N-1或利用TC下个沿预置清零/置数时机异步立即生效同步等待时钟沿毛刺风险高反馈译码有尖峰低时序天然干净电路复杂度简单略复杂适用范围对时序不敏感的场景后级有触发器、对毛刺敏感时优先为什么清零法会有毛刺因为MR是异步的。组合逻辑检测到N状态的瞬间输出清零信号这个信号经过与非门、反相器会有延迟同时Q端输出也在变化两者竞争。结果是Q端状态N只维持几十纳秒就被清零但在这几十纳秒里如果后级电路恰好在这个状态译码就可能采到一个不该出现的值。更极端的情况是清零信号和时钟上升沿几乎同时到达导致芯片状态不确定。置数法之所以稳是因为PE信号的建立时间要求。反馈逻辑即使产生了窄毛刺只要它不在时钟沿附近被采到就不会影响最终结果。实际工程中对毛刺敏感的系统我几乎都建议用置数法代价只是多一个与非门。2.3 初始状态与无效状态的处理还有一个经常被忽略的问题上电时芯片处于什么状态74LS160没有POR上电复位功能上电瞬间状态是随机的。虽然它有自校正能力但如果系统一上电就开始计数前几个周期输出可能是非法值后级逻辑可能因此产生误动作。我的习惯是给MR引脚加一个上电复位电路。最简单的做法是RC复位一个10k电阻从VCC接到MR一个1uF电容从MR接到GND。上电瞬间电容短路MR为低芯片清零电容充满后MR被电阻拉到高电平芯片开始正常工作。这个电路的成本不到一毛钱但能省掉大量排查“为什么上电状态不对”的时间。置数法设计里预置数据的设置同样要小心。D3-D0如果悬空在TTL电路里会漂移到不确定电平预置结果完全随机。所以这几个引脚要么接VCC要么接GND不要留空。后面实战部分会给出具体接法。2.4 级联把小模数拼成大模数单片的74LS160最大只能到模10想做大模数必须级联。级联有两种方式同步级联和异步级联工程上优先同步级联。同步级联的做法是所有芯片的CLK接同一个时钟低位的TC接高位的CEP和CET。当低位计数到9时TC输出高电平高位使能下一个时钟沿到来时低位回0高位加1。因为大家用的是同一个时钟沿芯片之间的传递延迟不会累积时序非常干净。异步级联的做法是把低位的TC取反后接到高位的CLK让高位被低位的进位沿触发。但TC在状态9期间是高电平回到0时变低经过反相器后产生上升沿正好触发高位加1。这个电路也能工作但TC到反相器再到高位时钟的路径上有延迟高速工作时容易出现竞争。所以除非是极低速的场合我不推荐异步级联。级联时还有一个细节如果要做成任意模数的大计数器比如模60就不能简单把两片模10直接级联因为高位芯片也需要被“截断”成模6。也就是说级联后的每一级都要根据最终模数的进制分配来确定各自的模数。具体怎么分配下一章用实例讲。3. 任意进制计数器设计实战三个可直接抄的电路3.1 设计五步法与反馈逻辑代数化每次设计任意进制计数器我都按五步走基本不会出错。第一步确定模数N明确有效状态是从几到几。大多数场景是从0到N-1。第二步选择反馈方案。对毛刺不敏感、追求电路简单用清零法对时序要求高用置数法。第三步确定芯片数量和级联方式。单片能搞定就用单片搞不定就级联。级联时优先同步级联。第四步写出反馈逻辑表达式。清零法对应检测N状态置数法对应检测N-1状态或者利用TC反馈。把每个状态对应的Q端写成与逻辑即可。第五步仿真或搭电路验证。用Multisim、Proteus或者直接面包板搭都行重点观察关键节点的波形。写反馈逻辑有个通用方法把目标状态写成二进制凡是该状态为1的Q端拿出来做与运算最后看引脚电平极性决定要不要取反。比如模10以内的计数器清零法检测NN5二进制0101Q21且Q01反馈逻辑F Q2 * Q0因为MR低有效所以需要把F取反用与非门实现N6二进制0110Q21且Q11反馈逻辑F Q2 * Q1同样用与非门N7二进制0111Q21且Q11且Q01三个信号相与后取反所以一个与非门就搞定了。如果芯片数量超过一片反馈信号就需要跨芯片取Q端用多输入与非门解决。3.2 实战一模5计数器——清零法与置数法的完整对比先看清零法模5。目标状态0到4反馈检测50101。电路连接MR通过10k电阻接VCC1uF电容到GND实现上电复位Q2接到与非门一个输入Q0接到与非门另一个输入与非门输出接MRCEP和CET都接高电平时钟从CLK输入工作过程0、1、2、3、4到达5的瞬间Q21且Q01与非门输出低电平MR立刻清零。理论上这个5状态只存在几十纳秒。用示波器看Q端能看到4到0的跳变但在跳变瞬间会有一个毛刺尖峰。再看置数法模5我推荐预置0法。目标状态0到4反馈检测40100预置数据0000。D3-D0全部接GNDQ2经过一个反相器接PE。状态4时Q21反相器输出低电平PE有效其他状态Q20PE无效其他引脚同上CEP、CET接高工作过程0、1、2、3、4在状态4的一个完整周期内PE保持有效下一个时钟沿到来时把0000装入芯片回到0。状态4不会被截断所以波形干净没有毛刺。这里我建议新手把两个电路都搭一遍用示波器对比看看。清零法的输出在回0瞬间有一根细毛刺置数法没有。这个对比做完你对异步和同步的理解会上一个台阶。3.3 实战二模60计数器——两片级联与跨片进位的处理模60计数器是电子钟秒个位和秒十位的基本结构也常用来做60分频。它需要两片74LS160个位做模10十位做模6同步级联。先想清楚各级的模数和反馈个位模10本来就是十进制不需要改十位模6有效状态0到5反馈检测60110清零或者检测50101置数。这里因为后级时钟都是由TC驱动的我一般用清零法更省门电路如果对毛刺敏感就改成置数法级联个位TC接十位CEP和CET但这里有一个大坑十位是模6计数器它永远走不到9所以十位的TC引脚永远不会有输出。那么更高一级比如分个位拿什么作为进位信号正确做法是做一个跨片联合译码检测个位为9且十位为5的状态把这个状态作为整个模60计数器的进位输出。具体实现有两种方式。方式一用十位Q21代表十位等于4或5模6清零时只到5所以Q21时十位是5或4和个位TC相与。当十位是5且个位是9时两个条件同时满足输出进位。但注意十位Q21的状态包括4和5如果个位是9且十位是4也会产生误进位所以这个方式不能简单用。方式二把十位的模6反馈信号和个位的TC相与。十位模6清零法检测的是6状态如果把检测6的与非门输出同时作为十位MR的驱动并在检测6时同时输出一个进位标志那么当十位检测到6时表示已经完成了0到5的六个周期此时个位必然刚走完一轮。但问题是个位TC在9时产生十位加1发生在个位回0的瞬间十位从5到6也是这个瞬间。所以“十位检测到6”这个信号天然就表示“已经走完60个脉冲”可以直接作为更高级的进位信号。换句话说模60计数器的进位输出点可以从十位的模6清零检测信号引出而不是从十位TC引出。这个思路适用于所有“高位不是十进制”的级联设计用高位模数反馈信号作为进位标志而不是依赖TC。常见的电子钟电路里分钟十位是模6它向小时级的进位就是这么处理的。实际电路参数个位CEP、CET接高D3-D0接地MR接RC复位十位CEP、CET接个位TC输出MR接RC复位和模6反馈清零的与非门输出用两输入与非门Q2和Q1相与因为6的二进制是0110进位输出十位模6清零检测信号注意这里已经是低有效可以直接用如果把输入时钟设为60Hz整个电路输出就是1Hz的秒脉冲接个LED能看到每秒闪一次。用这个电路做基础再扩展两级就能做成时钟模块。3.4 实战三模24计数器——双片反馈与电子钟小时电路模24计数器是电子钟小时位的经典结构有效状态0到23到23后回0。电路依然用两片74LS160个位模10十位模3因为小时十位只到2。清零法做法检测状态230010 0011并清零。反馈条件拆开看十位Q11十位为2个位Q11且Q01个位为3。三个条件同时满足时三输入与非门输出低电平同时接到两片的MR瞬间清成0000 0000。置数法做法检测状态23后预置0。因为PE是同步的状态23会完整存在一个周期下一个时钟沿把0000 0000装入。反馈条件同样是23状态但接到两片的PE而不是MR。这里有个好处23状态不会产生清零毛刺但23状态会短暂显示如果驱动数码管能看到23正常显示。清零法因为23状态只有几十纳秒数码管几乎不会显示23视觉上是从22直接跳到00。两片芯片的预置数据端D3-D0全部接地即可。我实际做电子钟时小时位用的是置数法。原因是小时位后面往往接闹钟比较逻辑如果23状态被毛刺截断闹钟比较器可能漏判23点59分的状态。模24的级联方式也是同步级联个位TC接十位CEP和CET。十位走到2的时候个位每计到9十位加1从2到3但3状态被反馈逻辑截掉清零法或预置跳掉置数法于是回到0。注意十位走到3其实是高位反馈的瞬间状态不是正常工作状态。3.5 质数模数与任意大模数的通用解法如果模数不是10、6、24这种能拆成常规进制的数比如模37怎么办思路是先把若干片级联成一个大模数M要求M必须大于等于N然后对N进行反馈截断。模37的话两片74LS160级联最大模100足够覆盖37。清零法检测37二进制是0011 0111。拆反馈条件十位Q11且Q01个位Q21且Q11且Q01。五个信号相与用一个5输入与非门输出接两片的MR即可实现0到36共37个状态循环。如果模数更大比如需要模600就先用同步级联做三片模10再检测600。600的二进制是0000 0110 0000 0000反馈条件变成检测次高位片Q2和Q1。原理完全一致。由此可以得到通用公式用k片74LS160同步级联最大模数为10的k次方设10的k次方大于等于N则清零法检测N的二进制编码置数法检测N-1的二进制编码。这里还要提醒一点反馈逻辑跨片取Q端的时候连线尽量短避免走线过长引入额外延迟。TTL电路的信号边沿很陡长走线会带来反射和振铃在高速计数时可能导致反馈误触发。3.6 面包板搭建要点与上电检查顺序面包板搭74LS160电路有几个细节直接影响成败。电源去耦。TTL芯片在翻转瞬间会有电流尖峰如果不加去耦电容电源线上会出现毛刺轻则计数乱跳重则芯片烧毁。每片74LS160的VCC和GND之间就近放一个0.1uF瓷片电容这是底线。输入引脚不要悬空。TTL输入端悬空相当于接高电平但抗干扰能力很差。CEP、CET这些使能引脚要么直接接VCC要么通过1k电阻接VCC不要让它飘着。D3-D0在不用预置时也要明确接地或接VCC。上电检查顺序。我习惯先测静态电平用万用表确认VCC是5V左右MR在复位电容充满后确实是高电平CEP和CET都是高电平。然后用手动按钮一端接GND一端接CLK逐个送脉冲看输出是否按预期跳变。确认基础计数没问题再接上自动时钟信号用示波器看波形。时钟信号源也要注意如果用信号发生器输出电平要调到TTL兼容范围高电平至少2.4V低电平最高0.8V。有些函数信号发生器默认输出TTL可以直接用有些要设置负载和幅度。4. 常见问题与排查技巧实录4.1 高频雷区速查表做74LS160实验和项目时下面这些现象出现频率最高我把原因和解决办法整理成了表格方便你直接对照。现象可能原因解决方法计数器完全不动CLK没接好或悬空CEP/CET没拉高用示波器看CLK是否有正常脉冲检查使能引脚电平计数顺序乱跳清零反馈毛刺或D3-D0悬空导致预置随机改用置数法或者把D3-D0明确接地/接VCC上电状态随机没有上电复位电路加RC复位电路或手动复位按钮计数到某个值卡住反馈检测状态写错检测了N1重新核对二进制编码清零法检测N置数法检测N-1级联时高位漏计数异步级联时序竞争或TC接错使能端改用同步级联TC接高位的CEP和CETTC一直没有输出CET没接高或者芯片是74LS161不是74LS160确认CET电平核对芯片型号清零后偶尔停留在非法状态清零信号和时钟沿竞争芯片进入亚稳态缩短反馈路径或在MR上加RC滤波优先改用置数法驱动数码管亮度不一致74LS160输出驱动能力不够加三极管或缓冲芯片驱动数码管不要直接带大电流负载用74LS161替代后行为完全不对161是十六进制160是十进制换成真正的74LS160或者改反馈逻辑4.2 一个真实的毛刺案例我之前做60分频器时后级接了一片74LS74双D触发器做脉冲整形。现象是分频输出有时会多出一个窄脉冲用示波器看才能发现表现为主输出旁边跟着一个细尖峰。排查过程是这样的先看时钟输入干净再看计数器输出发现十位从5回0的瞬间Q端波形有一个明显的回勾。这个回勾来自十位模6清零的异步毛刺。虽然计数器本身的输出最终稳定了但毛刺通过走线耦合到了后级D触发器的时钟端导致它误触发。解决办法有两步。第一把模6反馈检测从清零法改成置数法让回0动作发生在时钟沿彻底消除毛刺来源第二在所有芯片的电源脚旁边补了0.1uF去耦电容减小同步开关噪声。改完后再用示波器看输出波形干干净净。这个案例的教训是毛刺不一定只影响本级计数器它可能通过走线耦合到任何敏感节点。排查时不要只盯着功能框图看要用示波器把每个关键节点的波形都过一遍。4.3 示波器和逻辑分析仪的使用技巧调试74LS160这类并行输出芯片工具选择很关键。逻辑分析仪适合看并行数据和状态跳变。把Q3-Q0接到四个通道设置触发条件为上升沿采样率至少是时钟频率的4倍以上就能清楚看到状态序列是不是符合预期。用逻辑分析仪自带的解码功能把4位二进制转成十进制对照计数器序列一目了然。排查“计数到7直接跳0”这类问题逻辑分析仪比示波器直观得多。示波器适合看时序细节。重点看三处TC信号的宽度是否为一个完整时钟周期清零/预置时Q端有没有毛刺以及CLK上升沿和数据变化之间是否满足建立时间。测毛刺时把时基放到每格20ns左右触发电平设在2V左右反复触发才能抓到。探头要用10x档减小对电路的负载否则你看到的波形可能不是芯片真实行为。还有一个实用技巧把示波器触发源设置为TC信号然后观察Q端在TC跳变前后的波形。这样能稳定地看到进位瞬间所有输出的变化判断是否存在竞争冒险。4.4 测量和调试的几条独家经验第一先静态后动态。用万用表把所有静态电平确认一遍再给时钟。不要在引脚电平都没确认的情况下直接上高频信号否则出了问题没法定位。第二给反馈信号加RC滤波要谨慎。清理零毛刺时有人习惯在MR引脚和GND之间加一个小电容比如100pF把毛刺滤掉。但这会影响清零速度在高速计数时可能让芯片来不及响应产生错误状态。我的经验是反馈路径越短越干净优先通过布局解决而不是靠加电容。第三多片级联时找问题要分级隔离。把高位的CEP和CET接地让它停止计数先单独验证低位模数是否正确确认低位没问题再放开高位使能逐级往上排查。一次只测一级问题很快暴露。第四注意74LS系列和74HC系列的混用。74LS是TTL电平74HC是CMOS电平两者高电平阈值不同。如果前级是74HC输出直接驱动74LS输入可能出现驱动不足。市面上一些74LS160的替代型号标注为74HC160引脚兼容但电平特性有差异混用前务必查数据手册。第五保护芯片。大多数初学者烧芯片都是因为电源接反或者带电插拔。74LS160的电源引脚没有反接保护接反必烧。插芯片前先用万用表量一下面包板电源轨确认极性正确再插这是成本最低的防护。个人经验再补一条仿真软件里跑通的电路上板不一定一次过反过来也一样。Multisim里默认没有走线寄生参数而面包板上有接触电阻和分布电容。遇到仿真和实测不一致先别急着怀疑芯片检查电源去耦和接地是否可靠。TTL电路对地弹噪声敏感一块干净的地是稳定工作的基础。最后再分享一个这几年常用的训练方法。很多人一上来就啃FPGA、写Verilog但我一直觉得先用74LS160搭几个计数器把清零、预置、级联、毛刺这些概念在示波器上亲眼看到再回去写代码你的时序意识和调试能力会扎实得多。芯片可以老基本功不会过时。
返回列表