常用时序逻辑部件:寄存器/计数器/移位寄存器
更新时间:2026-09-10。本文是「芯片设计 · 入门层」数字逻辑基础第七篇。前置 锁存器与触发器 与 时钟与复位。
本文要回答的问题
- 寄存器和触发器是什么关系?n 位寄存器怎么打一拍?
- 计数器怎么用"加一 + 打回"构成?同步计数器和异步(行波)计数器在时钟接法和抖动上差在哪?
- 可预置、加减可控、模 N(任意进制)计数器怎么设计?
- 移位寄存器怎么实现串并转换、固定 N 拍延时(打拍同步)?
- 环形/扭环计数器、LFSR 伪随机序列用在哪(DFT、CRC、CDC 快照样例)?
- 用计数器分频和用 PLL/时钟分频有什么本质区别,为什么不推荐用逻辑给时钟分频?
一、n 位寄存器:把触发器成组使用
一个 D 触发器存 1 比特。把 n 个 D 触发器的时钟端、复位端并在一起,各自的数据端拼成一个 n 位总线,就是一个 n 位寄存器(register)——每个时钟沿,整组比特同时更新。加一个使能端 en(为 0 时把自身旧值喂回 D 端保持)、一个复位,就是工程里最常用的形态:
// 带使能与同步复位的 n 位寄存器
always @(posedge clk) begin
if (rst) q <= {W{1'b0}};
else if (en) q <= d; // en=1 载入新值,en=0 时 q 保持(隐含自反馈)
end寄存器在数据通路里最主要的用途是打拍(pipeline register):在两级组合逻辑之间插一级寄存器,把一条长关键路径切成两段短路径,从而提高时钟频率(代价是多一个周期延迟)。CPU 流水线、AXI 通路里随处可见的"打两拍/skid buffer"就是它(见 微架构入门、valid/ready 握手)。
二、同步计数器:加一后打回
让寄存器的输入等于"自己当前值加一"(经一个加法器),每来一个时钟沿就把新值打回,就是计数器:
// 模 N 同步加法计数器(数到 N-1 回绕)
always @(posedge clk) begin
if (rst)
cnt <= 0;
else if (en)
cnt <= (cnt == N-1) ? 0 : cnt + 1;
end
assign tick = (cnt == N-1); // 每 N 拍产生一个周期的高电平脉冲同步计数器的所有触发器共用同一个 clk,低位进位经组合逻辑控制高位是否翻转,没有累积时钟偏斜,是同步设计的标准做法。RTL 里直接写 cnt <= cnt + 1,综合器会选用合适的增量加法器结构。计数器是分频计时、周期脉冲、FIFO 读写指针、状态计时、波特率发生器的基础(见 三个最常见基础模块、FIFO 深度计算)。
三、异步(行波)计数器:简单但有时钟偏斜
教科书里的另一种接法是异步/行波计数器(ripple counter):最低位触发器用外部时钟,每一级的 Q 输出直接当下一级的时钟。结构极省(T 触发器级联即可),但高位时钟要等前级翻转后才产生——时钟像波纹一样逐级传播,各位并非同时翻转,输出会出现短暂的错误中间码,且累积延迟/偏斜随位数增长。这违背"全芯片同一时钟沿"的同步设计原则,STA 也难以处理这种内部生成时钟,标准同步 RTL 中应避免,需要时由时钟处理单元统一管理。
行波计数器的级联结构画出来是这样——注意每一级的时钟端接的不是同一个 clk:
两种计数器的取舍对照:
| 维度 | 同步计数器 | 异步(行波)计数器 |
|---|---|---|
| 时钟接法 | 所有位共用同一 clk | 前级 Q 当后级时钟 |
| 翻转时刻 | 所有位同沿同时翻转 | 波纹式先后翻转 |
| 过渡中间码 | 无 | 有短暂错误中间码 |
| 累积偏斜 | 无 | 随位数增长 |
| STA 处理 | 标准时序路径 | 内部生成时钟,难处理 |
| 工程地位 | 同步设计默认做法 | 标准 RTL 应避免 |
这张表的本质就一行:行波计数器省的是触发器数据通路的逻辑,赔上的是"全局统一时钟沿"这条同步设计的命根子——省下的东西远不抵赔掉的,所以只在教科书和极低频专用场景出现。
四、模 N、可预置、可逆计数器
- 模 N(任意进制):如上面的三元写法,数到 N−1 即清 0(如模 10 = 十进制计数器,常用于 BCD/时钟)。也可用"同步清零端 + 检测 N"实现。
- 可预置(load):再加一个
load选择,有效时载入初值而非加一,用于从任意值开始计数/装载事件。 - 可逆(up/down):用
up_down选择cnt+1或cnt−1,减法计数常用于倒计数/超时检测。 - 多 bit 计数要注意回绕宽度与目标值比较的位宽匹配,避免少一位导致永远到不了 N。
三种变体不是三个新电路,而是在同一个"加一打回"骨架上加选择逻辑:
| 变体 | 增加的逻辑 | 典型用途 |
|---|---|---|
| 模 N 计数 | 终点比较 cnt==N-1 回绕清零 | BCD 十进制、秒分定时 |
| 可预置 load | D 端前加 MUX:load 时选初值 | 任意起点计数、事件装载 |
| 可逆 up/down | 加减法器二选一 | 倒计数、超时检测 |
| 2 的幂模 | 无(位宽溢出免费回卷) | 周期脉冲发生器首选 |
工程选型时的口诀是"能取 2 的幂就不比较":模 N 的比较器可能进关键路径,而 N=2ᵏ 时回卷由位宽溢出天然完成,一个门都不多花。
五、移位寄存器:每拍挪一位
把一排 D 触发器首尾相连——前一级的 Q 接后一级的 D——就成了移位寄存器:每个时钟沿,数据整体向相邻位移动一格。
这条链上每个触发器的时钟端其实都并接同一个 clk(图上省略),数据通路只有"邻居的 Q 接我的 D"一种连接——正是这种极简拓扑,让移位寄存器能一鱼多吃。
// 最简移位寄存器:左移,串口数据从 sin 移入
always @(posedge clk)
if (rst) sr <= 4'b0;
else sr <= {sr[2:0], sin}; // 整体左移,最低位补入 sin典型用途:
- 串入并出(SIPO):串行 bit 流逐位移入,若干拍后一次性并行读出——UART/SPI 接收端的核心(中断与 DMA 里的串口)。
- 并入串出(PISO):反向,并行载入后逐位送出——发送端。
- 固定 N 拍延时/打拍同步:信号串过 N 级触发器就延迟 N 个周期。跨时钟域单 bit 同步用的两级 D 触发器同步器,本质就是一个 2 级移位寄存器(见 CDC 基础)。注意它只能同步"单 bit/电平",多 bit 总线要靠握手、格雷码或异步 FIFO。
- 环形/扭环计数器:把移位输出回接到输入即环形计数器(输出 one-hot 依次点亮,可直接做状态/节拍);把反相输出回接即扭环(Johnson)计数器,用 n 个触发器产生 2n 个状态,译码简单、常用于简单控制与 DFT。
几种基本接法的差异只在"数据从哪进、从哪出、末端接回哪":
| 接法 | 数据流向 | n 级得到 | 典型应用 |
|---|---|---|---|
| SIPO | 串入并出 | 串行转 n 位并行 | UART/SPI 接收 |
| PISO | 并入串出 | 并行转串行流 | UART/SPI 发送 |
| N 级延时 | 单 bit 串过 N 级 | 固定 N 拍延迟 | 打拍、两级同步器 |
| 环形计数 | 末端 Q 回接头部 | n 个 one-hot 状态 | 节拍、简单状态 |
| 扭环 Johnson | 反相末端回接头部 | 2n 个状态 | 简单控制、DFT |
注意环形和扭环的状态数差别:同样 n 个触发器,环形只走出 n 个有效状态(一个 1 在圈里转),扭环把"先填满 1 再填满 0"的过程都算进去,状态数翻倍——译码还比二进制计数简单得多。
六、LFSR:伪随机、CRC 与测试
**线性反馈移位寄存器(LFSR)**在移位基础上,把若干位(抽头)异或后反馈到输入端。它会在 2ⁿ−1(或 2ⁿ)个状态间确定性地周期游走,序列看起来随机、电路却极简单(只用触发器+异或,不含进位加法器),因此:
和普通移位寄存器相比只多了一个异或网络:抽头位置由多项式决定,反馈让状态不再线性平移、而是在非零状态空间里伪随机游走——没有进位链,关键路径只有一个异或门深度,这是它比二进制计数器还快的原因。
- 产生伪随机序列 / 伪随机模式:测试激励、加扰、快照样例;
- CRC 校验的本质就是按多项式做 LFSR 式移位异或(见 数制与编码 的检错码);
- DFT/可测性:内建自测试 BIST 用 LFSR 生成测试向量、用多输入特征寄存器 MISR 压缩响应;扫描链本身也是一条可串行载入/移出的长移位寄存器(见 DFT 入门、可测性设计 DFT);
- 也可当轻量计数器/地址发生器(如异步 FIFO 里用格雷码而非普通二进制指针是为 CDC 安全,见 异步 FIFO 与 Gray 码)。
七、分频的正确姿势:用"使能",别用逻辑造时钟
常见需求:50MHz 时钟下做一个 1MHz 的"慢动作"逻辑。错误做法是用计数器某一位/Q 翻转输出去当别的触发器的时钟(门控时钟/逻辑分频)——这会制造内部生成时钟,带来时钟偏斜、毛刺、STA 复杂和 CDC 问题。
正确做法:时钟始终接原始 50MHz,用计数器产生一个周期使能脉冲 tick(每 50 拍拉高 1 拍),所有"慢动作"逻辑仍由原时钟驱动、只在 tick 有效时动作:
// 时钟仍是 clk,tick 是使能而非时钟——保持单一时钟域
always @(posedge clk)
if (en && tick) q <= d;真正需要不同频率/相位的时钟时,用 PLL/MMCM/时钟分频器等专用时钟资源生成,并走规范的时钟树与约束(见 时钟与复位、时钟树与复位网络、FPGA 侧用 PLL/MMCM 生成)。这是同步设计一条重要纪律:数据可以用逻辑分频(使能),时钟不要用普通逻辑随便造。
三种"慢动作"方案的正误对照:
| 方案 | 时钟来源 | 问题/代价 | 结论 |
|---|---|---|---|
| 计数器 Q/译码输出当时钟 | 普通逻辑生成 | 偏斜、毛刺、STA 复杂、CDC 隐患 | 禁止 |
| 计数器产 tick 当使能 | 仍是原始 clk | 无,单一时钟域 | 推荐默认做法 |
| PLL/MMCM/时钟分频器 | 专用时钟资源 | 需配约束、走时钟树 | 真需要异频异相时用 |
判断标准很朴素:时钟网络的负载是成百上千个触发器的时钟端,对偏斜和毛刺的要求是全网最高;逻辑门的输出达不到这个标准,只有专用时钟资源(PLL + 时钟树)达得到。使能方案绕开了这个问题——慢的不是时钟,是"允许动作的频率"。
八、同步计数器的门级:使能链与高速计数
"加一"这个动作在门级并不简单。n 位二进制加一时,第 i 位翻转的条件是所有更低位此刻都为 1:EN_i = EN · (Q₀·Q₁·…·Qᵢ₋₁)。直接实现会形成一条从低位到高位的使能级联,和行波进位一样随位宽变慢,这就是为什么宽计数器不能想当然地把 T 触发器一级级串起来。两种主流快结构:
- 同步计数 + 并行进位(count-enable lookahead):把"低位全 1"像超前进位那样用与门树平衡预算(
TC = EN & &Q[k:0]),所有触发器仍共同时钟、同时拿到翻转许可,高频宽计数器都这么做(见 加法器超前进位)。 - 终点译码与取 2 的幂:模 N 计数器只在
cnt==N-1时产生终值脉冲tick,这个比较器也可能进关键路径;N 为 2 的幂时回卷免费(直接利用位宽溢出),所以做"每 N 拍一个脉冲"时,尽量把 N 取成 2 的幂或拆成几级小计数器。
工程上更推荐小计数器 + 使能级联而非单个大计数器:用一个 8 位计数器产生慢 tick、下游计数器只在 tick 有效时加一,既避免宽位翻转的高活动率功耗(低位每拍都翻、高位很少翻),也让每一级时序宽松。读 STA 报告时,cnt==MAX 比较器和计数终值(TC/CEO)是高频路径。
格雷计数器是计数器知识在 CDC 上最关键的应用:内部可仍按二进制计数,输出端用 G = B ^ (B>>1) 组合转换(或直接按格雷规律翻转)后再跨时钟域,异步 FIFO 指针就是它(见 异步 FIFO 与 Gray 码指针)。它把"多位同时翻转、采样到中间码"的风险从根上消除。
九、移位寄存器的工程变体
最基础的移位之外,真实设计反复用到几个变体:
- 通用移位寄存器:加模式控制,支持保持/左移/右移/并行载入,串并转换和可配置延时线都用它。
- 数据与 valid 同步打拍:数据总线打 N 拍时,伴随的 valid 也要打同样多拍,否则错位——valid 是 1 bit 移位寄存器、数据是 W bit 移位寄存器,级数必须一致(见 valid/ready 握手 的 skid buffer)。
- 同步器是特殊移位寄存器:单 bit 信号过两级触发器即同步器(CDC 基础),但只适合电平/单 bit 事件,多 bit 必须握手/格雷/FIFO。
- 桶形移位是组合逻辑:固定拍数移位是连线(0 个门),可变移位量才是 MUX 阵列,别和时序移位寄存器混为一谈(见 加法器篇)。
这几个变体的差别与坑位对照:
| 变体 | 关键机制 | 最容易踩的坑 |
|---|---|---|
| 通用移位寄存器 | 模式控制:保持/左移/右移/并载 | 模式编码与数据通路位宽不匹配 |
| 数据 + valid 同步打拍 | 两组移位级数一致 | 只打数据不打 valid,流水错位 |
| 两级同步器 | 单 bit 过两级 FF | 误用于多 bit 总线 |
| 桶形移位器 | 组合 MUX 阵列,0 拍完成 | 误当时序部件估算面积/时序 |
LFSR 再补三个工程细节:① 抽头多项式要选本原(maximal-length),n 位才能遍历全部 2ⁿ−1 个非零状态;启动值不能是全 0(全 0 是死态,会一直输出 0),常加"检测到全 0 就注入 1"的自启动逻辑。② LFSR 不是真随机,序列完全确定、可预测,只适合测试激励、加扰、CRC、低概率地址;密码学随机数要用专门 TRNG。③ 两种接法中,伽罗瓦式(移位中按位条件异或)比斐波那契式(末端多抽头异或)关键路径短、速度快,CRC 硬件多用伽罗瓦式。
十、脉冲、边沿检测与"慢动作"套路
计数器加少量组合逻辑能搭出控制里最常用的一组套路:
- 周期脉冲 tick:
tick = (cnt == N-1),每 N 拍一个单周期高电平,驱动使能而不是驱动时钟。 - 边沿检测:把信号打一拍,
rise = sig & ~sig_d1、fall = ~sig & sig_d1;异步输入要先两级同步再检测,否则可能把亚稳态/毛刺当边沿(见 建立保持与亚稳态)。 - 超时看门狗:收到启动时装载计数初值并倒数,到 0 产生 timeout;中途再收到启动就重装,状态机的超时退出几乎都是这个结构。
- PWM:
pwm = (cnt < duty),用比较器把锯齿状计数切成占空比可调的方波,电机调速、LED 调光、电源 DC-DC 都用它。
四个套路的核心逻辑对照:
| 套路 | 核心逻辑 | 典型用途 |
|---|---|---|
| 周期脉冲 tick | cnt == N-1 译码 | 慢动作使能、定时节拍 |
| 边沿检测 | sig 与打一拍值组合 | 异步事件捕获(先两级同步) |
| 超时看门狗 | 装载初值倒数到 0 | 状态机超时退出 |
| PWM | cnt < duty 比较 | 调光、调速、DC-DC |
共同纪律仍然是:所有触发器挂同一个时钟,快慢用使能表达,绝不从逻辑里"切"出新时钟;确实需要别的频率/相位,交给 PLL/时钟分频器并在 SDC 里约束(见 时钟树与复位网络、SDC 约束实战)。
十一、FIFO 指针专题:为什么用格雷码、空满怎么判
计数器工程含量最高的应用是异步 FIFO 的读写指针,值得把逻辑彻底讲清。FIFO 是一块双口 RAM 加两个指针:写指针 wptr 指向下一个写位置、读指针 rptr 指向下一个读位置;空满本质是"两个指针相差多少",但 wptr 在写时钟域维护、rptr 在读时钟域维护,比较之前必须跨域。直接传二进制多 bit 指针会撞上 CDC 的经典问题:各位翻转变慢不一,接收方可能采到 0111 与 1000 之间的任意中间码,空满判断瞬间错乱。
解法分三步,每一步都对应本篇的知识点:①指针多设计一位做"绕圈标志":n+1 位指针,低 n 位是 RAM 地址、最高位记录绕了几圈,这样"相等"天然表示空、"最高位不同且其余位相同"表示满;②跨域前把二进制转成格雷码(g = b ^ (b>>1)),连续地址的格雷码每次只翻 1 位,接收方最坏采到旧值或新值、绝不会是第三值——这是单 bit 同步可以容忍的;③各自只在本地域做比较:判满在写时钟域(把同步过来的读格雷指针与本地写指针比),判空在读时钟域。注意判满判空允许保守(判成满只是停一下写、判成空只是停一下读),不允许冒进,所以两级同步带来的延迟天然安全。指针同步器、格雷码转换逻辑、空满比较就是异步 FIFO 的全部难点(完整设计见 异步 FIFO 与 Gray 码、FIFO 深度计算)。同步 FIFO 没有跨域问题,可以直接比二进制指针,但多一位绕圈标志的技巧照用。
十二、CRC 与扫描链:移位寄存器思想的两座高峰
**CRC(循环冗余校验)**看起来是网络/存储的话题,硬件实现却就是一个带异或抽头的移位寄存器。把数据比特流逐位移入,移位寄存器在指定位置(由生成多项式决定,如 CRC-32 的 0x04C11DB7)异或反馈,n 位数据送完后寄存器里剩下的 n 位就是 CRC 余数。软件按字节查表要一堆除法式运算,硬件上每个时钟只做移位+若干异或,关键路径一个异或门深度,所以网卡、SSD 控制器、链路层都在发送/接收通路上无成本地塞进 CRC 引擎。实现时注意三件事:多项式初值(常预置全 1 而不是全 0,否则前导零不参与校验)、结果异或值(result xorout)、比特序(refin/refout,MSB-first 还是 LSB-first)——软件和硬件 CRC 对不上的 bug 九成是这三项配置不一致,而不是多项式错。
**扫描链(scan chain)**是 DFT 的地基:把芯片里所有触发器换成带扫描多路器的扫描触发器(scan FF),测试模式下把它们串成一条或多条超长移位寄存器。测试时先串行移入一组已知图案(shift-in),发一个功能时钟让组合逻辑跑一拍,再把所有触发器的新状态串行移出(shift-out)与期望比对——于是"观察和控制深藏在芯片内部的节点"被转化成了纯粹的移位进出操作,ATE 测试机不需要为每个内部节点准备探针。理解了移位寄存器,扫描链没有任何新元件,难点变成工程组织:链怎么平衡长度、测试时的功耗(全芯片同时翻转)、故障覆盖率、片上压缩(EDT/压缩器本身也是 LFSR/异或网络,见 DFT 入门)。BIST 里的 LFSR 生成向量、MISR 压缩响应,与扫描链一起构成"移位寄存器家族统治可测性设计"的局面。
十三、自检练习与波形直觉
把下面几个波形题在脑子里(或纸上)过一遍,胜过读十遍定义:①画出 4 位同步加计数器在连续 20 个时钟下的 Q[3:0] 和 tick=(cnt==15),再画出若误把它接成行波计数器时 Q 位的先后翻转顺序,数一下 0111→1000 过渡中会出现哪些错误中间码;②给定异步串行比特流(含一个完整字节 0xA5,低位先传),画出 SIPO 移位寄存器 8 拍后的并行值;③写一个"每 1000 拍产生一个单周期脉冲"的模块并指出比较器在哪个周期输出高;④画出两级同步器对一个恰好在时钟沿前变化的异步输入的响应,标出第一级可能的亚稳区间和第二级的合法输出;⑤用 LFSR(多项式 x³+x+1)从初值 001 手推完整周期,验证它走过 7 个非零状态后回初值,并说明为什么 000 永远回不来。
波形直觉的养成有个诀窍:先画寄存器输出(它们只在沿上变),再画组合逻辑(在两沿之间按函数关系跟随,允许毛刺),最后检查每个沿上的建立保持关系。所有时序电路的波形分析都是这个顺序——状态机、流水线、总线、FIFO 无一例外。
十四、工程实战细节:位宽、回卷与上电行为
计数器和移位寄存器代码量小,却集中了数据通路里最常见的小 bug,这里把散见的经验收成一份清单。
位宽与终点比较:cnt <= cnt + 1 中若 cnt 是 8 位、1 按 32 位整型推断,大多数综合器按 LHS 截回,但仿真里比较 cnt == 1000 而 1000 超过 8 位范围时行为可能不直观——养成常量也带位宽(cnt == 9'd1000 时先把 cnt 声明够宽)的习惯。模 N 用 (cnt==N-1) 回卷时,N−1 必须在 cnt 可表示范围内;带使能时终点判断也要包含使能(en && cnt==N-1 才产生 tick 并回卷),否则暂停期间 tick 会持续拉高。
格雷码转换的位序:g[N-1]=b[N-1]、g[i]=b[i+1]^b[i],用位运算写即 g = b ^ (b>>1);反向转换(格雷→二进制)要逐位异或累加,不能简单求逆移位。指针跨域时记住"二进制计数、格雷传输、本地比较",比较要么全在格雷域(空满推导有专门公式),要么转回二进制再比,两种风格不要混用。
移位寄存器的方向和补入位:左移 {sr[W-2:0], sin} 与右移 {sin, sr[W-1:1]} 最容易写反,画一遍位下标再动手;算术右移有符号数补符号位、逻辑右移补 0,Verilog 的 >>> 只有在操作数显式 signed 时才是算术移位,否则仍是逻辑移位——这是和 数制编码篇 位宽陷阱同源的坑。多位移位(sr << n)综合成桶形 MUX 阵列而非移位寄存器,时序和面积完全不同。
上电与不确定态:ASIC 上触发器上电态随机,所有"必须从 0 开始"的计数器、LFSR、环形计数器都要显式复位;仿真给的初值救不了硅。LFSR 还要加全 0 逃逸逻辑,环形计数器最好也能从任意态自启动(加死循环检测或用扭环译码)。测试可见性:大计数器在仿真里等到溢出可能极慢,testbench 要能通过层次路径或预留的调试接口预置计数值;DFT 模式下计数器通常被接进扫描链,功能计数逻辑在测试时让位给移位操作(见 DFT 入门)。
十五、全篇小结:三种时序部件的共同骨架
寄存器、计数器、移位寄存器名字不同,物理上却是同一个骨架的三种"反馈接法":它们都是一排共用时钟和复位的 D 触发器,差别只在每个触发器 D 端接什么。寄存器接外部输入(D = d_i,带使能时加保持选择);移位寄存器接邻居的输出(D_i = Q_{i±1},串入补新位);计数器接"自己的值加一"(D = Q+1,经增量逻辑)。看懂这一点就能举一反三:环形计数器是移位寄存器把末端接回头部;扭环计数器是接反相的头部;带并行载入的通用移位/计数寄存器不过是 D 端前多一个 MUX,在"外部输入/邻居/加一结果"之间按模式选择——它就是 MUX 篇 的选择逻辑和本篇的触发器阵列组合。分析任何时序部件都可以先问两个问题:触发器有几个、复位到什么态?每个 D 端的反馈从哪来、经了什么组合逻辑?答完这两个问题,功能、关键路径和可能的 CDC 位置就都清楚了。
"D 端接什么"这张对照表值得截图收藏——整个部件家族一行一个:
| 部件 | 每个 D 端接什么 | 反馈来源 |
|---|---|---|
| 寄存器 | 外部输入 d_i(带使能时加保持 MUX) | 无反馈/自保持 |
| 计数器 | 自己的值加一 Q+1 | 自身经增量逻辑 |
| 移位寄存器 | 邻居的输出 Q_i±1 | 相邻触发器 |
| 环形/扭环计数器 | 末端 Q 或反相末端 | 首尾回接 |
| LFSR | 抽头位异或结果 | 多抽头异或网络 |
看懂这张表,再遇到任何陌生的时序小部件,先把它的 D 端连接关系画出来对号入座,功能就猜出七八成了。
与现有篇目的衔接
- 前置:锁存器与触发器、时钟与复位、加法器
- 下一篇:有限状态机入门
- 用计数器/FIFO:三个最常见基础模块、FIFO 深度计算与设计、异步 FIFO 与 Gray 码
- 同步器/打拍:CDC 基础;移位寄存器的 DFT 用途:可测性设计 DFT
总结
一句话总结:寄存器就是共用时钟/复位、成组打拍的一排 D 触发器,加使能可保持、插在组合逻辑之间就是流水线打拍;计数器由"当前值加一再在下一沿打回"构成,所有位共用同一时钟的同步计数器无累积偏斜、是标准做法,而用前级 Q 当下级时钟的异步行波计数器虽省却逐级偏斜、输出出现错误中间码,同步设计应避免,在此基础上可方便地实现模 N、可预置和加减可逆计数;移位寄存器让相邻触发器首尾相连、每拍移动一位,天然用于串并/并串转换、固定 N 拍延时和跨时钟域两级同步器,输出回接成环形/扭环计数器、按抽头异或反馈则成 LFSR,服务于伪随机、CRC、BIST 与扫描链;最后一条纪律是"慢动作"逻辑要用计数器产生周期使能脉冲、而不要用翻转输出去造内部时钟,需要真正的异频时钟交给 PLL 并走时钟树约束——这些部件是数据通路打拍、FIFO 指针、分频计时、串并转换和 DFT 的直接积木。