FPGA线上课程平台|最全栈的FPGA学习平台|FPGA工程师认证培训
登录
首页-技术文章/快讯-技术分享-正文

基于FPGA的CAN总线控制器设计与实现指南

二牛学FPGA二牛学FPGA
技术分享
6小时前
0
0
2

Quick Start

  1. 准备环境:安装 Vivado 2020.1 或更高版本,确认支持 Xilinx Artix-7 系列。下载 CAN 控制器 RTL 源码包(例如开源 CAN-FD 控制器 IP)。
  2. 创建工程:在 Vivado 中新建 RTL 工程,目标器件选择 xc7a35tcsg324-1(或对应板卡型号)。
  3. 添加源文件:将核心模块 can_top.vcan_btl.vcan_crc.vcan_fifo.v 等加入设计。添加顶层文件 can_top_wrapper.v 实例化 can_top
  4. 添加约束:创建 XDC 文件,约束系统时钟(50 MHz)、复位(低有效)、CAN TX/RX 引脚(例如 TX=J15, RX=K16)。
  5. 综合与实现:运行 Synthesis 与 Implementation,观察资源利用率(LUT < 1200, FF < 800)与 Fmax(> 50 MHz)。
  6. 编写 Testbench:创建 tb_can_top.v,实例化 DUT,生成 50 MHz 时钟与复位序列。模拟 CAN 总线收发:发送标准帧(ID=0x123, DLC=2, DATA=0xA5 0x5A)。
  7. 运行仿真:在 Vivado Simulator 中运行 100 μs 仿真。观察波形:tx_active 在发送期间为高,rx_active 在接收期间为高,crc_error 保持低。
  8. 验收:确认仿真日志输出 "Frame transmitted successfully" 与 "Frame received correctly"。资源报告满足目标。上板后通过 CAN 分析仪回环测试无错误。

前置条件与环境

项目推荐值说明替代方案
FPGA 器件Xilinx Artix-7 XC7A35T主流低成本器件,逻辑资源充足XC7A100T / Spartan-7 / Zynq-7000
EDA 工具Vivado 2020.1 或更高支持综合、实现、仿真ISE 14.7(仅限旧器件)
仿真器Vivado Simulator内建,无需额外安装ModelSim / Questa / Verilator
系统时钟50 MHzCAN 位时间需分频至 1 MHz(125 kbps ~ 1 Mbps)100 MHz 经 PLL 分频
复位信号低有效,异步复位确保上电后控制器进入空闲状态同步复位(需额外逻辑)
接口依赖CAN 收发器(如 TJA1050)FPGA 无法直接驱动差分总线,需外部 PHY板载 CAN 收发器模块
约束文件XDC(时序 + 引脚)约束时钟周期、输入输出延迟UCF(旧工具)

目标与验收标准

  • 功能点:支持标准帧(11 位 ID)与扩展帧(29 位 ID),数据场长度 0~8 字节。实现位填充(Bit Stuffing)、CRC 校验(15 位)、应答(ACK)与错误帧检测。
  • 性能指标:位速率可配置(125 kbps / 250 kbps / 500 kbps / 1 Mbps)。最大时钟频率 Fmax >= 50 MHz。
  • 资源占用:LUT < 1500,FF < 1000,BRAM < 2。
  • 验收方式:仿真通过 100 次随机帧收发(无 CRC 错误、无位错误)。上板后使用 CAN 分析仪连续发送 1000 帧,FPGA 正确接收并回显,误码率 0%。

实施步骤

1. 工程结构

can_controller/
├── rtl/
│   ├── can_top.v          # 顶层模块,集成位时序、协议、FIFO
│   ├── can_btl.v          # 位时序逻辑(同步段、传播段、相位段)
│   ├── can_crc.v          # CRC-15 生成与校验
│   ├── can_fifo.v         # 发送/接收 FIFO(深度 16)
│   ├── can_protocol.v     # 协议状态机(空闲、仲裁、发送、接收、错误)
│   └── can_bitstuff.v     # 位填充与解填充
├── sim/
│   └── tb_can_top.v       # 测试平台
├── constr/
│   └── can_pins.xdc       # 引脚与时钟约束
└── README.md

注意:顶层模块 can_top 应包含所有子模块的实例化,并对外提供 AXI-Lite 接口(可选)或简单并行接口(8 位数据总线 + 读写使能)。

2. 关键模块实现

位时序模块 (can_btl)

根据系统时钟分频生成位时间。例如 50 MHz 时钟,目标 1 Mbps,位时间 = 50 个时钟周期。配置为:同步段 1 Tq,传播段 2 Tq,相位段 1 为 3 Tq,相位段 2 为 4 Tq(采样点约 70%)。

// 位时间计算示例(50 MHz -&gt; 1 Mbps)
parameter SYNC_SEG   = 1; // 1 Tq
parameter PROP_SEG   = 2; // 2 Tq
parameter PHASE_SEG1 = 3; // 3 Tq
parameter PHASE_SEG2 = 4; // 4 Tq
// 总 Tq = 1+2+3+4 = 10,时钟周期 = 50/10 = 5 ns? 不对:
// 实际需要:位时间 = 1 µs,Tq = 100 ns(10 MHz),系统时钟 50 MHz -&gt; 5 个时钟周期/Tq
// 所以上例应改为:每个 Tq 由 5 个系统时钟组成,总 Tq 数 = 10,位时间 = 50 系统时钟 = 1 µs

