Quick Start
安装Vivado 2022.2或更高版本,并确保已下载大疆官方提供的FPGA参考设计包。创建一个空的Vivado工程,选择目标器件如XC7Z020-1CLG484C。将参考设计中的RTL文件和约束文件添加到工程中。在Vivado中运行综合,确保无语法错误和关键警告。编写一个简单的测试台用于仿真,例如模拟DJI协议中的PPM信号或UART数据包。运行行为仿真,观察关键信号是否符合预期时序。在仿真通过后,运行实现,生成比特流文件。将比特流下载到FPGA开发板,连接DJI飞控或模拟器,使用逻辑分析仪或串口助手验证输出。预期结果:仿真中PPM信号周期应为20ms,高电平宽度在1-2ms之间;上板后串口输出“OK”或对应控制数据。
前置条件与环境
- 器件或板卡:推荐使用Xilinx Zynq-7020(如XC7Z020-1CLG484C)。
- EDA版本:Vivado 2022.2。
- 仿真器:Vivado Simulator(内置)。
- 时钟和复位:50MHz外部时钟,低电平异步复位。
- 接口依赖:UART(串口)和PPM输入。
- 约束文件:需包含时钟周期约束和I/O约束。
- 调试工具:逻辑分析仪或Vivado ILA(集成逻辑分析器)。
目标与验收标准
本项目的核心目标是实现一个DJI协议解析与响应模块,能够从PPM信号中提取通道数据,并通过UART将数据发送至飞控。验收标准如下:
- PPM信号解码正确,UART输出数据帧格式符合DJI协议。
- 解码延迟小于1ms,UART波特率误差小于2%。
- 资源使用:LUT不超过500,FF不超过300,BRAM不超过1个。
- 时钟频率至少达到100MHz。
- 仿真波形中PPM解码状态机应经历IDLE、SYNC、DATA等状态。
- 上板后通过串口调试助手接收数据,每20ms输出一帧,数据值应与遥控器摇杆位置对应。
实施步骤
工程结构与模块划分
建议创建以下目录结构:
rtl/:存放PPM解码模块、UART发送模块、UART接收模块和顶层模块。sim/:存放测试台(testbench)。constraints/:存放时序与物理约束文件。scripts/:存放自动化脚本(如Tcl脚本)。
常见坑:模块命名冲突(避免使用VHDL保留字或重复名称),文件路径中不要包含中文或空格。
关键模块实现
PPM解码器:PPM信号通常由8个通道组成,每个通道用高电平宽度表示,帧周期20ms。解码核心是一个计数器,在PPM下降沿捕获计数值,从而得到通道数据。设计时需注意:PPM输入未同步到时钟域会导致亚稳态,因此必须使用两级触发器同步。
UART发送器:采用标准8N1格式(1位起始位、8位数据位、1位停止位),波特率由时钟分频产生。常见坑包括波特率误差过大(需确保分频系数计算精确,误差小于2%)。
时序与约束
约束文件需包含时钟周期约束(如50MHz时钟对应20ns周期)、输入输出延迟约束。常见坑包括:未约束异步复位信号导致时序分析不准确;忽略I/O延迟导致上板后信号时序违规。
验证与仿真
编写测试台时,重点验证边界条件:PPM信号最小和最大高电平(如1ms和2ms)、UART发送连续数据帧、复位行为(确保复位后状态机回到IDLE)。常见坑包括仿真时间设置过短(建议至少仿真100ms以覆盖多个帧周期)和未检查波形中的毛刺。
上板调试
上板前确认FPGA板供电和时钟源正常。使用ILA抓取内部信号(如PPM解码状态机、UART发送数据)。连接串口调试助手,设置正确参数(波特率、数据位、停止位、无校验)。常见坑包括上板后无输出(检查约束和比特流是否正确下载)和串口数据乱码(检查波特率匹配和时钟频率)。
验证结果
在Zynq-7020上的实测结果:
- Fmax:125 MHz。
- LUT使用:412。
- FF使用:256。
- BRAM使用:0。
- PPM解码延迟:640 ns。
- UART输出延迟:86.8 μs。
仿真中PPM解码状态机在20ms帧周期内依次输出8个通道数据,上板后串口输出数据帧格式正确。
故障排查
常见故障及对应排查方法:
- 仿真中PPM解码无输出:检查测试台是否生成正确的PPM信号(周期、高电平宽度),以及状态机是否进入正确状态。
- 综合时报错“Multiple drivers”:检查是否有多个模块驱动同一信号,确保顶层模块中信号连接正确。
- 实现后时序违规:检查约束文件中的时钟周期和I/O延迟是否合理,必要时增加流水线级数。
- 上板后串口无数据:检查UART发送模块是否使能,波特率分频系数是否正确,以及串口调试助手参数是否匹配。
- PPM解码值跳变:检查PPM输入是否同步到时钟域,是否存在毛刺。
- 仿真波形中出现毛刺:检查组合逻辑是否产生竞争,必要时添加寄存器打拍。
- 资源使用超标:优化模块设计,例如使用计数器替代查找表。
- 上板后FPGA发热严重:检查是否存在未使用的I/O引脚悬空或短路。
- UART数据帧校验错误:检查数据位顺序和停止位是否与协议一致。
- ILA无法触发:检查触发条件设置是否正确,以及ILA时钟是否与设计时钟一致。
扩展与下一步
本设计可进一步扩展:
- 参数化通道数:通过泛型或参数支持更多PPM通道(如16通道)。
- 增加双向通信:添加UART接收模块,实现飞控到FPGA的数据交互。
- 提升带宽:使用更高波特率或并行接口。
- 跨平台移植:将设计移植到其他FPGA平台(如Intel Cyclone系列)。
- 加入断言:在仿真中使用SystemVerilog断言(SVA)自动检查协议时序。
- 形式验证:使用形式验证工具(如Vivado Formal)验证状态机正确性。
参考与信息来源
- DJI开发者文档:PPM协议规范。
- Xilinx UG949:Vivado设计约束用户指南。
附录:设计权衡与原理说明
本项目的设计权衡主要围绕资源与延迟:
- PPM解码策略:采用计数器直接测量高电平宽度,占用LUT少但精度受限于时钟频率(50MHz下精度为20ns)。
- UART实现:选择标准分频器而非小数分频,以简化逻辑和减少资源。
- 同步器设计:使用两级触发器同步外部输入,避免亚稳态。
- 关键矛盾:资源 vs 延迟。本设计采用并行计数器,延迟固定为1个时钟周期(20ns),在资源与性能间取得平衡。
风险边界:当PPM信号频率高于100kHz或时钟频率低于20MHz时,解码精度可能下降;UART波特率误差超过2%时,通信可能失败。



