← 返回博客移位寄存器

掌握移位寄存器:从串行到并行转换

移位寄存器把 D 触发器串联起来,每个时钟脉冲移动一位数据。构建 SIPO、PISO 和 PIPO 变体,并了解 UART 与 LED 矩阵驱动器如何使用它们。

DennyDenny
阅读约需 7 分钟
Chalkboard feature illustration for “掌握移位寄存器:从串行到并行转换”

**要点速览:**移位寄存器是一串 D 触发器,每一级的输出连接到下一级的输入。每逢时钟边沿,所有比特都移动一个位置。常见配置包括 SISO、SIPO(串行转并行,74HC595 LED 驱动器使用此模式)、PISO(并行转串行,UART 发送器使用此模式)和 PIPO。

移位寄存器让数据在硬件中每个时钟周期移动一位,是串行传输与并行存储之间的桥梁。UART、LED 驱动器、串行器、解串器和某些处理器移位数据通路中都有相关结构;不过,高性能移位器也可能改用组合桶形移位网络。

移位寄存器究竟是什么?

从本质上说,移位寄存器是一种同步时序电路。它由一串触发器——通常是 D_FLIP_FLOP——像“传桶队列”一样连接起来。链中的每一级恰好存储一个比特。时钟脉冲到来时,寄存器中的每个比特向右或向左移动一个位置,就像列车上的乘客依次挪到下一个座位。

D_FLIP_FLOP 组件图

DigiSim.io 的 SHIFT_REGISTER 组件封装了这种复杂结构,但若要清晰观察传播过程,仍可使用独立的 D_FLIP_FLOP 逐级搭建。

探索 D_FLIP_FLOP 组件

数学基础

移位寄存器中单级的行为由 D_FLIP_FLOP 的特性方程决定:

Qnext=DQ_{next} = D

在多级移位寄存器中,第 nn 级的输入 DD 连接到第 (n−1)(n-1) 级的输出 QQ。因此,时刻 t+1t+1 的整个寄存器状态可以写成:

Qn(t+1)=Qn−1(t)Q_n(t+1) = Q_{n-1}(t)

正是这条简单关系,让数据能够在硬件中“流动”。

数据移动的四种形式

移位寄存器并非全都相同。根据数据的输入与输出方式,通常可将其分为四种主要类型。理解这些区别,是为具体应用选择正确配置的关键。

1. SISO:串行输入、串行输出

**输入:**每个时钟周期一位。**输出:**每个时钟周期一位,但有延迟。

SISO 是最简单的形式。数据一次进入一位,又从另一端一次输出一位。它相当于数字周期延迟器:在 4 位 SISO 寄存器中,现在进入的比特会在四个有效时钟边沿后出现在最远端输出。因此,SISO 寄存器可用于对齐已经同步的控制流或数据流。通用移位寄存器本身并不是完整的时钟域跨越方案。

2. SIPO:串行输入、并行输出

**输入:**每个时钟周期一位。**输出:**所有位同时可用。

SIPO 是“扩展”配置。输入是一串串行比特;寄存器装满后,可以同时读取全部输出(Q0,Q1,Q2,Q3Q_0, Q_1, Q_2, Q_3)。串行输入、并行输出器件常用于扩展数字输出,例如用较少的控制器引脚控制一组指示灯。下文提到的 74HC595 芯片把移位寄存器与一个独立的输出存储寄存器组合在一起。

3. PISO:并行输入、串行输出

**输入:**所有位同时加载。**输出:**每个时钟周期一位。

PISO 的作用与 SIPO 相反。它接收一个完整数据“字”——例如来自数据总线的 8 位——再把它串行化为逐位数据流。UART 发送器包含这种基本功能,外围还配有帧格式、波特率、奇偶校验、状态和缓冲逻辑。

4. PIPO:并行输入、并行输出

**输入:**所有位同时加载。**输出:**所有位同时可用。

PIPO 能够并行加载并并行输出数据。单独使用时,它的行为与普通寄存器相同,可在时钟边沿捕获一个字。“通用”移位寄存器还会加入并行加载以及由控制信号选择的左移和右移模式。对于不发生溢出的无符号值,逻辑左移一位相当于乘 2;逻辑右移则相当于向下取整除以 2。带符号算术和溢出还需要额外处理。

移位寄存器组件

技术规格:4 位 SIPO 真值表

下面观察一个 4 位 SIPO(串行输入、并行输出)在四个时钟周期中的行为。假设要移入二进制序列 10111011,从最右边的比特开始。

时钟脉冲串行输入(DinD_{in})Q3Q_3Q2Q_2Q1Q_1Q0Q_0
初始00000
T1T_111000
T2T_211100
T3T_300110
T4T_411011

需要注意,在 T1T_1 进入的“1”如何依次从 Q3Q_3 移到 Q2Q_2、Q1Q_1,最后到达 Q0Q_0。这就是“移位”的实际过程。

