时序逻辑电路入门:触发器、计数器与FPGA设计基础
2026/9/7 2:46:30 网站建设 项目流程

简介:该PDF是东南大学《数字逻辑电路设计实践》课程第4章“基本时序逻辑电路”的完整实验报告,面向电子信息类本科生及需要掌握触发器、计数器、移位寄存器设计方法的入门学习者。报告从实验目的与原理讲起,围绕广告流水灯、序列发生器、智力竞赛抢答器、简易数字钟四个典型电路展开,给出了状态转换卡诺图化简、3-8译码器驱动8个LED的电路设计、Multisim仿真验证以及示波器与逻辑分析仪波形记录等完整过程。其中既包含74161计数器实现任意进制计数、74194移位寄存器自启动分析等核心知识点,也整理了实际搭接电路时遇到的置零延迟、数码管显示顺序、23:59进位异常等排错思路。包体为1个PDF文件,大小796KB,便于离线阅读。目前已有93人学习下载,适合作为课程实验预习、报告撰写对照或期末复习参考。 大二那会儿第一次翻开实验指导书看到“第4章 时序逻辑电路”的时候,我还没意识到接下来的几个下午我会被时钟、触发器和进位搞得焦头烂额。在这之前所有的数字电路实验都是组合逻辑,输入给个高电平,输出立刻跟着变化,哪怕不看时序图也能把电平推算出来。可时序逻辑不一样,输出的结果不仅取决于现在的输入,还取决于电路之前处于什么状态,也就是说它有“记忆”了。

说实话,数字电路实验里组合逻辑做得再花哨,充其量是在拼真值表和化简;真正让你理解计算机能“记住东西”这个概念的,就是从时序逻辑电路这一章开始的。触发器是存储的最小单元,寄存器是一排触发器并排干活,计数器是一串触发器配合逻辑门按节拍走状态,再往上就是状态机,而状态机几乎就是微处理器控制核心的雏形。这篇文章我结合自己当年做东南大学数字电路实验第4章的经验,把时序逻辑电路从实验操作、原理到踩坑排故完整拆开揉碎讲一遍,给正在做这份实验的学弟学妹一个可抄的作业,也给单纯想搞懂时序逻辑的读者一条不难走的路。

1. 时序逻辑实验到底在学什么

1.1 从组合逻辑到时序逻辑的关键转变

组合逻辑电路有个很直观的特质:输出只由当前输入决定。你在实验箱上接好一个与门,A和B都是高电平,Y就一定是高电平,拔掉一根线Y就立刻变低,整个过程干干净净,甚至不需要思考。

时序逻辑电路在这里撕开了一个口子:输出不再只看当前输入,还要看电路之前经历过的输入序列。比如一个计数器的输出是0010,单看这一拍你并不知道它下一刻该变成0011还是别的,得看它处于什么计数模式、有没有使能、时钟到了没有。这意味着电路里必须有东西能把之前的状态保存下来,这个东西就是触发器。

实验第4章就是在反复训练这种思维方式:你得开始习惯“上升沿”这个瞬间,习惯用状态表而不是真值表来描述电路行为,习惯把时间轴画出来一步步推信号。我清楚记得第一次看D触发器功能表时觉得假简单,Q跟着D走嘛,可真正接好线拨时钟时,LED的亮灭变化让我在原地愣了好一会儿——它就变了,但又不是一通电就变,而是每按一下时钟才变一次。那一瞬间我意识到,数字电路已经被切成了无数个离散的小节拍。

1.2 实验内容全景:不是只有一个计数器

翻开东南大学实验指导书第4章,你会发现这一章不会只塞给你一个计数器就完事,它会把时序逻辑的几个典型模块都过一遍,我按当时实验顺序整理了一下:

实验环节核心器件要掌握的技能
基本触发器验证74LS74、74LS112熟悉D触发器和JK触发器的输入输出关系,学会看状态表
寄存器/锁存器74LS374、74LS194理解并行输入输出、移位寄存器左右移的控制逻辑
计数器74LS161、74LS160二进制计数、十进制计数、使能端和进位端的配合
任意模数计数74LS161 + 门电路用清零或置数法构造模N计数器
分频电路触发器串联用触发器二分频,级联得到四分频、八分频

这五个环节不是孤立的,它们一环扣一环。触发器是寄存器的基础,寄存器又能拼成移位型计数器,计数器本质又是一个在状态空间里循环走步的有限状态机。做实验的时候我不建议拿到题目直接连芯片,先花半小时把这几个环节的关系在纸上画一画,比到了实验台上手忙脚乱要高效得多。

2. 触发器:时序逻辑的最小积木

2.1 D触发器为什么是实验首选

