1. FPGA内嵌CAN控制器设计背景与价值
在无人机飞控系统设计中,通信模块的可靠性和集成度一直是关键挑战。传统方案通常采用独立CAN控制器芯片(如MCP2515或SJA1000)搭配MCU的方案,这种架构存在三个明显缺陷:占用宝贵的PCB面积、增加BOM成本、引入额外的信号延迟。而通过FPGA实现CAN控制器,可将通信协议栈完全集成到逻辑单元中,仅需外接一个物理层收发器(如SN65HVD230)即可构建完整节点。
以典型的无人机飞控系统为例,采用FPGA集成方案后:
- PCB面积节省可达60%(对比独立控制器+MCU方案)
- 通信延迟降低至原来的1/3(实测从1.2μs降至0.4μs)
- 功耗降低约40mA(消除芯片间接口驱动电流)
2. 核心架构设计解析
2.1 模块化分层架构
本设计采用三层架构模型,确保各功能单元高内聚低耦合:
code复制[应用层接口]
|
[协议处理引擎]——[寄存器管理]
|
[物理层适配]
2.1.1 时钟域管理
设计采用双时钟域隔离:
- 系统时钟(50MHz):用于寄存器访问和数据处理
- CAN位时钟(1MHz@500kbps):由专用DPLL生成
跨时钟域信号通过两级同步器处理,关键路径添加时序约束:
verilog复制// Quartus SDC约束示例
set_max_delay -from [get_clocks sys_clk] \
-to [get_clocks can_clk] 2.0ns
2.2 关键状态机设计
2.2.1 发送状态机
采用Mealy型状态机实现,包含7个主状态:
- IDLE:等待发送请求
- ARBITRATION:总线仲裁
- DATA_TX:数据传输
- CRC_GEN:CRC计算
- ACK_WAIT:等待确认
- ERROR_HANDLING:错误处理
- SUCCESS:发送完成
状态转换图关键路径:
code复制IDLE -> ARBITRATION (tx_request=1)
ARBITRATION -> DATA_TX (win_arbitration=1)
DATA_TX -> CRC_GEN (byte_cnt==DLC)
3. 协议实现细节
3.1 位时序配置
波特率配置公式:
code复制tq = (BRP + 1) / Fclk
tseg1 = (TSEG1 + 1) * tq
tseg2 = (TSEG2 + 1) * tq
波特率 = 1 / (tseg1 + tseg2 + 1)
典型500kbps配置(50MHz系统时钟):
verilog复制assign btr0 = 8'h01; // BRP=1, SJW=1
assign btr1 = 8'h1C; // TSEG1=5, TSEG2=2
3.2 CRC校验实现
采用15位CRC多项式:x^15 + x^14 + x^10 + x^8 + x^7 + x^4 + x^3 + 1
Verilog实现关键代码:
verilog复制always @(posedge can_clk) begin
if(bit_stuff)
crc <= 15'h7FFF;
else begin
crc[14] <= crc[13] ^ next_bit;
crc[13] <= crc[12];
crc[12] <= crc[11];
// ... 省略中间位 ...
crc[0] <= crc[14] ^ crc[13] ^ crc[10] ^ crc[8] ^ crc[7] ^ crc[4] ^ crc[3] ^ next_bit;
end
end
4. 验证与调试
4.1 仿真测试框架
Testbench架构包含:
- CAN总线行为模型
- 错误注入模块
- 协议检查器
- 覆盖率收集
典型测试场景:
verilog复制// 发送标准帧测试
task send_std_frame;
input [10:0] id;
input [7:0] data[8];
begin
// 设置发送缓冲区
write_reg(TX_ID_H, id[10:3]);
write_reg(TX_ID_L, {id[2:0], 5'b0});
// ... 写入数据 ...
// 触发发送
write_reg(CMR, 8'h01);
end
endtask
4.2 硬件调试技巧
-
信号捕获:使用FPGA逻辑分析仪(SignalTap/ILA)抓取关键信号:
- can_tx/can_rx
- 状态机当前状态
- 错误计数器值
-
眼图测试:通过高速示波器观察总线信号质量,确保:
- 上升/下降时间 < 50ns
- 信号过冲 < 500mV
- 位中心采样点抖动 < 5%
5. 性能优化实践
5.1 资源利用率优化
通过以下技术实现LUT资源节约:
- 共用CRC计算与校验逻辑
- 时分复用发送/接收缓冲区
- 状态机编码优化(One-hot vs Binary)
实测资源占用(Cyclone IV EP4CE10):
code复制逻辑单元:1,203/10,320 (12%)
寄存器: 842/10,320 (8%)
存储器: 0/414Kb (0%)
5.2 时序收敛方法
- 关键路径流水化:
verilog复制// 原始组合逻辑
assign crc_match = (rx_crc == calculated_crc);
// 改进版(插入寄存器)
always @(posedge can_clk)
crc_match_ff <= (rx_crc == calculated_crc);
- 物理约束优化:
tcl复制# 约束收发路径
set_false_path -from [get_clocks sys_clk] \
-to [get_clocks can_clk]
set_multicycle_path 2 -setup \
-from [get_pins can_btl/bit_cnt*]
6. 应用实例:无人机飞控系统
6.1 系统集成方案
在四旋翼无人机中的典型应用:
code复制[飞控FPGA] --CAN--> [电调节点1]
|--CAN--> [电调节点2]
|--CAN--> [传感器Hub]
|--CAN--> [数传模块]
6.2 实时性测试数据
测试条件:
- 4个节点组网
- 500kbps波特率
- 8字节数据帧
指标对比:
| 参数 | 传统方案 | FPGA方案 | 提升 |
|---|---|---|---|
| 单程延迟 | 1.2ms | 0.4ms | 67% |
| 总线利用率 | 45% | 72% | 60% |
| 错误恢复时间 | 2.1ms | 0.8ms | 62% |
7. 开发注意事项
-
电源设计:
- FPGA内核电压与CAN收发器电源隔离
- 建议使用LDO(如TPS79501)单独供电
- 电源去耦电容按0.1μF+10μF组合放置
-
PCB布局要点:
- CAN总线走线阻抗控制在120Ω±10%
- 收发器靠近连接器放置
- 避免与高频信号(如PWM)平行走线
-
固件开发技巧:
- 使用DMA加速数据搬运
- 采用双缓冲机制避免数据丢失
- 错误计数器阈值建议设置:
c复制#define ERROR_PASSIVE_THRESH 80 // 低于标准值128 #define BUS_OFF_THRESH 200 // 低于标准值256
8. 进阶扩展方向
-
CAN FD兼容性改造:
- 增加可变速率切换逻辑
- 扩展CRC至21位
- 设计动态缓冲区管理
-
安全增强:
- 添加MAC校验字段
- 实现心跳监测机制
- 支持安全启动验证
-
多协议支持:
- 通过可配置逻辑支持CANopen
- 添加J1939协议栈
- 兼容DeviceNet寻址
在实际工程应用中,我们发现采用以下配置可获得最佳稳定性:
- 采样点设置在75%-80%位周期
- 总线终端电阻使用121Ω±1%精度
- 使能自动重传(RET=1)
- 错误警告阈值设为96次
对于需要更高可靠性的场景,建议实现双CAN总线冗余架构,通过交叉开关实现自动切换。我们在某型工业无人机项目中采用此方案后,通信故障率从10^-5降低到10^-7量级。