常见误区:时序与传播延迟

所有级都会在同一个有效边沿采样各自输入。由于触发器要经过时钟到 Q 延迟后才改变输出,先前存储的值只会前进一级。正确运行既要求通过最大延迟的建立检查,也要求通过最小延迟的保持检查。

三个重要参数是:

  1. **建立时间(tsetupt_{setup}):**数据在时钟边沿之前必须保持稳定的最短时间。
  2. **保持时间(tholdt_{hold}):**数据在时钟边沿之后必须继续保持稳定的最短时间。
  3. **时钟到 Q 延迟(tcqt_{cq}):**从有效时钟边沿到发起级的 QQ 输出发生改变所需的时间。

对于级间直接连接,简化的保持条件为:

tcq,min+troute,min≥thold+tskew+Uholdt_{cq,min} + t_{route,min} \ge t_{hold} + t_{skew} + U_{hold}

其中,在时钟偏斜指南采用的符号约定中,正的 tskewt_{skew} 表示捕获时钟到达得更晚。建立检查使用最大的时钟到 Q 延迟和路由延迟。静态时序分析会根据目标器件的特征延迟完成这些检查;功能波形查看器无法证明实体硬件完成了时序收敛。底层约束详见建立时间、保持时间与亚稳态。

打开移位寄存器演示

使用 OSCILLOSCOPE_8CH 验证行为

构建 SHIFT_REGISTER_8BIT 时,仅观察 OUTPUT_LIGHT 并不足够——在高时钟频率下,它们闪烁得太快,人眼无法追踪。

若要真正验证电路:

  1. 把 CLOCK 连接到 OSCILLOSCOPE_8CH 的通道 1。
  2. 把串行输入连接到通道 2。
  3. 把并行输出(Q0Q_0 到 Q5Q_5)连接到其余通道。

运行仿真后,波形应该呈现阶梯模式:被采样的串行比特在第一个有效边沿后出现在第一级,并在之后的每个边沿向前移动一级。利用这种视图可发现位序、使能、复位和周期数中的逻辑错误。除非模型包含特征化延迟,否则波形看起来对齐并不能证明——也不能否定——实体硬件的建立与保持时序。

实际应用:从 1978 年到今天

移位寄存器不只是学术练习,而是电子行业的主力器件。

1. 74HC595 与 LED 控制

74HC595 是一款 8 位串行输入、并行输出移位寄存器,并带有独立存储寄存器。控制器可以先移入数据,再通过锁存信号同时更新八个输出位。器件可以级联,但负载的数量和类型受输出电流、封装总电流、时钟速率、信号完整性和刷新要求限制;大型 LED 系统需要合适的驱动器,而不能无限制地直接扩展。

2. 与 Intel 8086 配合的 UART/USART

Intel 8086 并未集成 UART。系统可以把它与 Intel 8251A USART 等外设配合使用。从概念上说,处理器把一个字节并行写入外设;发送逻辑为它添加帧格式,再把各位移到串行线路上。接收逻辑采样串行帧,并通过并行总线提供恢复后的字节。现代 UART 实现会在底层移位操作周围加入波特率生成、起始与停止位处理、状态标志和缓冲。

3. 乘法与除法

将二进制数左移一位,在不发生溢出的条件下等价于乘以 2。

10112(1110)≪1=101102(2210)1011_2 (11_{10}) \ll 1 = 10110_2 (22_{10})

现代 ALU(算术逻辑单元)使用高速移位结构,在一个时钟周期内完成这些操作。

在 DigiSim.io 上构建第一个移位寄存器

可按以下步骤构建并验证一个 4 位 SIPO 寄存器:

  1. **放置各级:**把四个 D_FLIP_FLOP 组件拖到画布上。
  2. **串联数据:**把第一个触发器的 QQ 输出连接到第二个触发器的 DD 输入。对所有级重复这一连接。
  3. **共用时钟:**放置一个 CLOCK 组件,并把它连接到全部四个触发器的时钟输入。它们必须同步,这一点至关重要。
  4. **输入与输出:**把 INPUT_SWITCH 连接到第一个触发器的 DD 输入,并在每个 QQ 输出上连接一个 OUTPUT_LIGHT。
  5. **发挥 SimCast 的优势:**使用 SimCast 功能记录电路行为。切换输入开关,发出时钟脉冲,观察“1”如何在灯之间移动。

试用 8 位 SIPO 模板

总结

移位寄存器表明,简单元件通过组合即可实现较复杂的行为。串联若干触发器便可转换数据格式、延迟信号并执行移位运算。

尝试构建一个 4 位双向移位寄存器,让它根据控制开关选择左移或右移——在每一级的数据输入前,把 SHIFT_REGISTER 与一个多路复用器结合起来。

接下来可以学习 SISO、SIPO、PISO 与 PIPO 模式,或打开 D 触发器组件参考——它正是这个教学模型背后的存储元件。

将想法变成真正可运行的电路。