算法在 MATLAB 里跑通了,接下来呢?选板子、点引脚、把接口一个个调通、移植 Linux、 在 PS 与 PL 之间搭一条数据通路、写驱动、把算法变成加速核塞进去、做系统集成、再写一层应用 软件。这一串活分属五六个工种,每一道交接都要重新对一次接口,也都在埋下只有跑到最后才会暴露的 问题。工具链自动化的,就是这一段。
输入两样,产出一个产品
你交进来两样东西。一份算法原型,用 MATLAB 或 Python 写,用来定义什么叫「正确」。一张板卡 原理图,厂商板卡或自研板卡都可以,用来定义这块硬件长什么样。其余由工具链完成:接口调通、嵌入式 Linux、PS 与 PL 之间的数据通路、驱动、生成并嵌入的加速核、系统集成,以及最上面的应用软件。 它给自己定的标准很简单:产出的东西能不能长期运行、能不能直接交给客户。
一条流程,四个板卡家族
边缘计算不是一块板子的事。做视觉盒子的人挑 Kria 模块,做工业控制的人用 MPSoC,做无线电和雷达的人要 RFSoC,做教学和成本敏感项目的人回到 Zynq 7000。大多数工具链只服务其中一个家族,换个家族就得从头再来。我们的板卡目录横跨这四个家族:21 块板卡,其中 20 块已支持、另有 1 块已声明,覆盖开源 PYNQ 框架支持的那批板子,再加上几款 AMD 评估板。实测
接一块新板子,加的是一份描述文件。整个硅家族共有的特性放在器件适配层,单块板卡的差异放在这块板卡的描述里,核心部分不含任何型号、引脚或地址。所以接一块新板,加的是一份描述,核心代码不动。
这份目录是工具链能覆盖的范围,并不等于每块板都已在硅上验证。每块板都从各自的板卡文件派生,本文这条链路是在其中一块上实测的。
交付分五层
交付出去的是五个包,每一层一个:板卡调试、嵌入式 Linux、片上互连、功能模块、应用。上面一层要用下面一层的产物时,声明自己的前置层,按内容哈希去引用,而不是把下层的文件复制一份进来。好处很直接:只需要板卡调试和操作系统这两层的客户,拿走这两个包就能用,不必背上整套系统。每个包自带一套自检,从一份干净导出的目录里就能跑起来,不依赖开发机上的残留。
一次端到端的完整运行
证明流程能从头走到尾,最直接的办法是拿一个完全由它产出的系统来跑。一块 AMD RFSoC 板卡,板上插着两根天线,一个 USB 摄像头对着桌面,显示器上是实时看板。摄像头的画面进主机、进 ARM 上的 Linux、进 FPGA 里的 802.11 发送器,从转换器出去,绕过一段线缆,再回到同一块芯片里的接收机,然后解调、纠错、逐字节校验,最后把图像拼回来推到浏览器。板卡调试、Linux、数据通路、驱动、物理层逻辑、应用软件和这个看板,全部由工具链产出。
在两根真实天线上,用 HT、MCS2、LDPC 编码跑 320x240 原始视频,实时看板读到 11.73 Mb/s 的逐字节校验净吞吐,是几何上限的 95.7%,误包率 0.0%,27617 帧里 27612 帧逐字节一致。实测 换成线缆、用最高的一档调制编码方式,同一条链路稳定跑到约 34 Mb/s,是该配置下计算上限的 94.5%,收到的 1,367 帧全部逐字节一致,零错误、零重启,全程连续。实测 这台收发机覆盖三种物理层帧格式,即 non-HT、HT 与 VHT,20 MHz 单流,三种格式都在这块板上验证过:三次重新上电全部通过,每次还跑一组故意改坏的对照,确认这套校验确实能报错。实测
纠错能力,来自仿真
链路的纠错码在仿真里比在近乎无误码的线缆上更容易刻画,所以这一个数字明确标为仿真结果,和上面的硬件实测分开记。在加性噪声信道上,码率二分之一的码把大约百分之八的原始误比特率,降到译码后的约百万分之五,大约四个数量级的纠错。仿真实测
这对你意味着什么
如果手上有一个已经验证过的算法原型,也选定了目标板卡,需要的是一套能上板、能长期运行、能交付 给客户的完整边缘计算系统,那么这套工具链解决的就是中间那一大段:从原理图到产品之间的所有工程活。 开始之前先备好两样:算法原型能给出一份可以逐位比对的参考输出,目标板卡的原理图完整。
这条流程生成的译码器与物理层模块,见各产品页面。