开源一个能在 Tang Primer 25K 上实时跑 KWS 的 TinyML SoC

📅 2026/6/30 4:33:20
开源一个能在 Tang Primer 25K 上实时跑 KWS 的 TinyML SoC
上一篇文章介绍的是 TinyML_NPU一个面向 TinyML 推理的 NPU IP。这次开源的是围绕这个 NPU 搭起来的完整 SoC 工程TinyML_SOC。项目地址TinyML_SOC GitHub 仓库TinyML_SOC v0.1.0 Release这篇文章只讲三件事这个项目做了什么它相比单独 NPU IP 多解决了什么问题当前实测结果是否可信1. 项目做了什么TinyML_SOC 是一个运行在Sipeed Tang Primer 25K / GW5A-25A上的实时关键词识别 SoC demo。整体路径如下I2S microphone | v VexRiscv CPU - VAD - fixed-point log-mel frontend | v TinyML_NPU - INT8 CNN inference | v UART structured log 8-bit LED result也就是麦克风持续采样CPU 做语音触发和特征提取NPU 做 CNN 推理UART 输出识别结果LED 显示类别结果它不是一个只停留在仿真的 IP demo而是已经完成了 FPGA 上板、Flash 启动、串口日志、LED 输出和自动化验证。2. 基本规格项目当前配置开发板Sipeed Tang Primer 25KFPGAGW5A-25A系统频率50 MHzCPUVexRiscv RV32IMNPUTinyML_NPURTOSFreeRTOSSRAM64 KiB固件启动SRAM boot stub QSPI XIP麦克风I2S digital mic输出UART 115200 8-bit LED任务12 类英文 KWS许可证Apache-2.0第三方组件保持原许可证仓库结构上TinyML_NPU、VexRiscv、FreeRTOS 都作为 submodule 引入。TinyML_SOC 自己负责 SoC 集成、板级工程、BSP、实时固件、烧录脚本和文档。3. 为什么要做成 SoC单独开源 NPU IP 只能说明“推理核心能工作”。但要让它变成一个真实可运行的 FPGA 应用还需要补齐很多系统问题CPU 如何配置 NPUNPU 如何通过总线访问 SRAM 和 Flash固件和模型如何从外部 Flash 启动麦克风数据如何实时进入系统frontend 放在哪里做推理结果如何输出板级时序、资源、下载、串口如何验证哪些构建产物不能放进公开仓库TinyML_SOC 做的是这部分工作。它把 NPU 放进一个 VexRiscv SoC 里通过 AHB/APB 总线连接 CPU、SRAM、QSPI XIP、I2S、UART、GPIO 和 NPU。最终效果是开发板上电后从 Flash 启动麦克风持续监听检测到语音后完成关键词识别并通过 UART 和 LED 输出结果。4. CPU 和 NPU 的分工这个项目里CPU 和 NPU 的边界是固定的。CPU 负责I2S 麦克风采样VAD 触发1024-point FFT40-bin log-melCMVNINT8 feature 准备FreeRTOS 任务调度UART/LED 输出NPU 负责读取 uOP读取 INT8 参数读取输入 feature执行 INT8 CNN写回 12 类输出 logits外部 Flash 保存XIP 固件模型参数NPU uOPFlash 布局如下External QSPI Flash 0x000000 FPGA bitstream 0x400000 KWS firmware model uOPSoC 内部把0x00100000映射到外部 Flash 的0x400000CPU 从 SRAM boot stub 跳到 XIP 固件执行。5. 串口输出启动时可以看到[TinyML_SOC] boot [TinyML_SOC] fe_init_start [TinyML_SOC] fe_init_ok [TinyML_SOC] ready mic_sr16276一次识别的输出类似[KWS] vad_trigger avg_abs... peak... [KWS] npu_start clip... [KWS] detect idx0 labelone score... margin... cycles... us...其中detect行是稳定接口脚本会解析idxlabelscoremargincyclesusLED 行为也固定one到eight对应单个 LEDup全亮down全灭noise/silence/reject不更新 LED6. 当前验证结果v0.1.0 做过以下检查项目结果make checkPASSRTL generationPASSFirmware buildPASSVCS testvectorPASSVCS PCM full pathPASSGowin implementationPASSTang Primer 25K demo checkPASS板级验证覆盖FPGA ID 可读external Flash ID 可读bitstream 写入 FlashKWS image 写入 Flash0x400000从 Flash 重新配置启动UART 正常输出 boot/ready/detectI2S 麦克风触发 VADCPU frontend 正常工作NPU 推理正常完成GPIO LED readback 正常最终板级 demo 中one/up/down都被识别到[KWS] detect idx0 labelone ... cycles2549232 us50984 ... [KWS] detect idx8 labelup ... cycles2600769 us52015 ... [KWS] detect idx9 labeldown ... cycles2550254 us51005 ...这不是只看仿真波形也不是只看 NPU 单点测试而是从麦克风输入到 UART/LED 输出的完整闭环。7. 资源和性能Gowin implementation 结果指标使用量占比Logic13980 / 2304061%Register9548 / 2328042%CLS10025 / 1152088%I/O26 / 8631%BSRAM50 / 5690%DSP19.5 / 2870%时序时钟约束Actual Fmaxclk50.000 MHz55.157 MHz固件和模型项目大小Flash KWS image188608 bytesSRAM boot stub32 bytesNPU uOP24 条768 bytesINT8 参数57344 bytesNPU input8000 bytesNPU output12 bytes板级 NPU 推理时间样本Cycles延迟one254923250.984 msup260076952.015 msdown255025451.005 ms平均256675251.335 ms这里要区分两个概念51.335 ms是 NPU 推理时间不是完整端到端 KWS 延迟当前音频窗口是 16000 samples实际采样率约16276 Hz所以音频窗口约0.983 s。NPU-only 的速度不能直接当成完整语音识别吞吐。8. 如何复现初始化gitclone https://github.com/XuZhanhe-Chi/TinyML_SOC.gitcdTinyML_SOCmakesetupmakeenv生成 RTL 和固件makesoc-rtlmakegw5a-fw生成 Gowin bitstreamexportGOWIN_IDE_BIN/path/to/Gowin/IDE/binmakegw5a-bitstream烧录 Tang Primer 25KexportGOWIN_PROGRAMMER/path/to/Gowin/Programmer/bin/programmer_climakegw5a-probemakegw5a-detect-flashmakegw5a-flash-bitstreammakegw5a-flash-kwsmakegw5a-reboot打开串口exportSERIAL_PORTftdi://ftdi:2232h/2makemonitor自动 demo checkexportSERIAL_PORTftdi://ftdi:2232h/2makegw5a-demo-check如果 VCS 可用可以跑makesim-vcs-testvectormakesim-vcs-pcm公开检查makecheck9. 开源边界这个仓库只提交源码、脚本、约束、文档和必要配置。不提交bitstreamELFbin波形文件综合实现目录训练数据训练脚本本地工具路径本地构建产物这样做是为了让仓库保持干净也方便别人 clone 后重新构建和验证。10. 适合看什么这个项目适合关注下面这些方向的人参考FPGA SoC 集成TinyML 推理加速VexRiscv SpinalHDLAHB/APB 外设集成QSPI XIP 启动FreeRTOS 裸机嵌入式固件I2S 实时音频输入NPU 和 CPU 的软硬件协同FPGA 项目开源整理TinyML_NPU 解决的是“CNN 推理核心怎么做”。TinyML_SOC 解决的是“怎样把这个核心放进一个真实系统并在 FPGA 板子上跑起来”。项目地址TinyML_SOC GitHub 仓库TinyML_SOC v0.1.0 Release