阶段三:SPI Slave、CDC 与配置(11–15)

本阶段是独立设计题,不改变第 01 课 Master。先确定 Slave 时钟架构,再设计数据转移。两级同步器只是特定条件下的风险降低结构,不是通用的“跨域安全”标签。

11:Slave 有两种常见架构

目标和讲解

方案 A:用外部 SCLK 为移位寄存器提供时钟。Mode 0 接收通常使用上升沿,发送可能使用下降沿;双边沿相关逻辑要分别建模半周期路径。与内部 clk 的交互需要 CDC。SPI 时钟会停,所以依赖 SCLK 的握手与复位释放必须考虑停钟。

方案 B:在内部 clk 域同步并检测 SCLK/CS/MOSI,通过检测到的事件移位。所有功能寄存器由 clk 驱动,但外部输入仍异步。系统时钟必须足够快,保证窄脉冲不漏检,并给同步延迟、检测延迟及数据对齐留出余量。

项目 SCLK 时钟域 clk 过采样
时钟资源 要支持外部/停顿时钟 功能寄存器统一 clk
外部最大频率 由引脚及边沿时序决定 受采样频率和同步延迟约束
数据交互 多位 CDC 协议 同域更新较直接
关键风险 停钟、复位、多域读写 漏边沿、不同输入的同步延迟差

不存在不依赖协议的“clk 是 SPI 的四倍就足够”规则。以 50 MHz/1 MHz 为例,半周期 500 ns 有 25 个 clk 周期,便于留出几周期的同步与检测延迟。最终仍需用源端稳定窗口验证 SCLK、CS、MOSI 的相对关系。

独立同步多根信号可能分别多延迟一个周期。SPI 的 MOSI 若在下降沿更新,到下一上升沿之前有较长稳定窗口,就可以设计过采样采样窗口;若源端在采样沿附近也变化,分别同步不会自动保持关系。

练习与验收

画出两种架构并标注所有时钟域。假设 1 MHz SCLK,把外部边沿相对 clk 的相位从 0 扫到 20 ns,预测最早/最晚检测时刻。验收要求能够指出过采样方案仍有异步输入问题。

12:单比特同步器与脉冲

目标和讲解

异步输入进入采样窗口可能使触发器进入亚稳态。后级触发器提供更多解析时间,使不稳定传播的概率降低。概念关系为 MTBF ∝ exp(T_resolve/τ)/(f_clk×f_event),比例常数、τ 和目标可靠性依赖具体单元、PVT 与实现数据,不能用该比例直接得出可靠性数值。

两级同步器适合维持足够长时间的单比特电平。第一级 Q 不用于其他功能逻辑,不加组合逻辑到两级之间,并在实现中限制两级的路径与布局以保留解析时间。具体属性和 CDC/STA 处理根据工具与工艺规则确认。

窄脉冲可能完全落在目的时钟两个边沿之间,两个同步器也捕获不到。可拉宽、使用 toggle,或用 request/ack 协议。toggle 的两次变化若快到在目的域看到前抵消,也会丢事件;必须限制事件速率或等待确认。

教学问题:源域脉冲 10 ns,目的时钟周期 20 ns。某些相位会采到,某些相位会漏;不能用一个仿真相位的通过结果证明可靠。

练习与验收

分别为“长期 enable”“偶发 update pulse”“每周期的数据流”选择电平同步、握手/toggle、FIFO。给出各自的速率或保持条件。验收要求解释两级同步器降低亚稳态传播风险,但不保证每个事件被接收。

13:多位 mailbox 与一致性

目标和讲解

对每一位分别同步会丢失字的原子性。例如 0111→1000,目的域可能看到两次写入混合的 0000 或 1111。Gray 编码用于每次合法变化只改一位的状态,如 FIFO 指针;不能把任意配置数据直接当成 Gray 指针处理。

一种单未决事务 mailbox:

  1. 源域在空闲时锁存 payload,并翻转 req。
  2. payload 保持不变,直到目的域确认。
  3. 目的域同步 req,识别新事务;在约定等待窗口后一次性捕获 payload。
  4. 目的域捕获成功后把 ack 更新为本次 req 值。
  5. 源域同步 ack,req==ack 时释放 busy。

payload 不逐位用同步器重组,而是依靠保持协议及控制延迟,在目的域得到稳定数据。这是 bundled-data 设计,必须保证数据在捕获前已稳定、捕获后仍保持;控制的同步延迟不是自动成立的全工艺物理约束。

