这是我的毕业设计题目,打算用ZYNQ的PS跑速度环PI控制,PL实现电流环和PWM生成。最担心的是PS和PL之间的通信延迟会引入抖动,影响控制性能。请问在硬件架构设计上,如何规划数据流(比如用AXI Stream DMA)才能让电流采样、坐标变换、SVPWM生成这个链路的延迟最小且固定?有没有类似项目的开源参考或设计要点分享?
想用ZYNQ FPGA做‘电机FOC(磁场定向控制)’实时控制系统,在PL部分实现SVPWM和Clarke/Park变换,如何确保控制环路的高确定性低延迟?
提问
回答 3

毕业设计做这个挺有挑战的,但思路是对的,PS跑慢环,PL跑快环。核心痛点就是你说的,PS和PL之间的延迟抖动。
我的建议是,把整个电流环(包括Clarke/Park变换、反变换和PI调节器)都放在PL里,做成一个纯数据流的硬件模块。PS只通过AXI-Lite配置PI参数和读取状态,完全不参与实时数据流。这样,从ADC采样到PWM输出的整个链路都在PL内部,延迟就是纯粹的组合逻辑和流水线延迟,是纳秒级且完全确定的。
数据流可以这样规划:用AXI Stream把ADC采样数据(比如通过XADC或外部ADC IP)灌进来,后面紧跟着你的变换和PI模块,最后输出SVPWM的占空比到定时器。全部用Stream接口手拉手连接,中间不要经过任何总线或DMA缓冲。DMA只在需要把一些调试数据(比如电流波形)非实时地送到PS内存时才用。
开源参考可以看看OpenCore的“FOC IP Core”,或者去GitHub搜“FPGA FOC”,有几个用Verilog/VHDL写的项目,虽然不一定直接用于ZYNQ,但硬件架构可以参考。

同学你好,我也做过类似的项目。确保低延迟和确定性的关键就四个字:硬件加速。别让数据在PS和PL之间来回跑。
具体步骤:
1. 在Vivado里,用HLS或者直接写RTL,把Clarke、Park、IPark、SVPWM以及电流PI都做成硬件模块(IP核)。
2. 这些模块之间全部用AXI-Stream接口互联。Stream是单向的、点对点的,没有总线仲裁,延迟固定。
3. ADC数据通过一个FIFO或者直接接进这个处理链。PI控制器输出直接接到你的PWM发生器(比如基于计数器的比较模块)。
4. PS只干两件事:一,通过AXI-Lite总线初始化配置所有IP核(比如设置PI的Kp, Ki);二,运行速度环,算出电流指令值(Iq_ref, Id_ref)。这个指令值怎么给PL呢?最好用AXI-Stream从PS发到PL,或者用共享的BRAM。用DMA模式,PS写一次,PL那边就能立即在下一控制周期使用,延迟是一个固定周期。注意事项:一定要用PL的时钟来同步所有实时信号。PS过来的配置或指令,要用PL时钟打两拍同步,避免亚稳态。计算模块尽量流水线化,虽然增加几个时钟周期延迟,但吞吐量高,且延迟依然是固定的。

简单说下我的经验。你想用DMA,但DMA本身有延迟不确定性,因为要竞争AXI总线。对于电流环这种需要微秒级响应的,最好避免。
更“硬核”一点的做法:把速度环PI也放到PL里。这样整个FOC都在PL里跑,PS彻底沦为“配置和监控终端”。PL内部用状态机或者一个小型软核(比如MicroBlaze)来调度整个算法流程,时序绝对可控。
如果还是想用PS跑速度环,那数据交换点要尽可能少。比如,PS每速度环周期(比如1ms)计算一次电流给定,通过一个深度为1的AXI Stream FIFO(或Mailbox IP)发给PL的电流环。PL每个电流环周期(比如100us)去读这个FIFO,读不到就用旧值。这样,即使PS偶尔慢了一点,也不会影响PL电流环的硬实时性,只是给定值更新慢了一拍,系统仍是稳定的。
设计要点:在PL里为整个实时链路留一个“旁路”或“调试接口”,能把关键信号(如Ia, Ib, Id, Iq)用另一个非实时的DMA流送到PS,方便你用SDK抓波形看效果,这对调试至关重要。开源项目可以关注一下“VHDL FOC”或“ZYNQ FOC”,有些硕士论文会把整个系统开源,是很好的起点。
发表回答
登录后可在本页底部提交回答