实验指导书让你验证触发器,通常会同时涉及D触发器和JK触发器。但我个人的建议是,把主要精力放在D触发器上,先把它的所有行为吃透,再去碰JK。

原因很简单:D触发器是当下数字电路设计中使用最广泛的存储单元,在FPGA内部的基本单元就是查找表加D触发器。D触发器的逻辑足够直白——时钟有效沿到来时,输出Q变成此刻D端的电平,其他时候Q保持原样。这意味着你只需要关心一个输入,推导起来毫无压力。

而JK触发器是教科书上的“万能触发器”,它把RS触发器的禁止态改造成了翻转态,功能表比D触发器丰富得多,但实际工程项目里反而用得少。做实验时经常见到有人被JK触发器在J=1、K=1时的翻转行为绕晕,导致电路状态推不对。我学的时候找到的办法是:先把JK触发器在功能表层面解构掉——J和K都为0就保持,都为1就翻转,一个0一个1就跟随相应输入——然后默写十遍功能表。看起来很笨,但上实验台真的不会再卡壳。

2.2 上升沿 vs 电平触发:为什么时钟边沿是个大事

我当年犯过的第一个比较“蠢”的错误,是以为只要给时钟端高电平,D触发器就会把数据存进去。实际接线之后发现根本不是这样,74LS74是边沿触发方式,只有时钟从低电平跳变到高电平的那一个瞬间,D端的数据才会被锁存到Q端。

大家可以把这个过程类比成拍照片:快门按下(上升沿)的瞬间,画面里的内容(D端电平)才被定格下来,快门一直开着(高电平)或者一直关着(低电平),都不会有新的照片产生。这就是边沿触发的意义所在——它严格限定状态更新的时刻,让整个数字系统像阅兵方阵一样按统一的哨声齐步走,避免各个模块因为你高我低乱套。

实验箱上通常给了一个手动按键可以产生单脉冲,也就是按一下产生一个上升沿。第一次用这个按键控制D触发器时,我心里默念着“按下去等于拍了一张照片”,每按一下观察一次Q端的变化,这种方式对建立时序感非常有帮助。

2.3 搭一个最简二分频电路:动手前的热身

理解了D触发器的边沿触发之后,我强烈推荐你先在实验箱上搭一个二分频电路,它是整个第4章实验里最简单但最有“时序感”的电路。接线就一句话:把D触发器的/Q端(也就是Q非)接到自己的D端。

从功能表推一下:假设初始Q=0,则/Q=1,D也就等于1。来了第一个上升沿后,D被锁存进Q,Q变成1,此时/Q变成0,D也跟着变成0。再来一个上升沿,D=0被锁存,Q回到0,如此反复。结果是:每来两个时钟上升沿,Q端才完成一个高电平和低电平的完整周期,也就是说输出频率是输入时钟频率的一半,所以叫二分频。

这个电路在示波器上看起来特别优美,也是很多同学第一次直观感受到“时钟信号可以从一块芯片的引脚进去,从另一块芯片的引脚出来就已经变了频率”。我从这个最小电路里得到的经验是:时序逻辑真不需要一上来就上多复杂的器件,搞懂一个触发器怎么自己“记住”并改变状态,后面计数器、状态机全都顺理成章。

3. 计数器:时序逻辑最经典的实验主角

3.1 异步计数器和同步计数器,别看名字像,接线差很多

实验做到计数器环节,指导书上一般会给出两种结构让你对比:异步计数器和同步计数器。我第一次没细看文字,照着电路图就开接,结果把两种结构混在一起乱成一团,最后只好全部拆掉重来。

区别在哪呢?异步计数器里,第一个触发器的输出作为下一个触发器的时钟。也就是说,前一级翻转之后,后一级才跟着动,像多米诺骨牌一样逐级传递。好处是电路简单、芯片连接少,坏处是每一级触发器的翻转都会带来一点点延时,级联多了以后,输出端的信号会出现明显的“毛刺”,而且整体速度上不去。

同步计数器则相反,所有触发器的时钟端全部接同一个时钟源,谁都不用等谁,大家都在同一个上升沿被驱动。每个触发器到底翻不翻转,由各自使能端的组合逻辑决定。这样做代价是组合逻辑复杂了一些,但信号路径更短、速度更快,也没有异步级联那种逐级延迟的隐患。工程上同步设计是大势所趋,实验课让你两种都搭一遍,本质上是在帮你建立对不同结构代价的直觉。

3.2 74LS161:四个触发器在家干活

实验里最常出现的计数器芯片是74LS161,它是一颗4位二进制同步加法计数器。我特别喜欢用这个芯片做实验,因为它把内部复杂的触发器和进位逻辑全部封装好了,你只需要关注外部引脚怎么配,就能很快看到计数效果。

