FPGA 设计里没人排进计划的那一部分
团队会规划逻辑、时序和电路板。FPGA 上电时怎样得到它的设计,产品发货之后新设计怎样装进去,这些问题却常常被留到最后。很多现场故障就出在这里:有时起不来的板子、更新失败后卡死的产品、上电时抖一下的电机。这些都是在早期被设计进去,或者被设计排除掉的。
两类 FPGA,两种启动方式
- SRAM 型器件把配置保存在易失存储器里,所以每次上电都必须从某处加载比特流:通常是 FPGA 自己读取的外部串行闪存,或者由处理器通过串行或并行链路送入。加载需要可测量的时间,从几十毫秒到几百毫秒不等,取决于器件规模和链路速度,在结束之前逻辑什么都不做。设计里要多一颗存储器和一套启动时序。
- 闪存型器件(把配置存在芯片内部的系列)在电源稳定之后几乎立刻运行,不需要外部启动存储器,而且配置不会因为辐射引起的翻转而丢失或损坏,这类翻转可能让易失配置存储器里的某一位翻转。我们为 PolarFire 核心板选用 PolarFire,部分原因就在这里,一些小规模的 Lattice 系列也是这样工作的。
两者没有笼统的好坏。问题是产品能否承受启动时间、多出来的器件和配置暴露在外的风险,以及应用是否需要只有 SRAM 型系列才能提供的容量和速度。
启动时间是需求,不是细节
写下产品允许的最长就绪时间,并对照检查启动路径。比如挂在 PCI Express 链路上的设备,必须在电源稳定后的限定时间内应答,一个主机枚举总线时仍在加载的 FPGA,会直接被找不到。很多设计的办法是:用快速配置模式、更宽或更快的闪存链路、更小的比特流,或者把设计拆开,让一小部分先启动,其余的稍后再加载。
电源时序与监控
- FPGA 有多路电源:内核、辅助电源,以及每个 I/O 分区一路。要读数据手册里关于顺序、上升时间和单调性的要求,并让电源树带着余量去满足它们,而不是只在实验台上勉强通过。
- 用一个监控芯片,让所有电源正常之前 FPGA 一直保持复位,并且能检测运行时的跌落。缓慢或有噪声的上升,会造成看起来随机的配置失败。
- 在极限条件下测试电源的行为:低温冷启动、来自弱电源的缓慢上升、掉电和恢复。
设计启动之前,引脚在做什么
在配置期间、你的逻辑还不存在时,I/O 引脚处于默认状态,通常是高阻,有时带弱上拉,取决于器件系列和某个配置引脚。接在它们上面的任何东西,都会看到这个状态。以后要驱动电机、加热器、继电器或复位线的引脚,必须有一个外部电阻拉到安全电平,这样 FPGA 空白时也是安全的。原理图评审时对每个输出都要检查这一点,包括那些驱动另一颗芯片的片选或复位的输出。一条共用的总线,如果它上面所有外设在上电时都看到悬空的线,可能产生电流冲击。
配置模式,以及板子怎样编程
- 每块板子,包括量产板,都要留一个 JTAG 连接。它能救回闪存损坏的板子,也能用于调试。
- 确定工厂里怎样给配置存储器编程:贴片前预先编程的器件、贴片后通过 FPGA 用 JTAG 编程,或者由处理器编程。对十块板最便宜的选择,对一万块板就不是最便宜的。
- 每个板子版本都要检查配置引脚的上拉和模式选择电阻,因为选错电阻,器件会一直等待一个永远不会到来的配置。
能扛住掉电的现场升级
升级是已部署产品所做的最危险的操作。它必须能在任何时刻被中断后仍然安全:电源跌落、线缆被拔、下载内容损坏。
- 两个镜像,不是一个。保留一个现场永不被覆盖的黄金镜像,再加一个用于更新的分区。如果主镜像校验失败,设备回退到黄金镜像,仍然能够通信,所以可以远程修复。多数系列支持从多个位置加载,并在第一个失败时回退。
- 把新镜像写到不活动的分区,校验之后再切换。写完后对整个镜像检查 CRC 或哈希,然后才改动选择它的指针。切换本身应当是一次很小的写入。
- 先验证再信任。新设计启动后,在时限内由看门狗或握手来确认它工作正常。如果没有,下次启动回退到黄金镜像。
- 给镜像签名。用签名检查,把公钥保存在设备或执行升级的处理器里,防止未授权的或损坏的文件被装入。有比特流加密和认证功能的器件,要用上它们。
- 上报版本。让设计通过一个寄存器暴露它的构建标识,这样售后就知道现场运行的是什么。
能发现启动故障的测试
- 让板子用随机的断电时长反复上电几千次,统计启动失败的次数。
- 在升级的每一个阶段打断它:擦除时、写入时、最终切换时。设备必须每次都能恢复。
- 用缓慢的上升和掉电跌落来给它供电。
- 在极端温度下运行,因为闪存时序和电源行为都会变。
- 故意损坏一个镜像,确认回退能接管。
我们能帮什么
我们设计 FPGA 板和逻辑,包括配置、电源和升级路径,覆盖 Lattice、Microchip PolarFire 和 Xilinx 器件。请看我们的 FPGA 设计服务、时序约束与收敛指南,以及嵌入式产品怎么选 FPGA。