结课项目:ΔΣ 码流的固定多级抽取链
这是待实现的教学项目,系数尚未生成、RTL 尚未编写或运行。目标是建立算法→系数量化→bit-accurate→RTL 的证据链。
1. 冻结参数与构建 manifest
输入 6.144 MHz,信号带宽 20 kHz,输出 48 ksample/s;1-bit 0/1 映射 −1/+1,归一化物理 FS 峰值为 1。候选为 CIC N3/R16/M1、HB31/R2、HB47/R2、补偿 FIR161/R2。
项目另建独立实验目录,不修改第 01 课。系数、倍率、tap 数和位宽在构建时固定,首版不支持运行时重载。每次构建记录:各级 Fs、L、R、相位、设计边界/权重、浮点系数、量化规则/整数系数、W/F、DC/L1、hash、分析工具版本、源版本和目标指标。
如果起始参数无法通过 DF06 指标,先修改 manifest 和模型,再实现。不同 tap/word length 的结果不能混用原 latency/启动阈值。
2. 数值与相位契约
CIC 各积分与 comb 用当前样本的 next 结果逐级传播,全级 signed14 modulo,无 saturation/剪位;输出 raw/4096 视作 signed14/F12。
FIR y[n]=h0·当前样本+其余系数·旧历史,每级保留第二个输入。组合相位为 127;最终数学输出 m 对应原输入 n=128m+127。复位前历史与全部状态按 0 初始化。
各 FIR 使用 DF07 的起始格式,累加保留全精度,最后 ties-to-even、缩放到 signed24/F20;越界 saturation 并标志,不悄悄回绕。半带对称/零/中心与 DC 规则在量化后复查。
物理 FS 不是输出容器范围;幅度 0.5 对应输出码 524288,DC=+1 对应 1048576,DC=−1 对应 −1048576。幅度/系数造成的 overshoot 需用 L1 与数值测试确认,不能根据 passband 增益猜极值。
3. Core 输入接口
| 信号 | 语义 |
|---|---|
| clk_core | 49.152 MHz,全部功能寄存器使用它 |
| rst_n | 同步低有效,覆盖至少一个上升沿 |
| in_valid | 单周期,新样本在 core 上升沿接受 |
| in_bit | 有效时 0→−1、1→+1,满足 core 同步输入时序 |
| cadence_fault | sticky,错误输入节奏,需 reset 恢复 |
复位释放后允许任意时刻接受第一个样本;之后每 8 个 core 周期恰好一个单周期 in_valid。默认 RUN 不允许漏样、重复样或任意暂停。出现错误节奏后锁存 cadence_fault、取消未完成结果,边沿后不再发布 out_valid,直到 reset;不能把丢失的一份样本悄悄当成采样率降低。
这里输入已在 core 域。真实 ADC/异步 FIFO 适配器需要证明样本不丢失、顺序/速率正确及同步时序;不把同步一个 bit 电平等同于传递完整样本事件。49.152 MHz 与输入时钟的物理来源/相位也要在实际设计中说明。
4. 输出接口与流水
| 信号 | 语义 |
|---|---|
| out_data[23:0] | signed24/F20 |
| out_valid | 一周期 push,表示数值已完成,包括 startup 输出 |
| out_seq[31:0] | 从 0 开始的输出序号,自然回绕 |
| out_warm | 等效完整支持窗口已覆盖,随数据/seq 对齐 |
| out_saturated | 当前样本曾在 FIR 级输出被饱和,随结果对齐 |
| saturation_sticky | 当前 epoch 发生过 FIR saturation |
每级FIR的历史同时保存上游saturation标签;本级输出标签为自身饱和与所有非零系数所用历史样本标签的OR。这样前级饱和对后续若干输出的影响不会只标记一份样本。单纯把一个sat位延迟到最后一级不足以表达卷积支持窗口。
最终结果在全部 pipeline drain 后,N 个合法输入应有 floor(N/128) 个输出,不为缺少的样本自动补零。CIC natural wrap 不置 saturation。reset 清状态、所有 valid/任务、seq、warm、sticky;不发布复位前的迟到结果。
输入索引 n=128m+127 是数学标签,core 运算延迟另外记录。无 task stall 的固定实现输出间隔应为 1024 core 周期;每级任务在该级下一个输入前完成,或使用经过验证的缓冲机制。因加流水改变时刻时,data/seq/warm/saturation 必须一起推进。
候选等效长度 K=12238,m=95 时首次可标 out_warm;完整历史首次建立后 warm 保持,直到 reset/fault,不因计数自然回绕清除。启动输出不删除,但性能分析使用明确 steady 窗口。
输出不提供能冻结输入历史的 backpressure。消费端必须持续接收,或由外部 FIFO 处理并报告 overflow/丢弃数;实际调制器能否暂停是另一个系统规格。
5. 各层性能验收
| 层 | 检查 | 通过依据 |
|---|---|---|
| float 原系数 | DC、0–20 kHz ±0.05 dB、目标阻带与 delay | 实际数值频响 |
| alias | 输入 PSD、各级 image 到带内贡献 | 相同归一化的功率预算 |
| float 量化系数 | 结构、DC、量化后频响 | 实际整数系数对应的 H |
| bit-accurate | 极值、RNE、wrap、sat、phase、startup | 独立等效/整数参考 |
| RTL | 每份 data/seq/warm/sat 与整数模型一致 | 逐样本计分板及计数 |
| 综合 | 结构、时钟、映射、timing intent、时序路径 | 新项目真实报告 |
最终 FIR 起始 stopband 目标为其输入 96 kHz 下 24–48 kHz 至少 100 dB;整链 alias 增量/绝对指标依输入模型判断。定点额外带内噪声起始目标≤0.5 dB,不能只比较幅度或删掉 saturation 样本后宣称通过。
真实调制器参数未提供,不对 ADC 总 SNR/ENOB 写固定保证。linearized NTF 数据、first-order 离散调制器模型和真实码流分别标记,不互相替代。
6. 必测矩阵
| 类别 | 激励 | 检查 |
|---|---|---|
| 编码 | 全 0、全 1、交替 0/1 | −1/+1、DC 归一化 |
| 响应 | 两合法码流仅一处不同 | 相位固定的 2×冲激差响应 |
| 计数 | N=127/128/129/65536 | 0/1/1/512 输出,drain 后判定 |
| 绕回 | 长时间 DC 与随机码流 | CIC 正常绕回,数值一致 |
| FIR 算术 | 正负 tie、极值、对称 pre-add | 舍入/位宽/饱和一致 |
| 时序 | in_valid 连续高、早/晚/缺失 | cadence_fault 与恢复 |
| 启动 | reset 及第一份输入 | m=95 首次 warm,当前构建重算 |
| 复位 | CIC、MAC、输出完成各阶段 | 无旧 valid,seq 重启 |
| 数值性能 | DC、小信号、扫频、带外音、不同 seed | 幅度/噪声/alias 与标记 |
| 数据通路 | 历史写与 MAC 读、任务 deadline | 不混样本、不遗漏 |
| 实现 | 原/量化系数、不同位宽/流水 | manifest、结果与 latency 一致 |
65,536 输入记录有 512 输出但包含 startup。频谱实验采用 12,288 样本预热后再收 65,536:合计 77,824 输入、608 输出;保守去掉前 96 输出后得到 512 steady 输出。
7. SPI 集成扩展
1 MHz SPI 不能承载 48k×24=1.152 Mbit/s payload,还未计协议开销。首版只做配置/状态和偶发 snapshot,连续流需要重新评估接口。
SNAPSHOT 请求一次锁存 data/seq/warm/sat,随后读低 16 位与高 8 位;读期间保持整组快照,RELEASE 后允许下一次冻结。采样流继续运行,不因 SPI 读慢停住。reset 使快照无效,读出协议需检查有效性/复位 epoch。
如果配置侧仍用 50 MHz 而滤波 core 为 49.152 MHz,snapshot request/payload/ack 需明确 CDC,不能直接复用同域寄存器读取。原 Slave 的频率、输入稳定窗口和输出 MISO 预算也需对应其实际时钟重新验证。
8. 实现证据
保持单 core 时钟,按约 20.345052 ns 约束;输入/输出 max/min、load、transition 与实际同步边界对应。没有证明时不 blanket false path/multicycle,不用低 out_valid 频率自动放宽乘法路径。
按模块→顶层仿真→新项目综合推进,检查命令退出、完成标记、未映射/结构/时钟/时序意图和映射网表。现有 SPI 的 774 笔通过结果只属于第一课。
系数设计和 RTL 完成后才标记相应实测指标,物理、形式、ADC 电路性能与时钟接口签核分别提供证据。报告/码流/图放 results,源/manifest 与摘要可入 Git。