ARTICLE DETAIL

资讯详情

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

基于JK触发器的七进制同步加法计数器设计与调试全流程解析

基于JK触发器的七进制同步加法计数器设计与调试全流程解析 做数电课设或者自己动手搭时序逻辑的时候很多人第一反应就是“计数器”。确实计数器是时序逻辑里最经典、也最能检验基本功的一个模块。网上搜“七进制计数器”能出来一大堆参考资料但大多数只给一个结论性的电路图或者直接把方程扔给你至于“这个方程怎么来的”“为什么用JK不用D触发器”“无效状态到底怎么处理”往往一笔带过。这篇博文我打算把“基于JK触发器的七进制同步加法计数器”从需求分析到状态方程推导再到硬件接线和排错实战完整走一遍流程每一步都解释清楚为什么这么设计顺便把我踩过的坑也一起说出来。这个项目最典型的场景是数字电路课程设计、实验课验收或者考研复试时被问到“同步计数器的设计方法”当然也适合刚学完触发器、想拿个小项目练手的同学。整个设计用到的核心元件就是边沿JK触发器配合少量门电路纯逻辑搭建不需要写代码也不需要单片机非常适合用来建立“时序逻辑设计”的肌肉记忆。读完这篇文章你能独立完成状态转换图、状态表、卡诺图化简、驱动方程推导、自启动验证以及面包板实搭调试这一整条链路。1. 设计目标与整体方案选型1.1 需求拆解七进制加法计数器到底要什么先明确需求。所谓“七进制加法计数器”就是每来一个时钟脉冲计数器的数值加1从0加到6然后回到0如此循环。也就是说有效循环里有且只有7个状态。很多新手在这里第一反应是“7个状态那用3个触发器就够了吧”但心里其实没底我帮你把这句话背后的数学逻辑说透。一个触发器只有两个稳定状态能记0和1。n个触发器级联起来能表示的状态数是2的n次方。2的2次方等于4小于7放不下2的3次方等于8刚好大于7。所以至少要3个触发器。这里用的编码方式是自然二进制码也就是Q2Q1Q0这三位直接表示数值0到6对应关系是000、001、010、011、100、101、110。这样编码的好处是直观后续如果要接数码管显示BCD译码也方便如果换格雷码虽然相邻状态只翻一位、抗干扰性能好一点但译码显示要额外多绕一圈加法计数也用不上它的优势所以自然二进制是最合理的默认选择。3个触发器有8种状态组合但我们只需要7个多出来的那个就是状态111。这个状态怎么处理是这个设计里最关键也最容易被忽略的问题。直接把它当作无效状态扔在一边不管当然也可以但万一电路因为上电随机或者外部干扰进入了111它就可能卡在无效循环里跳不出来计数器就“死机”了。所以设计时必须额外做自启动检查确保从111也能回到有效循环里这一点后面会专门讲。1.2 为什么选JK触发器同步方案又好在哪触发器的类型选型也是个值得说的问题。D触发器、T触发器、JK触发器各有特点D触发器是“数据跟随”用起来简单但设计时你得自己把状态方程改写成D输入的形式T触发器是“翻转控制”做计数器很顺手但市面上单独的T触发器芯片不如JK常见JK触发器功能最全它的特性方程是Q等于JQ反加K反Q四个状态变化都能覆盖所以JK触发器被称为“万能触发器”选它来做设计自由度最高也最能体现对时序逻辑的理解。再说同步和异步的区别。异步计数器也叫行波计数器就是前一级的输出接后一级的时钟像多米诺骨牌一样一级一级往后传。优点是电路简单一个触发器挨着一个连就行但致命的缺点是传输延迟会逐级累积一级、两级、三级延迟叠起来在高频时钟下极易出现毛刺和误码。同步计数器的做法是所有触发器共用一个时钟信号每个触发器的状态变化都在同一个时钟边沿发生不存在逐级延迟累积的问题抗干扰能力和工作频率都要高一个档次。我们这里既然标题明确要求“同步加法计数器”那就老老实实按照同步方式来设计虽然组合逻辑门会多一两个但可靠性是完全值得的。还要多说一句关于边沿JK触发器。老式的主从JK触发器存在一个“一次性翻转”问题也就是在时钟高电平期间如果J、K输入有变化输出可能只翻转一次而不是严格按照电平持续期间变化这个特性在某些场合很难驾驭。现在教材和工程里默认使用的都是边沿JK触发器比如74LS76、74LS112这种它们只在时钟上升沿或下降沿的那一瞬间采样输入状态其他时间输入再怎么抖动都不影响输出抗干扰能力好得多这也是“边沿JK触发器”成为这个领域设计默认选择的原因。2. 核心设计步骤与状态方程推导2.1 状态转换图与状态表设计同步时序电路的第一步永远是画状态转换图这一步做扎实了后面就是按部就班的化简计算。七进制加法计数器的状态转换关系非常规律000进到001001进到010010进到011011进到100100进到101101进到110110进到000。另外再补一条无效状态111进到000这是为了自启动。状态转换图在纸上画出来就是7个圈加一个悬空状态箭头方向全是顺时针。画完之后把它翻译成状态表。状态表的输入是现态输出是次态也就是“给一个时钟脉冲之后电路会跑到哪里去”。为了后续推导方便我会把每个现态对应的次态都列清楚。现态 Q2 Q1 Q0次态 Q2 Q1 Q0000001001010010011011100100101101110110000111000这张表就是整个设计的“宪法”后面所有的卡诺图化简、驱动方程推导全部围绕这张表展开。如果这张表里任何一个次态填错了后面电路搭出来一定是错的所以这个地方务必逐行核对。2.2 用次态方程反推JK驱动方程有状态表之后就要开始推驱动方程了。很多同学在这一步卡壳是因为没搞清楚“次态”和“驱动”的关系。我们手里有的是3个JK触发器每个触发器都有J端和K端需要决定的是这6个输入脚分别接什么逻辑。JK触发器的特性方程是Q J·Q反 K反·Q也就是说已知当前Q和期望的Q就能反推出J和K应该是什么组合。JK触发器的好处是它有“不需要关心另一端”的自由度。具体规则是这样的当Q从0变成0也就是要求保持0时可以取J0、K任意值因为JK0x在Q0时输出保持0。当Q从0变成1要求置1时J必须为1K取任意值。当Q从1变成0要求清零时J取任意值K必须为1。当Q从1变成1要求保持1时可以取J任意值、K0。这个规则最好背下来推导驱动表的时候每行都靠它。我们逐位分析Q2。先看Q2的跳变现态 Q2 Q1 Q0次态 Q2Q2跳变J2K200000→00x00100→00x01000→00x01110→11x10011→1x010111→1x011001→0x111101→0x1从这个表能看得很清楚J2只有在011这一个状态需要为1K2只需要在110和111为1其他情况全是任意项x。用卡诺图圈1J2就是Q1和Q0的与K2更简单Q1为1就置1所以K2直接等于Q1。这里顺带说一个卡诺图化简的小心得任意项x是化简的最好工具能圈就圈圈得越多表达式越简单千万不要把x当0对待。再看Q1和Q0同样的分析方法。Q1的跳变规律是在001和101这两个状态需要从0变为1在011、110、111需要从1变为0其他状态保持不变。Q0的跳变规律更特殊一点它在000到101这6个连续状态里每次都翻转但到110状态时保持0不变在111状态又翻转回到0这个特殊性直接决定了J0的表达式不会是简单的接高电平。把所有位的JK驱动真值整理成一张完整的表格现态Q2Q1Q0J2 K2J1 K1J0 K00000010 x0 x1 x0010100 x1 xx 10100110 xx 01 x0111001 xx 1x 1100101x 00 x1 x101110x 01 xx 1110000x 1x 10 x111000x 1x 1x 1逐项用卡诺图化简之后得到最终的驱动方程J2 Q1·Q0K2 Q1J1 Q0K1 Q0 Q2J0 (Q2·Q1)反也就是Q2反加Q1反K0 1这个结果里有个很有意思的点J1直接等于Q0K0直接接高电平驱动电路简单得超出很多人的预期。这就是卡诺图化简的威力也是为什么教材强调不要死记硬背现成的驱动方程一定要自己动手推导一遍因为你化简出来的表达式可能和参考书不一样但都是正确的实现。2.3 代入验证与自启动检查方程推完之后千万别急着接线先做一遍纸面上的代入验证。这一步能帮你筛掉大半的错误成本几乎为零。方法很简单把每个现态代入驱动方程求出J和K的值再用JK特性方程算次态看它是否和状态表一致。我从000开始验证一遍。现态000Q20Q10Q00。J20与0等于0K20所以Q2保持0J10K10加0等于0Q1保持0J0(0与0)反等于1K01Q0从0翻转到1。次态是001完全正确。再验一个最容易被忽略的111状态。现态111J21与1等于1K21所以Q2从1翻转到0J11K11加1等于1Q1从1翻转到0J0(1与1)反等于0K01Q0从1变0。次态是000成功回到有效循环。这就证明电路具备自启动能力111这个无效状态不会让计数器死锁。完整验证下来状态转换路径是000到001到010到011到100到101到110到000111也归零和设计目标完全吻合。到这里逻辑设计层面就已经闭环了。3. 硬件接线与实操实现3.1 芯片选型与器件清单如果只是交一份设计报告做到驱动方程这一步就已经合格了。但如果你要把它做成实物还需要认真考虑器件选型。首先当然是3个边沿JK触发器最常用的芯片是74LS76和74LS112都是双JK触发器芯片一片里面有两个触发器买两片就够4个触发器位实际用3个还剩一个备用万一哪一路烧了还能顶上。这里要特别注意触发沿的问题。74LS76是下降沿触发也就是时钟从1跳变到0的时候采样输入74LS112同样是下降沿触发。而74HC109是上升沿触发。你的实验箱、面包板上的时钟信号发生器不一定和芯片触发电平一致接线之前一定要翻Datasheet确认触发电平极性不然计数方向、清零逻辑全都会乱。如果使用Multisim仿真软件里的虚拟JK触发器默认可能是上升沿触发注意看元件属性。逻辑门这边J2Q1·Q0需要一个与门K1Q0Q2需要一个或门J0(Q2·Q1)反需要一个与非门。对应的芯片分别是74LS08四2输入与门、74LS32四2输入或门、74LS00四2输入与非门。这些芯片都是一片四个门所以各买一片就够用了。输出观察部分最简单的是接3个LED高电平亮、低电平灭或者低电平亮也行反正能区分就行。如果想让计数结果更直观可以用74LS47或CD4511加一个共阳/共阴数码管来显示十进制数不过那属于显示译码的扩展内容我建议第一次调试时先用LED把核心逻辑跑通了再折腾显示优先级更高问题定位也更简单。3.2 面包板/实验箱完整接线步骤接线前先确认电源。74LS系列芯片供电电压是5V注意电压别超接反了芯片直接冒烟。面包板通常有上下两条电源轨先用导线把一侧电源轨接5V另一侧接GND然后把所有芯片的VCC和GND脚都接到对应的电源轨上。这里有个强烈建议逐个芯片供电每接一个芯片就立即万用表确认一次电源没短路而不是全部接完再通电。实测下来如果通电之后才发现某个芯片发烫排查起来比慢慢接线要痛苦得多。接下来是时钟输入。先把时钟信号发生器或者手动单脉冲按钮输出接到3个触发器的时钟端因为同步计数器要求所有触发器共用一个时钟。时钟频率先用1Hz左右方便LED肉眼观察。如果是实验室的信号发生器直接设成1Hz方波如果是面包板自己搭的按钮单脉冲需要加一个简单的RC去抖电路。去抖的常规做法是按钮一端接5V另一端通过10kΩ电阻接地按钮和电阻的连接点再接一个10μF电解电容到地这样一来按下按钮产生的电平抖动会被电容吸收输出一个干净的单脉冲。电容极性不能接反电解电容长脚为正极接信号端短脚接地。然后按驱动方程接线。Q1接到J1K1接一个或门的输出该或门的两个输入分别接Q0和Q2J2接一个与门的输出该与门的两个输入分别是Q1和Q0K2直接接Q1J0接一个与非门的输出该与非门的两个输入分别是Q2和Q1K0接高电平。所有触发器的异步置位端和异步清零端不用的时候要接无效电平。74LS76的PRE和CLR是低电平有效正常工作时必须接高电平否则芯片会被强制置位或清零这也是新手最容易踩的坑。3.3 调试观察与波形验证技巧接完线第一次通电前先把所有触发器的输出端接到LED上。我习惯在LED和触发器的Q输出之间串一个330Ω到1kΩ的限流电阻防止电流过大。通电后按单脉冲按钮正常现象应该是LED状态按000、001、010、011、100、101、110这样变化到110后再按一次直接回到000。用LED看是一种验证方式用示波器看波形则是另一种更深层次的验证。示波器探头分别接Q0、Q1、Q2时基调到合适档位。你会发现Q0的翻转频率是时钟的一半Q1是四分之一Q2不是严格的八分之一因为它从1回到0的周期被截断了。用示波器能直观看到同步计数器的核心特征三个触发器的跳变沿对齐在同一个时钟边沿上不存在像异步计数器那样的逐级延迟阶梯波形。这一点在验证“同步”设计时特别有说服力。如果是做课程设计验收强烈建议拍一张示波器波形照片把Q0、Q1、Q2三条波形放在一张图上标出对应的时间关系这比任何文字描述都有说服力。另外把逻辑分析仪接到三个输出端记录一段连续翻转的数据从数据序列里也能直接数出7个状态检查有没有跳状态或重复状态。4. 常见问题与排查技巧实录4.1 计数器卡死或跳变乱序我见过最多的故障现象是上电后LED状态根本不按预期走或者走到某个状态就停了或者乱跳。首先检查时钟这是最高概率的问题点。如果用的是信号发生器确认输出幅度够不够5V左右频率是不是太低或太高如果用的是按钮加去抖电路先确认去抖电容的正负极有没有接反很多时候电容接反了等效成一个很小的电容去抖失效一次按钮按下去会产生多次触发计数器就“跳着走”。其次是检查清零端和置位端。很多初学者知道CLR是清零但不知道它低电平有效把这个脚悬空或者接地了导致芯片一直被清零计数器永远停在000不动。这个问题的排查方法是用万用表量每个触发器的CLR和PRE引脚电压正常工作时应该是高电平接近5V如果测到低电平说明问题在这里。还有一个经验芯片引脚间距小面包板相邻5个孔是同一列插的时候容易误插错位如果某个触发器完全不动优先怀疑它的时钟或输出引脚插错了列。4.2 数码管显示闪烁或乱码如果你接了数码管显示可能会遇到显示乱跳或数字闪烁的问题。先说闪烁闪烁大概率是时钟频率太低比如用1Hz手动按钮数码管每秒只换一次数字人眼会觉得它在闪烁。如果用了10Hz以上的自动脉冲还闪那可能是显示译码器的锁存使能端没有处理好建议用带锁存的显示驱动方式在一个计数周期内保持显示数据稳定。乱码则要区分是计数器本身的问题还是译码器的问题。方法很简单断开译码器先用LED看三个触发器的原始状态。如果LED波形正常说明是译码器接线或编码不对如果LED本身就在乱跳说明问题在计数电路不要去动译码器。这种“分而治之、逐级隔离”的排查思路在数字电路调试里几乎永远有效遇到一个复杂故障现象时先把系统切成几段找出一段里是否有正常的输出很快就能缩小问题范围。4.3 无效状态进入后死锁还有一种情况是电路上电瞬间因为电容充电、电源爬升的不确定性触发器随机进入了一个无效状态然后就卡在那里不动了。如果你用的是我们推导的驱动方程理论上111会被自动拉回000不应该死锁。但如果你参考的教材或网上资料用的是另一种化简方法比如把111状态当作任意项化简出来的方程可能把111送到另一个无效状态去了那就会死锁。验证自己的电路是否会死锁有个很笨但很实用的方法上电后如果计数不是从000开始或者卡在某个状态那就手动把三个触发器的输出人为拨成111再送一个时钟脉冲看它能不能回到000。如果能回来说明自启动设计成功如果卡住就要回到卡诺图重新检查无效状态对应的次态设置。最简单的解决办法是在设计状态表时就把111的次态明确写成000不要在卡诺图里把它当任意项随意圈这样虽然表达式可能稍微复杂一点点但换来自启动的绝对可靠性非常值。4.4 故障排查速查表把上面这些经验整理成一张速查表方便现场调试时对照现象可能原因排查方向计数器完全不动时钟信号没接入或电平不匹配查时钟端电压变化、触发沿极性计到某个值卡住驱动方程接线错误核对与门/或门/与非门接线状态乱跳、一次跳多位按钮未消抖、芯片触发沿极性不对检查去抖电路、更换触发器芯片某个触发器固定为0或1CLR/PRE引脚电平不对万用表测CLR/PRE是否接高电平芯片发烫电源正负接反或引脚插错立即断电检查电源和引脚数码管乱码译码器输入编码不对或计数器本身出错LED直接观察计数器输出逐级隔离最后再多说一句经验之谈。做数字电路实物永远不要一次把所有芯片都插满再通电正确姿势是先搭一个触发器单独验证它能翻转再搭第二个验证两个触发器的级联关系最后才接完整电路。这个过程看起来慢但实际是总耗时最短的路径。我自己第一次搭这个七进制计数器的时候图省事一股脑全接完结果出问题排查了快一个小时后来老老实实拆掉逐级验证半小时就全部搞定了。这个项目做完之后你还可以试着把状态表改成六进制、九进制甚至十进制只改卡诺图里那几个无效状态的处理方式就行设计流程完全一样。想更深入的话还可以用Verilog把同样的逻辑写一遍做仿真对比软件和硬件两条腿走路对时序逻辑的理解会再上一个台阶。
返回列表