本系列第 4 篇。前几篇:架构、编程模式、实时程序设计。本文进 FPGA 侧。
FPGA 时钟速率远低于 CPU/GPU,但赢在两点:能造出在一个时钟周期里完成多个操作的专用电路,且所有代码在硬件里并行跑。加上与 I/O 模块直连,吞吐量、确定性、响应时间都能超过处理器方案。代价是开发流程完全不同------
每次点"运行",LabVIEW 生成 VHDL → Xilinx 编译器合成、布局、布线 → 位文件下载到芯片。设计越复杂,编译可能长达数小时。所以 FPGA 开发的第一生产力是"少编译几次"。
第一招:在仿真里开发
指南推荐七步流程:需求 → 架构 → 实现 → 测试调试 → 优化 → 编译到硬件 → 部署。具体做法:FPGA 目标右键 → "在开发计算机上执行(带仿真 I/O)",此时拥有全套标准调试功能,改一行秒级重跑;需要真实 I/O 再切回 FPGA Target。把编译留到一切验证完之后。

FPGA 开发三招:仿真先行 / 速率算清 / 管好资源
第二招:把时钟和速率算清楚
FPGA 的 I/O 节点返回单点数据。大多数模块的采样率靠循环定时器控制:延迟以 tick 计,cRIO 默认时钟 40 MHz------采样延迟 20000 ticks = 2 kHz。两个例外:ΔΣ 转换的高速模拟模块自带板载时钟,速率用属性节点设;模块最大速率是天花板。
触发是 FPGA 看家本领:
- 上升沿:移位寄存器保存上一拍 + Greater Than 比较(初始化迭代终端,避免第一拍误触发)
- 下降沿:同理用 Less Than
- 模拟电平触发:过阈比较,布尔输出当触发信号
- 锁存值:触发上升沿把另一循环的模拟输入锁进寄存器,保持到下次触发;跨循环共享用局部变量(FPGA 里异步循环间共享数据的好办法)
第三招:子 VI 里别放这两样东西
铁律:I/O 节点、循环定时器/等待函数不要放进子 VI。
- I/O 节点留在顶层:框图可读、子 VI 可移植,避免编译器为多个调用方生成仲裁逻辑白耗门资源
- 定时器留在子 VI 会拖慢调用方;真要进单周期定时循环(SCTL),延时函数根本不被支持
- 替代:时钟周期计数(反馈节点累加 tick),PWM 可改写成"不自带节拍"的可移植版本
重入问题:子 VI 默认可重入,每个调用点生成独立副本(数据独立),但每个副本吃自己的门资源 。改非重入省资源,但多调用方引入仲裁------编译器加更多逻辑处理冲突,小型子 VI 反而更费结构。省资源的正解是设计上避免仲裁:少用共享资源,FIFO 这类双边资源别多读多写。
三招记住:仿真里迭代、速率算清楚、仲裁设计掉。最后一篇讲 I/O 定时同步与扩展机箱选型。
系列索引:01 架构 · 02 编程模式 · 03 实时程序设计 · 04 FPGA 编程(本文)· 05 I/O 同步与扩展