推荐教学实现:检测同步 req 后再等一个目的周期捕获 payload,为数据留额外稳定时间;仍需明确数据路径最大延迟、保持和复位条件。不能把 payload 路径一律 false path 后完全不检查其物理可达性。

ack 的含义必须固定为“目的域已捕获到本地缓冲”;它不等于“模拟输出已经生效”。应用完成应另有状态。

练习与验收

画出 payload、req、同步 req、捕获、ack 和源域 busy。目的时钟变慢或暂停时,源端必须保持 payload,后续请求按规格拒绝或等待。验收要求能证明没有覆盖尚未接收的数据,以及为何两次快速 toggle 不被允许。

14:影子配置与原子提交

目标和讲解

12 位 DAC 码字经两个字节写入,如果每次字节写都直接改有效码,模拟电路会经历中间值。影子寄存器保存软件正在构造的配置;active 寄存器保存当前已生效配置;commit 将完整影子快照作为一个更新对象。

若更新需要避开 ADC 采样孔径或敏感模拟时段,目的域先保存 pending 快照,在 safe_update 的 clk 边沿才同时更新 active_code 与 active_enable。等待期间再次写 shadow 不应改变已接受的 pending 快照。

shadow 写入 → commit 锁存快照 → pending
                                  ↓ safe_update
                              active 同沿更新

busy 时 commit 可以拒绝并置 sticky overflow,也可以由队列保存。本课程先选拒绝并可读状态,避免不明确的覆盖。没有 safe_update 时保持 pending,不使用任意固定延迟冒充安全窗口。

多个数字 Q 在同一时钟更新只保证逻辑字一致性;各输出的 t_cq 和布线不同,模拟译码网络仍可能出现瞬态。需要从电路要求决定是否加入模拟侧锁存、blanking、break-before-make 或编码策略。数字原子更新不能直接保证模拟无毛刺。

练习与验收

让 shadow_code 从 0x123 改到 0xABC,中途 commit,再继续写 shadow。记录 pending 与 active 的值。验收要求能说明原子范围是哪个字段集合,以及模拟侧如何定义允许的瞬态和稳定时间。

15:复位、读回和验证跨域协议

目标和讲解

req/ack 的初始 epoch 必须一致。只复位一侧可能制造假事务、丢事务或令源端一直 busy。第一版可明确规定两侧协同复位,复位中止未完成事务;需要独立域复位时增加重初始化握手,不能默认清零就正确。

外部异步复位常用“异步置位/同步释放”结构,但各域必须有时钟才能完成释放同步。SCLK 停止时不要要求域在没有边沿的条件下自行完成同步释放。第 01 课的同步 rst_n 保持原契约,不套用此处的多域方案。

读回也需要一致性。直接将多位 active 状态跨域给 SPI 移位器会读到混合字。可以通过反向 mailbox 或稳定快照缓存。在 SCLK 域方案中,从读命令结束到下个 MISO 首位可能只有半周期;若不足以完成跨域读请求,应规定 dummy 字节、分成 request/read 两个事务,或读已有快照,并标注版本/新鲜度。

RTL 仿真不能真实模拟触发器亚稳态。相位扫描、异频、暂停和协议断言检查逻辑边界;CDC 结构分析、STA 约束和物理实现承担不同的证据责任。

练习与验收

设计测试矩阵:源快目的慢、目的快源慢、任一时钟暂停、握手每个阶段复位、busy 中重复请求、safe_update 缺失、提交后 shadow 变化、读回期间 active 更新。每个用例写期望接收次数、结果版本及恢复方式。验收要求没有“仿真没出现亚稳态,所以 CDC 安全”的结论。

阶段验收

提交架构图、mailbox 协议和配置时序图;定义复位协调;给出最小输入脉宽/数据稳定窗口、事件速率和读回延迟。答案见 11–15 参考。

先写预测,再留下自己的解释

本讲包含 5 课。展开对应课程,保存个人状态和笔记。

11:Slave 有两种常见架构记录
阅读本课 →

输入后自动保存在此浏览器。能独立解释并完成课程验收,再标记“已验收”。

12:单比特同步器与脉冲记录
阅读本课 →

输入后自动保存在此浏览器。能独立解释并完成课程验收,再标记“已验收”。

13:多位 mailbox 与一致性记录
阅读本课 →

输入后自动保存在此浏览器。能独立解释并完成课程验收,再标记“已验收”。

14:影子配置与原子提交记录
阅读本课 →

输入后自动保存在此浏览器。能独立解释并完成课程验收,再标记“已验收”。

15:复位、读回和验证跨域协议记录
阅读本课 →

输入后自动保存在此浏览器。能独立解释并完成课程验收,再标记“已验收”。