学习导航
本章把多个触发器“串起来”,形成能够保存、移动和转换数字数据的移位寄存器。建议按“单级存储 → 四种输入/输出方式 → 双向移位 → Johnson/环形计数器 → 工程应用 → 故障排查”的顺序学习。文中的 Q₀ 通常是最先进入数据的级,Q₃/Q₇ 是移出端;具体方向以图中箭头为准。
一、先建立直觉:寄存器就是会移动的多位记忆
一个 D 触发器在时钟有效边沿把 D 的 0 或 1 存入 Q,并在下一次时钟到来前保持不变。因此,一个由 n 个触发器组成的寄存器能保存 n bit;每来一个时钟,级与级之间按照连线把数据复制到相邻级,这就是“移位”。
- 存储容量:等于级数(触发器数),4 级就是 4 bit,8 级就是 1 byte。
- 移位能力:每个时钟边沿把数据向右或向左移动一位;移入端补进新 bit,移出端丢出旧 bit。
- 清零:用异步 CLR 或连续移入 0 均可清零;实际芯片通常提供专用清零端。
下图展示 D 触发器如何保存 1 或 0。

常见数据通路包括:串入串出(SISO)、串入并出(SIPO)、并入串出(PISO)、并入并出(PIPO),以及向左/向右旋转。箭头表示每个时钟数据移动的方向。







判断口诀
看到“一个数据线逐位进入”就是串行输入;看到“多根线同时装入”就是并行输入。输出端同理。类型的四字母缩写按“输入/输出”顺序读:SISO、SIPO、PISO、PIPO。
二、四种数据输入/输出方式
2.1 串入串出(SISO)
4 位 SISO 由 4 个 D 触发器串接而成。数据一次进入 1 bit,连续 4 个时钟后填满;再继续打时钟,最早进入的 bit 先从末级 Q₃ 出来。若串入序列按最低有效位优先(LSB first),必须结合移位方向判断最终并行排列。

Worked Example 8-1(保留原题与结论):5 位寄存器初始清零,按题图给定的数据和时钟波形输入。第 1 个时钟把第一个 1 存入,之后每拍右移;5 个时钟后寄存器为 Q₄Q₃Q₂Q₁Q₀=11010,波形见图8-4。若数据输入反相,只需把每拍采样到的 0/1 取反后重复同样的移位过程。


逐拍跟踪方法:先写初态;每个有效时钟边沿同时完成“新 bit → Q₀、旧 Q₀ → Q₁、旧 Q₁ → Q₂ …”。不要在一个时钟内使用已经更新后的值。
2.2 串入并出(SIPO)
SIPO 的装入过程与 SISO 完全相同,但每一级 Q 都引出,因此 4 个 bit 装满后可同时读出。它是“少线传输、多线处理”的核心电路。

Worked Example 8-2(保留原题与结论):4 位寄存器初始全 1,按图8-7的串行输入和时钟逐拍移位。4 个时钟后状态为 0110。若第四拍之后继续保持串行输入为 0,再打 3 拍,寄存器状态为 0000。

74HC164 是典型 8 位 SIPO 芯片:A、B 为门控串行输入,CLR 为低有效异步清零,Q₀~Q₇为并行输出。只有 B=1 时,A 上的数据才能在时钟边沿进入。


VHDL 读法
原书的 VHDL 将每一级 D 触发器实例串接:FF1 的 D 接 FF0 的 Q,依次类推。
Clr与数据相与实现清零效果;真实器件的异步 CLR 时序应以数据手册为准。
-- 8位串入并出结构的核心连接(示意)
FF0: dff1 port map(D=>D0 and Clr, Clock=>Clock, Q=>Q0);
FF1: dff1 port map(D=>Q0 and Clr, Clock=>Clock, Q=>Q1);
-- FF2 ... FF7 以同样方式连接2.3 并入串出(PISO)
PISO 用多根并行线一次装入,再用一根串行线逐拍移出。SHIFT/LOAD=0 时选择并行输入;SHIFT/LOAD=1 时关闭并行通路并允许右移。选择逻辑本质是 AND-OR 多路选择器。


Worked Example 8-3(保留原题与结论):图8-11给出时钟和 SHIFT/LOAD。第1拍并行装入 D₀D₁D₂D₃=1010,之后第2~4拍依次把剩余 bit 移到串行输出,第5拍全部移出(若 D₀持续为1,寄存器随后由1填充)。

74HC165 是常用 8 位 PISO:SH/LD 低时异步并行装载,SER 支持串行输入,CLK INH 高可禁止时钟,Q₇及反相输出可用于串行读出。


2.4 并入并出(PIPO)
PIPO 在同一个时钟边沿同时装入所有 bit,随后各 Q 端立即(经过触发器传播延迟)得到对应数据,适合寄存器间总线传输。