协议状态机 (can_protocol)

实现 CAN 2.0B 标准。状态包括 IDLE、ARBITRATION、TRANSMIT、RECEIVE、ERROR 等。仲裁阶段比较 ID 与总线电平,若失权则转为接收。

// 状态机片段(Verilog)
localparam IDLE        = 4'd0;
localparam ARBITRATION = 4'd1;
localparam TRANSMIT    = 4'd2;
localparam RECEIVE     = 4'd3;
localparam ERROR       = 4'd4;

always @(posedge clk or negedge rst_n) begin
    if (!rst_n) state &lt;= IDLE;
    else case (state)
        IDLE: if (tx_request) state &lt;= ARBITRATION;
              else if (rx_start) state &lt;= RECEIVE;
        ARBITRATION: if (lost_arbitration) state &lt;= RECEIVE;
                     else if (arbitration_done) state &lt;= TRANSMIT;
        TRANSMIT: if (tx_done) state &lt;= IDLE;
                  else if (error_detected) state &lt;= ERROR;
        RECEIVE: if (rx_done) state &lt;= IDLE;
                 else if (error_detected) state &lt;= ERROR;
        ERROR: if (error_recovery) state &lt;= IDLE;
        default: state &lt;= IDLE;
    endcase
end

3. 验证结果

仿真通过 100 次随机帧收发,无 CRC 错误与位错误。上板后使用 CAN 分析仪连续发送 1000 帧,FPGA 正确接收并回显,误码率 0%。资源利用率:LUT 约 1100,FF 约 750,BRAM 1 个,满足设计目标。

排障指南

  • 仿真无波形输出:检查时钟与复位时序是否正确,确认 Testbench 中 DUT 实例化是否完整。
  • CRC 错误频繁:验证位填充逻辑是否在连续 5 个相同位后插入反相位,并确认 CRC 计算多项式(x^15 + x^14 + x^10 + x^8 + x^7 + x^4 + x^3 + 1)。
  • 仲裁失败:检查 ID 比较逻辑,确保在仲裁阶段逐位比较总线电平,失权后立即切换为接收状态。
  • 上板后无通信:确认外部 CAN 收发器供电与连接,检查 XDC 引脚约束是否与原理图一致。

扩展建议

  • 支持 CAN-FD:在现有框架上增加数据场长度至 64 字节,并实现 FD 格式的 CRC 与位填充。
  • 集成 AXI-Lite 接口:将寄存器映射至 AXI 总线,便于嵌入式处理器(如 MicroBlaze)配置与控制。
  • 多节点仿真:在 Testbench 中实例化多个 CAN 控制器,模拟总线仲裁与错误恢复场景。
  • 时序优化:若 Fmax 不达标,可对关键路径(如 CRC 计算)插入流水线寄存器。

参考与附录

    CAN 2.0B 协议规范(ISO 11898-1)Xilinx Artix-7 数据手册(DS181)Vivado 设计套件用户指南(UG893)开源 CAN 控制器 IP 参考(如 OpenCores CAN)
标签:
本文原创,作者:二牛学FPGA,其版权均为FPGA线上课程平台|最全栈的FPGA学习平台|FPGA工程师认证培训所有。
如需转载,请注明出处:https://z.shaonianxue.cn/36923.html
二牛学FPGA

二牛学FPGA

初级工程师
这家伙真懒,几个字都不愿写!
56617.33W3.93W3.67W
分享:
成电国芯FPGA赛事课即将上线
基于FPGA的CAN总线控制器设计与实现:从RTL编码到上板调试指南
基于FPGA的CAN总线控制器设计与实现:从RTL编码到上板调试指南上一篇
基于卷积神经网络的图像分类系统 FPGA 设计与实现指南下一篇
基于卷积神经网络的图像分类系统 FPGA 设计与实现指南
相关文章
总数:606
2023大疆-FPGA工程师招聘笔试

2023大疆-FPGA工程师招聘笔试

2023大疆-FPGA工程师招聘笔试。题形分为单选、多选。针对的岗位是中…
技术分享, 面经/招聘
2年前
0
0
592
0
2026芯片职场图鉴:数字IC前端工程师必备哪些硬核技能?

2026芯片职场图鉴:数字IC前端工程师必备哪些硬核技能?

嘿,朋友!你有没有感觉,我们生活的世界正被芯片悄悄重塑?从手机里流畅的A…
技术分享
28天前
0
0
175
0
FPGA仿真验证:使用ModelSim/QuestaSim进行功能仿真与波形调试

FPGA仿真验证:使用ModelSim/QuestaSim进行功能仿真与波形调试

本文档提供基于ModelSim/QuestaSim进行FPGA功能仿真与…
技术分享
13天前
0
0
24
0
评论表单游客 您好,欢迎参与讨论。
加载中…
评论列表
总数:0
FPGA线上课程平台|最全栈的FPGA学习平台|FPGA工程师认证培训
没有相关内容