一、组合与时序:有没有"记忆"
上一页学的逻辑门,输出只取决于此刻的输入,这叫组合逻辑。它没有记忆,输入一变,输出立刻跟着变。
但真实的数字系统需要记住东西:计数要记住现在数到几了,状态机要记住当前处于哪一步,存储器要记住一个数。能记忆的电路,叫时序逻辑。它的输出既取决于当前输入,也取决于过去的状态。
类比:组合逻辑像一个"只看当前路况"的司机,眼前什么样就怎么开;时序逻辑像一个"记得刚才走过哪里"的司机,他会根据过去的路线决定下一步。记忆,就是数字电路能做复杂事情的起点。
一句话区分:组合逻辑 = 输出 = f(当前输入);时序逻辑 = 输出 = f(当前输入, 过去的状态)。
二、锁存器:最简单的记忆
怎样让电路"记住"一个 1?最简单的办法是让门的输出反馈回自己的输入。用两个或非门(NOR)交叉连接,就得到SR 锁存器:
- S(置位)= 1,R(复位)= 0:输出 Q 被置为 1,并且在 S 撤掉之后依然保持 1。
- S = 0,R = 1:Q 被复位为 0,并保持。
- S = 0,R = 0:保持原来的状态,这就是"记忆"。
- S = 1,R = 1:禁止状态,两个输出都被拉低,撤掉后结果不确定,设计时必须避免。
类比:想象一个门闩:推一下门闩就"扣上"(置位),拉一下就"打开"(复位)。松手之后,门闩保持原来的状态,不会自己动。SR 锁存器就是这种"推一下就保持"的记忆单元。
锁存器的缺点:它是"电平敏感"的,只要 S 或 R 处于有效电平,输出就跟着变。在复杂系统里,这种"随时可能变"的特性很难控制。所以实际工程中更多使用的是触发器。
三、D 触发器:在时钟边沿"拍照"
D 触发器是最常用的存储单元。它只在时钟的某个边沿(通常是上升沿)那一瞬间,把输入 D 的值"拍下来",存进 Q。平时 D 怎么变,Q 都不跟着变。
时钟上升沿到来时:Q ← D
"←"表示"赋值":在上升沿的那一刻,把 D 的值复制给 Q,之后保持,直到下一个上升沿
3.1 动手试一试:只在上升沿时"拍照"
先点击"改变 D",把 D 切换成 0 或 1(此时 Q 不变);再点击"时钟上升沿",Q 才会更新为 D 的值。右侧的日志会记录每一次操作。
输入 D0
时钟 CLK0
输出 Q0
输出 Q̄(取反)1
3.2 为什么要"只在边沿"动作?
想象很多个触发器连在一起工作:如果它们都是"电平敏感"的,一个触发器的输出变化,会立刻影响后面的,结果一团乱。只在同一个时钟边沿统一"拍照",所有触发器就像听到同一个指挥的口令,步调一致。这就是同步设计,也是现代数字系统的基础。
3.3 其它常见触发器
| 类型 | 特点 | 用途 |
| D 触发器 | 上升沿时 Q 取 D 的值 | 寄存器、流水线、同步电路 |
| JK 触发器 | J、K 都为 1 时翻转("切换") | 计数器、分频器(老式设计常见) |
| T 触发器 | T 为 1 时每个时钟翻转一次 | 计数器、二分频 |
四、时钟:电路的节拍器
时序电路需要一个统一的"节拍",这就是时钟(CLK)。它是一列周期性的方波,每个周期由"高"和"低"组成。
| 概念 | 含义 | 例子 |
| 频率 f | 每秒钟有几个周期 | 8 MHz 表示每秒 800 万个周期 |
| 周期 T | 一个完整周期所用的时间,T = 1/f | 8 MHz 的周期 = 125 ns |
| 占空比 | 高电平时间占整个周期的比例 | 50% 表示高低各占一半 |
| 上升沿 | 从低跳到高的那一刻 | D 触发器常在这里动作 |
| 下降沿 | 从高跳到低的那一刻 | 部分芯片在这里动作 |
类比:时钟就像乐队的指挥棒。每挥一下(上升沿),所有乐手同时演奏一个音符(触发器更新)。如果没有统一的节拍,每个人各弹各的,就变成噪音了。
单片机的"主频":标称 72 MHz 的单片机,意思是它的时钟每秒钟跳 7200 万次,每次跳动,内部的很多触发器就可能更新一次。主频越高,单位时间能做的事越多(当然功耗也越大)。
五、建立时间与保持时间:拍照要"站稳"
触发器要在时钟边沿可靠地"拍到" D,D 的数值必须在边沿之前就稳定下来,并且在边沿之后还要保持一小段时间。这两个要求分别叫:
建立时间 tsu:边沿到来之前,D 必须已经稳定的最短时间
保持时间 th:边沿到来之后,D 必须继续保持不变的最短时间
数据在这两个窗口内变化,就会"拍糊",输出可能进入不确定状态(亚稳态)
实际问题:如果一个外部按键或异步信号,直接接到 D 触发器的输入,它随时可能在建立/保持窗口内变化。解决办法是"同步化":用两级触发器串联(称为两级同步器),降低出错的概率。这是后面讲按键和跨时钟域时最重要的一条原则。
类比:给一个快速移动的物体拍照,你要求它在拍照前一瞬间保持静止,拍完后还要再停一会儿,照片才清楚。建立和保持时间就是这个"静止窗口"。
六、寄存器:一组触发器
把 8 个 D 触发器并排放在一起,共用一个时钟,就得到一个 8 位寄存器。它可以一次性存下一个字节。单片机里的各种"寄存器",本质就是这样一排触发器。
💾
数据寄存器保存一个字节的数据,如 ADC 的转换结果
⚙️
控制寄存器保存配置位,如"使能外设""选择模式",每一位控制一个功能
🚦
状态寄存器保存当前状态,如"发送完成""有数据到达"
读单片机手册的线索:你在手册里看到的"某寄存器第 3 位为 1 时开启 XX 功能",就是在操作这组触发器中的某一个。学会二进制位操作,是读懂寄存器的前提。
七、计数器:会数数的电路
把触发器首尾相连,并让它们按照一定规则翻转,就能做出计数器。最常见的是二进制计数器,它按 0、1、2、3…… 的顺序数数。
7.1 动手试一试:4 位二进制计数器
每点击一次"时钟 +1",相当于来了一个时钟脉冲。计数器从 0 开始数,数到 15 后回到 0。你可以切换为自动运行,观察计数的节奏。
当前计数(十进制)0
二进制0000
最大值15(回到 0)
7.2 计数器为什么能数数?
每个触发器相当于一个"位"。每来一个时钟,最低位 Q0 翻转一次;当 Q0 从 1 变到 0 时,它会去"推"高一位 Q1 翻转;Q1 再推 Q2,依此类推。这就像汽车的里程表:个位每转一圈,十位才进一格。
类比:二进制计数器就是"带进位的里程表"。个位(Q0)每次都转,个位从 1 翻回 0 时,给十位(Q1)进一,依此类推。只不过里程表是逢十进一,二进制计数器是逢二进一。
7.3 异步计数器(纹波计数器)
上面的方式,每一位是"接在前一位后面"的,因此进位会一级一级地传过去,像水波一样"纹波"传播。它结构简单,但高位要等低位,速度慢,适合做分频而不是高速计数。
7.4 同步计数器
所有位都接同一个时钟,进位信号用组合逻辑提前算好。它速度快、状态稳定,是高速计数器和单片机内部定时器的常用结构。
计数器溢出:4 位计数器数到 15 之后再加一,就会回到 0。这叫溢出。在程序里,如果你不注意溢出,计时、计数的结果会突然"跳回"很小的数,导致逻辑错误。这个问题在单片机定时器里非常常见。
八、分频:把快时钟变慢
计数器有一个非常有用的特性:第 n 位的翻转频率,是时钟频率的 1/2ⁿ⁺¹。也就是说,每往高位走一位,频率就减半。这叫分频。
第 n 位(从 Q0 开始数)的输出频率 = 时钟频率 / 2^(n+1)
例:时钟 1 kHz,Q0 输出 500 Hz,Q1 输出 250 Hz,Q2 输出 125 Hz……
8.1 动手算一算
最高位输出频率-
完整循环一次(2ⁿ 个时钟)-
最低位输出频率-
手表为什么准?石英手表用 32.768 kHz 晶振,它正好是 2¹⁵ Hz。经过 15 级二分频,正好得到 1 Hz 的秒信号。这是数字分频最经典的应用。
九、与单片机的关系:定时器就是计数器
单片机里的定时器,本质上就是一个计数器:它对时钟脉冲计数,数到某个值时产生一个事件(溢出中断)。学会了计数器,定时器就很好理解。
9.1 定时器溢出时间
溢出时间 = 计数值 × 时钟周期 = 2ⁿ / f
例:16 位定时器、时钟 72 MHz,不加分频,溢出时间 = 65536 / 72 000 000 ≈ 0.91 ms
9.2 为什么要用分频器(预分频)?
如果要定时 1 秒,16 位定时器在 72 MHz 下一次最多只能数 0.91 ms,远远不够。所以要先用预分频把时钟降下来(如 1/7200),再数到 10000 次,就能得到 1 秒。这就是我们在单片机程序里经常见到的"预分频值 + 重装值"的由来。
类比:想要测量一个小时,你不会用秒表一秒一秒地数,而是先用一个"分针"(预分频)把时间放慢,再用计数器数分钟。定时器也是这样,用分频把快时钟"放慢",才能测较长的时间。
十、按键去抖与同步
机械按键按下和松开时,触点会来回弹跳几毫秒到几十毫秒,电平会出现多次跳变。如果直接让单片机去读,一次按下可能被当成很多次按下。
10.1 两种解决办法
- 硬件去抖:在按键两端并联一颗 100 nF 电容,配合上拉电阻,把跳变"抹平"。简单,但不能完全消除。
- 软件去抖:检测到电平变化后,延时 10 ~ 20 ms 再读一次,确认稳定后才认为按下了。这是单片机程序中最常用的方法。
10.2 同步化:避免亚稳态
按键信号是"异步"的,它与时钟没有关系。把它直接接到内部电路,可能正好落在建立保持窗口内。标准做法是用两级 D 触发器同步化:第一级可能出现亚稳态,但第二级会把它"整理"成稳定的 0 或 1。
异步按键 → D 触发器 1 → D 触发器 2 → 内部电路(已同步)
设计习惯:凡是来自外部、与内部时钟无关的信号(按键、外部中断、传感器开关),都要先同步再使用。这是数字设计里非常重要的一条规则。
十二、本节小结
- 组合逻辑输出只看当前输入;时序逻辑有记忆,输出还取决于过去的状态。
- SR 锁存器用反馈实现记忆,但是电平敏感,工程中多用D 触发器。
- D 触发器只在时钟上升沿把 D 拍进 Q;D 必须满足建立时间和保持时间。
- 时钟是节拍器,周期 T = 1/f;同步设计让所有触发器步调一致。
- 寄存器是一排触发器,单片机的控制、状态、数据寄存器都是这样构成的。
- 计数器逐位进位,n 位数到 2ⁿ − 1 后溢出回 0;第 n 位频率为 f / 2ⁿ⁺¹。
- 定时器就是计数器,溢出时间 = 2ⁿ / f;预分频用于定较长的时间。
- 外部异步信号(如按键)要软件去抖,并用两级触发器同步化。
下一课:第7课 · 电源基础(LDO、DC-DC)——给所有这些电路稳定可靠的"能量"。
回到上一页:第6课(上):数字基础