移位寄存器的四大用途:串并转换、排队、环形计数
更新时间:2026-09-12。本文是「集成电路大类 · 芯片设计」**入门层(beginner)**数字逻辑基础第三十三篇。计数器与移位寄存器里它只是「每拍挪一位」,这一篇把这条寄存器链真正用起来——串行通信、流水线打拍、节拍波形生成都靠它。带异或反馈的 LFSR 是进阶专题,本篇先建立移位结构的直觉。
本文要回答的问题
- 一串 bit 怎么用移位寄存器在「串行」和「并行」之间互相转换?
- 为什么「把信号连打 N 拍」就是移位寄存器?它怎么做延迟线和小 FIFO?
- 环形/扭环形(Johnson)计数器怎么用移位寄存器直接生成顺序节拍,省掉译码器?
- 移位寄存器和二进制计数器在「只要顺序脉冲」时怎么选?
- LFSR 在这条链上加了什么,为什么能产生看似随机的长序列?
一、最基本结构:一条带使能的寄存器链
N 个 D 触发器首尾相接:q[i] <= q[i-1],串行数据从第一级进、每拍右移一格;加并行装载(load 时把 P 端装入)和移位使能(shift_en),就同时具备并入/串入能力。
// 通用并入串出/串入并出移位寄存器
always_ff @(posedge clk)
if (rst_n==1'b0) q <= '0;
else if (load) q <= pdata; // 并行装载
else if (shift_en) q <= {sin, q[N-1:1]}; // 右移,sin 从高端进
assign pout = q; // 并行输出(串入并出)
assign sout = q[0]; // 串行输出(并入串出)load 与 shift_en 的组合,就是下面四种用途的共同底座。
二、用途一:串并转换,串行协议的收发核心
- 串入并出(SIPO):线上逐拍来的 bit 依次移入 N 级,收满 N 拍后
pout一次性是一个完整字节——UART 接收、SPI 从机收数据都是它; - 并入串出(PISO):先
load一个并行字节,再逐拍移出到一根线上——UART/SPI 发送端; - 省 IO 是直接动机:N 位数据只用 1 根数据线 + 时钟,代价是花 N 拍(面积换引脚/带宽),这也是串行总线与解复用配对的场景。
接收端要解决「在哪一拍采样、何时收满」,靠的是波特率节拍和一个位计数(见本篇分频),协议细节在 FPGA/UART 专题展开。
三、用途二:打拍延迟与流水线排队
把一条线信号串进 N 级移位链,输出就是它 N 拍前的值——打 N 拍。这有三个直接用途:
- 对齐/配平延迟:数据走某条路径需要 N 拍,相关的 valid 或旁路控制也打同样拍数,保证「数据与控制同时到」,这是流水线握手里最常见的配平;
- 延迟线/小队列:移位链本身就是一个「每拍整体挪一格」的队列,适合固定深度、固定吞吐的小 FIFO;可变深度的通用队列才用带读写指针的 FIFO;
- 同步多拍脉冲展宽/边沿检测:打一两拍配合边沿检测使用。
注意打拍只解决「同时钟域内对齐」,不能用它跨时钟域同步多 bit 总线(那要握手/异步 FIFO,见 CDC)。
四、用途三:环形与扭环形计数器,直接生成节拍
把移位链首尾接起来就成了自循环的序列发生器:
- 环形计数器(ring):把最后一级接回第一级,初始装入一个 1,则这个 1 在链里循环,N 级产生 N 个依次轮流有效的 one-hot 节拍信号,无需译码器就能驱动「第一步、第二步……」的顺序操作。缺点是 N 个触发器只用了 N 个状态,状态利用率低。
- 扭环形/约翰逊(Johnson):把最后一级的反接回第一级,N 级能产生 2N 个状态,输出天然是对称的方波/顺序波形,常用于分频、LED 流水灯、低资源顺序控制;但它有多个无效循环,上电若落在非法环里出不来,需要自启动校正(并同步释放复位)。
什么时候用移位型而不是二进制计数器?当你要的是「互不重叠、顺序出现的节拍」时,环形计数器输出直接就是 one-hot、省译码且无毛刺;当你要的是「一个数值」(地址、计数比较)时,二进制计数器省触发器。状态机的 one-hot 编码也是同一思想,见 one-hot 与 round-robin。
五、用途四:加反馈——LFSR 的引子
在移位链上把某几级取出异或再喂回输入端,就成了线性反馈移位寄存器 LFSR:只要反馈抽头(多项式)选得对,它能在不重复地遍历 2ⁿ−1 个状态后回到起点(最长序列/m 序列),输出「看似随机」但确定可复现的比特流。它是伪随机数 PRBS、误码测试、CRC 校验、内建自测 BIST、以及简单扰码的共同核心。与纯移位相比,唯一的差别就是「输入从固定 sin 变成了若干级异或的反馈」。
与现有篇目的衔接
总结
一句话总结:移位寄存器是一条「load 时装并行、shift_en 时整体挪一格」的寄存器链,四大用途都由它长出——SIPO/PISO 在串行协议里做串并/并串转换(用时间换引脚)、把信号串进 N 级即打 N 拍用于流水线配平和固定深度小队列(但不能跨时钟域同步多 bit)、首尾相接成环形计数器让单个 1 循环直接产生无需译码的顺序 one-hot 节拍、末级取反成 Johnson 计数器产生 2N 个对称波形但要处理无效循环,而把若干级异或反馈回输入端就是 LFSR——能遍历 2ⁿ−1 个状态生成最长伪随机序列,是 PRBS/CRC/BIST 的核心;选移位型还是二进制计数器的判据是:你要的是「顺序节拍」还是「一个数值」。