选料清单的最后一栏最贴地:存储接口与通用外设。它们没有锁相环那么金贵,也没有串行链路那么昂贵,却是应用工程师天天打交道的部分——芯片好不好用,八成的口碑落在这批模块的寄存器设计上。本节的任务有二:把常见接口的能力与代价排成对照表,然后解决一个高频实战冲突——功能都想上,引脚不够分,怎么裁。本节产出的外设清单与引脚分配表,就是第四章 RTL 集成的施工图。
外设按职能分四类:存储接口管程序与数据的落脚(片外代码存储、参数存储、大容量介质);通信接口管与外界对话(串口、内部电路板总线、外设芯片总线);定时与监视管节拍与保命(定时器、看门狗);辅助单元管体验(真随机数、温度传感)。四类的共同点:它们都挂在 2.3 节互连的外设端口上,靠寄存器语义与软件对话。
先看存储接口这类的选型逻辑,核心矛盾是"容量、随机访问能力、引脚数"三者不可兼得。片上启动代码要随机访问快, NOR 型闪存或静态存储合适但容量小、贵;参数与系统盘要容量大,块设备型存储合适但读写要按块管理;引脚紧张的场合,串行闪存用四到六根线解决问题,代价是速率上限低。CK770 的选择是双轨:启动代码放串行 NOR(引脚少、随机读够快),数据与模型放块设备介质(容量大、按块读写),两轨各司其职。
通信接口的取舍点在"速率与接线数"的阶梯:三线制串口最省线但速率低、点对点;四线制同步外设总线快但每挂一个设备多一根片选;两线制的板内总线省引脚还能挂一串设备,但速率与抗干扰都有限。选型口诀:速率敏感点对点用四线,多设备低速用两线,调试与人机用三线。这个阶梯的细节在 4.4 节实验里还会重现——实验里的外设就是按这个阶梯搭的。
| 接口 | 典型用途 | 接线数 | 速率档位 | 选型要点 |
|---|---|---|---|---|
| 串行 NOR 闪存 | 启动代码、参数 | 四到六 | 低到中 | 随机读快,执行就地运行 |
| 块设备存储 | 数据盘、模型 | 八到十 | 中到高 | 按块管理,需磨损均衡 |
| 三线串口 | 调试、人机 | 两到三 | 低 | 必留,调试生命线 |
| 四线同步总线 | 高速传感、显示 | 四加片选 | 中到高 | 点对点最快,片选随设备增加 |
| 两线制总线 | 板内低速器件 | 两 | 低 | 省引脚,注意上拉与地址冲突 |
外设 IP 的质量差距,九成落在寄存器设计上。一套好的寄存器布局有三个特征。语义稳定:控制、状态、数据三类寄存器职责分明,状态位"只反映事实、不要求软件清了才有效"的更佳——要求写一清零的状态位是中断风暴与丢事件的老牌祸源。访问原子:多字节的状态一次性读出,或提供快照机制,避免软件读到"半个更新"。文档与实现一致:规格书里每一位都有定义、每一个保留位都拒绝写入,这条看似废话,外购 IP 里实现与文档不符的案例并不罕见,验收时要逐位扫一遍。
与寄存器语义配套的是中断与直接访存的接入。外设向 2.1 节说的中断控制器报事件,向直接访存引擎发搬运请求,两条线的接入质量决定软件体验:中断能不能合并(四十九个串口各报各的还是聚合成一报)、直接访存请求有没有节流(防止单个外设刷屏)。CK770 在 1.1 节案例里吃过的"串口中断风暴",根因就是中断聚合缺失——这个教训后来写进了外设采购的验收条款。
这张图的重点是右侧通路:数据搬运不经过处理器,完成时只发一次中断。两条通路的分工是外设设计的通则——事件走中断、数据走直接访存——CK770 的十二路串口改造正是把原来每字节一中断的旧设计改成了批量聚合加成块搬运。
背景:CK770 的封装引脚在 3.2 节高速接口定案后已经吃紧,外设清单报上来又超了预算:十二路串口、两路四线同步总线、一路两线总线、块设备存储接口加若干杂项,折算引脚数超出封装可用数两成。删谁留谁的裁断会开了一下午。
操作。 团队立了四条裁断规则再逐项过。规则一,调试串口神圣不可删,且必须独立于任何复用组——调试生命线被复用逻辑卡死的项目教训太多。规则二,引脚按"复用组"打包分配,同一时刻一组引脚只服务一个功能,功能冲突时按产品形态定默认组,其余功能做板级取舍。规则三,速率与带宽对账:查 2.3 节预算表,确认每路接口的带宽承诺,超出实际需求两倍以上的降档。规则四,为软件留余地:至少保留一路空置的四线总线引出到测试点,供量产治具与日后扩展使用。
结果。 按规则裁完:十二路串口砍到八路——其中四路聚合走同一条复用组,板级由多路选择器扩展,省下的引脚正好喂给块设备存储的八位数据线;四线同步总线保留两路但共享一个复用组,产品形态默认走传感组;两线总线保留。裁断全程记录在引脚分配表上,每个被砍的功能都注明了替代路径,应用团队拿到的不是"被拒绝了",而是"这么绕一下还能用"。
解读。 引脚裁断的本质是把物理稀缺性显式化。引脚是芯片与世界的合同条款,流片后一分都不能加,所以裁断必须发生在架构期、必须留痕、必须给替代方案。四条规则里最值钱的是第二条"复用组"思维:它把"谁用引脚"从口水仗变成表格式决策,也顺手把上电默认态(复用组初始指向哪个功能)这一隐藏问题逼到了台面上——默认态指错方向,芯片上电第一秒就处于错误配置,这类故障在 8.4 节的启动链里还会遇到。
变式。 若引脚再紧张一档,可以考虑封装级解法:换球栅阵列多一层引出,或把部分功能挪进 1.3 节说的接口芯粒;若产品线后续要派生型号(高配低配),复用组的默认态就要按型号做成可配置,寄存器文档里相应多一张"派生差异表"。引脚规划从来不只是硬件的事,它是硬件与软件的联合契约。
规范答案是"忽略",现实是分三档:忽略(多数)、锁定异常(写保留位触发总线错误,帮助软件尽早暴露问题)、未定义(少数外购核的真实行为)。验收时逐位扫描的目的就在把第三档挑出来——未定义行为的保留位一旦被驱动的越界写入踩中,故障表现为"偶发且无法解释",排错成本远超验收成本。写驱动的纪律因此是:读改写操作永远先把保留位掩成零,不依赖"它大概是零"。
设计上要按安全机制对待,虽然它长得像外设。看门狗的职责是"软件失智时强制复位",这决定了两条特殊属性:它的时钟与供电必须挂在常开域(7.2 节的域规划要给它留位),且喂狗窗口的语义要防"代码跑飞后恰好还在周期性喂狗"——成熟设计会用窗口看门狗(过早过晚都算违规)代替简单的计数清零。把它当普通外设排布的项目,往往在功耗章发现它断电了、在安全评审发现它形同虚设。
选料阶段到此收工。图纸与材料齐备,第四章正式开工:把这份架构与清单翻译成 RTL,并让 CK770 在总线上跑通第一个读事务。