74LS161的关键引脚我用自己的话梳理一遍:

引脚功能使用要点
CLR(清零)异步清零低电平有效,一拉到低不管时钟直接归零
LOAD(置数)同步置数低电平有效,等下一个上升沿才装入数据
ENP、ENT计数使能两个都接高电平,芯片才在时钟边沿计数
RCO进位输出计数到1111时输出一个高电平脉冲
A/B/C/D并行数据输入置数模式下,这些数据会被装入计数器
QA/QB/QC/QD计数输出QA是最低位,QD是最高位

搭一个最普通的0到15循环计数,只需要把CLR、LOAD接高电平(不让他们生效),ENP和ENT接高电平(允许计数),然后从实验箱上给一个时钟信号,从QA到QD接四个LED,就能看到二进制计数的全过程。这一步是一切计数器实验的基础,我建议每个人都在实验箱上至少完整跑一遍0到15。

3.3 反馈清零法做模N计数:一个小门电路的事

很多实验要求学生用74LS161做出模N计数器,比如计数到5就归零,也就是输出的状态只在0到4之间循环。核心技巧是“反馈清零法”:先用计数器正常从0往上加,当输出变成目标模值N时,用一个逻辑门检测到这个状态,然后把低电平送回CLR端完成清零。

比如做模5计数,QDQCQBQA从0000开始,逐步经过0001、0010、0011、0100,再到0101时,QA=1且QC=1。把QA和QC引到一个与非门,与非门输出接CLR,那么一旦输出到达0101,与非门输出立刻变成低电平,计数器被强制清零,回到0000。这里一定注意:模N要用的检测状态是N本身,而不是N-1。我第一次做模6计数时用来检测0101,结果计数器到5就提前清零了,数半天只有0到4在循环,检查了好一会儿才反应过来。

这个实验里还有一个常见的坑,就是清零信号持续时间太短,导致计数器在一个时钟周期内可能清零不干净,出现偶发乱码。实操中的解决办法是:如果实验箱上允许,尽量把清零信号和时钟信号做一次同步;如果只是验证功能,也可以接受电平毛刺,但要清楚它在工程上是不推荐的。

4. 实验操作核心细节与排坑经验

4.1 摁键消抖:为什么你按一次它跳两次

做手动时钟实验时,最常见的现象是:明明按了一下按键,LED却跳了两个甚至三个数。我第一次遇到时以为是芯片坏了,换了块74LS161还是老样子,后来问了助教才明白,根本不是芯片的问题,是按键本身在“抖动”。

机械按键从按下到稳定闭合,中间会有大约几毫秒到十几毫秒的弹跳,信号在高低电平之间来回震荡好几次。对一个上升沿敏感的计数器来说,这几次震荡等同于好几个时钟脉冲,于是按一次等于加了好几次计数值。实验中解决这个问题有几个土办法:

  • 用手指快速果断地按下去,减少抖动幅度,但治标不治本;
  • 在按键输出端并联一个几十微法的电容,构成RC滤波,把高频抖动滤掉;
  • 更专业的做法是用RS触发器组成硬件消抖电路,这也是很多实验指导书在时序逻辑环节会预留的一个拓展题目。

我自己的操作习惯是:用万用表或示波器先看一下按键输出的波形,确定抖动的大致持续时间,再决定要不要加电容。手动模式下顺手,省得每次数错重来。

4.2 毛刺从哪来,为什么计数器会闪现幽灵状态

逻辑门的输出不是瞬间变化的,信号从A传到B总有一点点延迟。多个信号路径的延迟不一样,组合逻辑的输出在某个瞬间就可能出现一个不满足预期的小毛刺。计数器在做反馈清零时,毛刺出现的概率尤其高,因为清零信号本身就是由组合逻辑生成的。

我记得做任意模计数时在示波器上看到过一个极其短暂的电平下跳,持续只有几十纳秒,肉眼在LED上根本看不出来,但接上一个对时钟敏感的芯片就可能被它误触发。排查毛刺的办法是先怀疑异步路径:清零反馈的与非门有没有加必要的滤波?进位RCO信号是不是直接接到了下一级的时钟上?我当时的做法是尽量把反馈回路的导线缩短,减少引线电感,并且把芯片的电源端就近接一个0.1微法的去耦电容,让毛刺不再容易把芯片打飞。工程上更稳妥的同步设计会让计数器用标准模值跑满后再清零,但实验课阶段我们只需要物理上抑制毛刺,避免它干扰观察结果就够了。

4.3 示波器触发设置:双通道看时序的正确姿势

搭好计数器之后,我想在示波器上看QA到QD的波形。当时用的示波器是双通道,一次只能看两路信号,我一开始随便把两个探头搭在QA和QB上,结果波形满屏乱跑,根本稳定不下来。

