码电路的阿明
做智能小车的话,PS和PL的划分思路其实挺明确的。PS跑Linux和算法,PL做实时控制,这个方向是对的。
数据交互上,我的经验是分情况处理。对于电机PWM控制这类短指令,用AXI GPIO或者AXI Lite寄存器映射就足够了,延迟很低,软件写一个寄存器,硬件马上就能反应。
对于摄像头图像、激光雷达点云这类大量数据,一定要用AXI DMA配合PL的FIFO或BRAM。让DMA在PS的DDR和PL之间搬运数据,PS用中断或轮询方式处理,这样不占用CPU大量时间。
保证实时性的关键是把时限最严的任务放在PL里。比如电机控制闭环,用PL的计数器生成PWM,用PL读取编码器脉冲,甚至在PL里做个简单的PID。这样无论Linux是否繁忙,电机控制都不会受影响。PS只需要定期发送目标速度这类高级指令。
开源项目的话,可以搜一下“ZynqBot”或“Pynq机器人”,有些基于PYNQ的项目。ROS方面,Xilinx官方有ROS2 FPGA加速的相关资料和案例,虽然不完全对应小车,但通信架构可以参考。
建议你先在Vivado里用Block Design连接一下PS和PL,从简单的AXI Lite控制LED开始,再逐步加DMA和中断,这样理解更深刻。