74HC195 支持并行访问,也可通过 J/K 串行输入实现其他三种工作方式。SH/LD 低时正沿同步并行装载;高时右移;CLR 为低有效异步清零。


三、双向与通用移位寄存器
双向寄存器用控制信号选择左右两套门电路:RIGHT/LEFT=1 时右移,=0 时左移。边界级需要接入串行数据,避免移位时悬空。

Worked Example 8-4(保留原题与解题法):初态 Q₀Q₁Q₂Q₃=1101,串行输入为低。逐个时钟读取 RIGHT/LEFT 波形:高电平时向右移动,低电平时向左移动;每一拍只把旧状态按方向整体移动一位,空出的端补入0。图8-18(b)给出完整状态。

74HC194 是 4 位通用双向移位寄存器,S₁S₀ 决定模式:00 保持,01 右移,10 左移,11 并行装载;所有动作通常在时钟正沿同步完成。


四、把移位寄存器变成计数器
普通寄存器没有固定状态序列;把末级输出反馈到输入,就会形成具有确定循环序列的“移位寄存器计数器”。
4.1 Johnson 计数器
Johnson 计数器把最后一级的反相输出 (\overline Q) 反馈到第一级 D。n 级产生 2n 个状态,先逐步填入 1,再逐步填入 0。4 级序列为 0000→1000→1100→1110→1111→0111→0011→0001→0000;5 级同理,共10态。




4.2 环形计数器
环形计数器把末级 Q(不取反) 反馈到首级,通常预置“只有一个1”的模式。n 级只有 n 个有效状态,1 像指针一样绕环移动;优点是每个输出直接代表一个状态,无需复杂译码。

Worked Example 8-5(保留原题与结论):10 位环形计数器初态 1010000000,有两个 1;每拍整体循环移动,因此每个 Q 输出是两个相隔固定拍数的脉冲叠加。图8-25(原书配图)展示各输出波形。初态 0101001111 时同样按“旋转而非重新计算”即可得到序列。

五、工程应用
5.1 用于可调时间延迟
SISO 的延迟量为 [ t_d=nT_{CLK}=\frac{n}{f_{CLK}}. ] 例如 8 级、1 MHz 时钟的延迟为 8 μs。级联寄存器可增加延迟,从较低级输出可减少延迟。

Worked Example 8-6(保留原题与结论):图8-27中时钟周期为 2 μs,输入到 Q₀~Q₇ 的延迟依次为 2、4、…、16 μs;改变时钟频率即可同比改变全部延迟。


5.2 74HC195 构成环形计数器
把 Q₃ 回接到串行输入,先用 SH/LD 并行预置 1000,随后每拍 1 循环移动,得到 4 态环形计数器。


5.3 串行-并行转换与 UART
串行传输省导线,并行处理便于 CPU 运算;SIPO 先逐位采样,再一次性读出。典型异步帧为:1 个起始位 0、8 个数据位(可含奇偶校验)、1~2 个停止位 1,空闲时线路保持高电平。



UART(Universal Asynchronous Receiver Transmitter,通用异步收发器)同时包含串并和并串两条通路:接收时把串行帧还原为数据总线上的并行字节;发送时把并行字节加上起始/停止位后串行发出。


5.4 键盘编码器
8×8 键盘矩阵由环形计数器逐行扫描:5 kHz 时钟经 8 态环形计数器后,每行约 625 次/秒被拉低检测。某行某列闭合后,行、列优先编码器分别输出 3 bit,合成唯一 6 bit 键码,再由寄存器锁存并送 ROM 转成字符码。

六、逻辑符号中的依赖标注
74HC164 的 R 表示异步复位;箭头表示 Q₀→Q₇ 的数据流;1D 与 1C 表示数据端受时钟端控制。74HC194 的模式编码为:0 保持、1 右移、2 左移、3 并行装载;1,4D、2,4D、3,4D 分别说明哪些输入在相应模式下受时钟控制。


七、时序逻辑故障排查
“Exercise(施加测试激励)”的目标是让每个触发器都经历 SET/RESET,让计数器走完全部状态,再观察输出是否符合预期。串并转换器可交替输入 10101010 与 01010101,这样能暴露某一级卡死、时钟缺失、装载线异常等故障。
排查顺序:先比较输入寄存器输出;若输入寄存器正确而输出寄存器错误,检查输出寄存器的装载端、时钟、电源地和连线;若输入寄存器也错,则继续向前检查时钟发生器、计数器、单稳态和门电路。示波器测数字信号优先使用 DC 耦合,便于发现错误的 0 V 基准和浮地。



八、应用综合:四位密码锁
密码锁把键盘输入的 BCD 码与 DIP 开关保存的预设码逐位比较。寄存器 A 保存键盘数字,寄存器 B 保存当前预设数字;比较相等时,寄存器 C 中的“1”右移一位。连续四次匹配后,1 移到输出端,驱动开锁;任意一次不匹配都让 C 重新装入 00010000。