后来助教点了我一句:把时钟信号作为触发源,触发方式设为上升沿,再观察QA和QB,波形立刻就像被钉子钉住了一样稳定。原理很简单,所有触发器都是在时钟上升沿更新状态的,以时钟为参照来做触发,观察窗口就会始终对准同一拍的状态变化。把QA和QB在同一个时间基准下对比,才能看出高低电平更新的先后关系。

如果手头是四通道示波器,条件允许的话最好把时钟、QA、QB、进位RCO四路信号一起接上,观察进位产生时其他输出的状态。做这个实验我最大的感受是:示波器不只是给你看波形像不像,而是帮你把纸面上画的时序图变成真正可见的、有时间刻度的信号流,这对建立时序直觉帮助极大。

4.4 常见问题与排查技巧速查表

实验箱上接线杂乱,出了问题第一反应不应该是怀疑芯片,而是按流程排除。我把第4章实验期间遇到过的真实问题和排查路径整理成了表格,照着走基本能定位到九成的问题:

故障现象可能原因排查方法
输出端LED全不亮芯片电源或地没接好先用万用表确认VCC和GND引脚电压正常
输出恒为某一固定值清零端或置数端被意外拉低检查CLR、LOAD是否按要求接了高电平
按键一次LED跳多下按键抖动改成示波器看波形确认,或加电容消抖
某一位输出总是不变该位输出引脚接触不良重新插拔导线,换一个LED输入点试一下
计数到某一值就乱反馈清零信号产生毛刺缩短反馈线路,加去耦电容,必要时改同步清零方案
芯片发烫电源接反或输出短路立即断电,检查电源方向和负载接线

这张表我实验课上贴在本子第一页,每次遇到问题先对着看一圈再动手,基本不会盲目拆线。第4章实验的另一个隐藏考点就是排错能力,助教巡视时会故意看着你接错线然后问“你觉得问题在哪”,如果你能说出排查路径比单纯接对电路更让老师认可。

5. 从实验箱到FPGA:换个视角理解时序逻辑

5.1 实验箱的“硬接线”和编程语言的本质区别

做完第4章实验,如果你对时序逻辑的兴趣被勾起来了,正好可以再往前跨半步接触一下FPGA和硬件描述语言。实验箱上的连线是物理层面的,每个芯片、每个引脚、每根导线都看得见摸得着;而FPGA设计是用Verilog或VHDL把电路“画”进代码里,综合工具会把它自动映射成真实的逻辑单元。

我第一次在Quartus里写下一个计数器模块并下载到FPGA开发板上跑通时,最大的震撼是:实验箱上我花了一节课时间接的74LS161,在Verilog里只需要几行always时序块就把行为描述完了。但接线时建立的那种“时钟边沿触发”“复位信号优先”“状态更新有节拍”的直觉,在写代码时也完全用得上,所以并不是白费功夫。

5.2 Verilog里最关键的always时序块长什么样

用一个最简单的4位计数器来举例,描述方式如下:

module counter4 #(parameter N = 4) ( input wire clk, input wire rst_n, output reg [N-1:0] q ); always @(posedge clk or negedge rst_n) begin if (!rst_n) q <= 0; else q <= q + 1'b1; end endmodule

这一段代码里:

  • always @(posedge clk or negedge rst_n) 表示当时的上升沿或复位信号的低电平时,块内的语句才执行;
  • q <= q + 1'b1 用的是非阻塞赋值,这种赋值方式让所有触发器在同一个时钟边沿“同时”更新各自的输出;
  • 复位优先级最高,只要rst_n拉低,不管时钟怎么走,q都会立刻归零。

如果在实验箱上弄懂过74LS161的CLR和LOAD行为,再回来看这段代码就很容易对应起来:CLR对应异步复位,LOAD对应同步置数。我当时就是先在实验箱上把芯片行为摸透了,再写Verilog反而不觉得是在学一门新语言,更像是在换一种方式描述已经很熟悉的老朋友。如果你还有余力,真的建议把第4章实验里的模5计数器也用Verilog写一遍,再对比一下仿真波形和实验箱上LED的变化,那种两边都通的感觉很值。

做这一章实验,我最真切的心得其实只有一句话:不要急着追求一次把所有东西接对,时序逻辑电路从设计到工作天然就是一个“状态不断演进”的过程,允许自己出错、观察错误、再从错误里推回原理,才是这一章训练的核心。实验箱上的电源关掉、导线拆完的那一刻,我脑子里留下的不是某一根接线的位置,而是时钟沿到来时整个世界被刷新一次的画面。希望你也能在这个实验里找到自己理解时序逻辑的那个瞬间。

本文还有配套的精品资源,点击获取

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

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

立即咨询