改成五位密码
将“成功匹配后右移”的寄存器 C 增加一级,并把预置的单个 1 放在对应起始位置;代码选择逻辑增加一组四位 AND 门,即可把比较次数从4次扩展到5次。
九、全章速记与自测
核心公式与结论
- n 级寄存器容量为 n bit;串行装入 n bit 至少需要 n 个时钟。
- 延迟:
t=n/fCLK。 - Johnson 计数器 n 级有 2n 个状态;环形计数器 n 级通常有 n 个状态。
- SHIFT/LOAD 决定“装载还是移位”;CLR 常为异步低有效,务必看符号上的小圆圈或横线。
- 右移相当于二进制数除以2(忽略移出的 LSB),左移相当于乘以2(忽略溢出)。
自测问题
- 4 位 SISO 初始清零,依次输入
1,0,1,1,第4个有效时钟后各级状态如何排列? - 8 位 SIPO 需要多少个时钟才能装满一个字节?
- PISO 中 SHIFT/LOAD 为低和为高时,数据通路分别是什么?
- 74HC194 的
S₁S₀=10表示哪种模式?并行装载是否与时钟同步? - 8 位 Johnson 计数器的模是多少?8 位环形计数器的模通常是多少?
- 8 级寄存器使用 250 kHz 时钟,输入到末级输出延迟是多少?
- 键盘编码器为什么要用环形计数器扫描,而不是同时激活所有行?
- 串并转换器输出错误时,为什么应先检查输入寄存器的输出?
自测参考答案
- 按“新 bit 进入 Q₀、旧值逐级右移”逐拍写表;最终位序取决于图中 Q₀/Q₃ 定义。2. 8 个。3. 低:并行装载;高:串行移位。4. 左移;并行装载为同步操作。5. 16;8。6.
8/250 kHz=32 μs。7. 逐行激活可唯一定位列,避免多键同时造成歧义。8. 可将故障分界在输入寄存器之后,缩小排查范围。
原书图表与练习索引
本页已保留第8章所有原书 worked examples、练习图、测试图和代码对应图片;需要逐题练习时,可对照 df_slices/ch08.md 中的 Section Checkup、True/False Quiz、Self-Test、Problems 与 Answers。图8-47~图8-63等习题图如下。

资料说明
原书部分图号在 MinerU 解析中出现错位(例如图8-33与图8-32复用图片路径),本页以源文件实际路径为准,未删除任何图片资源。阅读芯片时钟有效边沿、异步/同步控制和位序时,必须优先依据电路图与器件数据手册。
十、原书其余配图(路径完整保留)

自测一下
移位寄存器的基本功能是什么?
参考答案:移位寄存器由多个触发器级联而成,能在时钟有效边沿保存数据并逐位移动。n 级寄存器的容量就是 n bit(4 级存 4 bit,8 级存 1 byte),每来一个时钟,移入端补进新 bit,移出端丢出旧 bit。此外还能用异步 CLR 端或连续移入 0 来清零。
串入并出与并入串出结构分别适合什么场景?
参考答案:SIPO 用一根串行线逐位装入、装满后从各级 Q 端同时并行读出,适合“少线传输、多线处理”,例如 UART 接收端把串行帧还原成并行字节。PISO 则相反,先用多根并行线一次装入(SHIFT/LOAD=0),再逐拍移出(SHIFT/LOAD=1),适合发送端把并行数据串行发出以节省导线。典型芯片分别是 74HC164 和 74HC165。
环形计数器与约翰逊计数器有什么区别?
参考答案:关键区别在反馈方式:环形计数器把末级 Q(不取反)反馈到首级,通常预置“只有一个 1”的模式,n 级只有 n 个有效状态,1 像指针一样绕环移动,无需复杂译码。Johnson 计数器把末级的反相输出反馈到首级,n 级能产生 2n 个状态,先逐步填 1 再逐步填 0,例如 4 级序列为 0000→1000→1100→1110→1111→0111→0011→0001。
移位寄存器如何实现串并转换?
参考答案:接收方向用 SIPO:串行数据逐位进入 Q₀,每来一个时钟右移一位,装满 n 位后各级 Q 端即可同时读出并行字节。发送方向用 PISO:并行数据一次装入,再逐拍移出到一根串行线上。典型异步帧格式为 1 个起始位 0、8 个数据位、1~2 个停止位 1,UART 芯片内部就同时包含这两条通路。
级联移位寄存器时需要关注哪些时序参数?
参考答案:首先要关注时钟频率与延迟的关系,延迟量为 t=n/f_CLK,例如 8 级、1 MHz 时钟的延迟为 8 μs,级联更多级可增大延迟、从较低级输出可减小延迟。其次要保证每级触发器的建立/保持时间得到满足,且总传播延迟不能影响下一拍采样。此外还要注意各芯片时钟有效边沿是否一致、异步清零等控制信号的时序应以数据手册为准。