Quick Start(快速上手)
本指南旨在帮助工程师快速搭建基于FPGA的CAN 2.0B总线控制器,从RTL设计到上板调试。以下为最小启动路径:
- 下载并安装Vivado 2022.2(或更高版本),确认支持目标器件(如Xilinx Artix-7 XC7A35T)。
- 创建新工程,选择器件xc7a35tcsg324-1,添加顶层RTL文件
can_top.v。 - 编写CAN控制器核心模块:位时序逻辑(Bit Timing Logic, BTL)、CAN协议控制器(CRC、仲裁、错误处理)及TX/RX接口。
- 添加测试激励(testbench),模拟CAN总线上的标准帧(数据帧/远程帧)发送与接收。
- 运行行为仿真,观察
CAN_TX、CAN_RX波形,确认符合CAN 2.0B协议时序。 - 综合并实现工程,检查资源利用率(LUT/FF/BRAM)和最大工作频率(Fmax)。
- 生成比特流,下载到FPGA开发板;外接CAN收发器(如TJA1050)与CAN分析仪(如PCAN-USB)。
- 通过串口或JTAG观察回环测试结果:发送ID=0x123、数据=0xAA的帧,确认接收端正确还原。
前置条件与环境
为确保项目顺利实施,推荐以下软硬件环境。下表列出推荐配置及其替代方案:
| 项目 | 推荐值 | 说明 | 替代方案 |
|---|---|---|---|
| FPGA器件 | Xilinx Artix-7 XC7A35T | 低成本、资源适中,适合CAN控制器实现 | XC7Z010 (Zynq)、Cyclone IV (Altera) |
| EDA版本 | Vivado 2022.2 | 支持SystemVerilog 2012,综合优化好 | Vivado 2020.1+、Quartus Prime 20.1+ |
| 仿真器 | Vivado Simulator (xsim) | 集成在Vivado中,无需额外安装 | ModelSim/QuestaSim、Verilator |
| 时钟频率 | 50 MHz(主时钟) | CAN总线位时序需分频,典型位速率1 Mbps | 25 MHz ~ 100 MHz |
| 复位 | 异步低有效复位 | 与大多数FPGA开发板兼容 | 同步复位(需额外逻辑) |
| 接口依赖 | GPIO连接CAN收发器 | TX/RX为单端3.3V,需电平转换(如5V容忍) | 使用开发板自带CAN接口(如Zedboard) |
| 约束文件 | XDC文件 | 时钟周期20 ns,输入输出延迟约束 | SDC (Synopsys Design Constraints) |
目标与验收标准
- 功能点:支持CAN 2.0B标准帧(数据帧和远程帧),位速率可配置(典型值125 kbps ~ 1 Mbps)。
- 时序性能:在50 MHz时钟下,Fmax ≥ 100 MHz(CAN控制器核心逻辑)。
- 资源占用:LUT ≤ 800,FF ≤ 600,BRAM ≤ 2(18Kb块)。
- 验证方式:行为仿真通过至少3种测试用例(正常帧、错误帧、仲裁丢失);上板回环测试连续运行1小时无CRC错误。
- 验收波形:
CAN_TX信号在发送时满足CAN总线显性/隐性电平时序(位时间=10个Tq时,采样点位于70%位时间)。
实施步骤
1. 工程结构与模块划分
推荐模块层次如下,每个模块独立编写,接口使用标准握手信号(valid/ready):
can_top.v (顶层,实例化所有子模块)
├── can_btl.v (位时序逻辑:同步段、传播段、相位段1/2,采样点生成)
├── can_protocol.v (协议控制器:帧解析、CRC计算、仲裁、错误管理)
├── can_tx.v (发送缓冲器与移位寄存器)
├── can_rx.v (接收缓冲器与去抖动逻辑)
├── can_reg.v (配置寄存器:位速率、掩码、中断使能)
└── can_crc.v (CRC-15计算器,多项式0x4599)2. 关键模块实现:位时序逻辑(BTL)
BTL负责将系统时钟分频为CAN位时间(Tq),并生成采样点使能信号。CAN 2.0B要求一个位时间由8~25个Tq组成,采样点位于60%~80%位时间处。以下为can_btl.v的Verilog代码片段:
// can_btl.v 片段:位时间计数器与采样点
reg [4:0] tq_cnt; // Tq 计数器,范围0~24
reg [4:0] sample_point; // 采样点位置(可配置)
wire sample_en;
always @(posedge clk or negedge rst_n) begin
if (!rst_n) tq_cnt <= 0;
else if (tq_cnt == (TQ_PER_BIT - 1)) tq_cnt <= 0;
else tq_cnt <= tq_cnt + 1;
end
assign sample_en = (tq_cnt == sample_point);3. 协议控制器实现:帧解析与CRC
协议控制器can_protocol.v负责帧解析、CRC计算、仲裁和错误管理。CRC-15计算器can_crc.v使用多项式0x4599,采用并行计算以降低延迟。仲裁逻辑基于CAN总线“线与”特性:当发送位与接收位不一致时,检测到仲裁丢失并切换为接收模式。
4. 综合与实现
在Vivado中运行综合(Synthesis)和实现(Implementation),检查资源利用率与Fmax。使用XDC约束文件确保时序收敛,关键路径通常位于CRC计算逻辑。若Fmax不达标,可考虑流水线优化或降低组合逻辑深度。
验证结果
验证分为仿真验证与上板验证两个阶段:
- 仿真验证:使用Vivado Simulator运行测试激励,覆盖正常帧发送/接收、错误帧注入(如CRC错误、填充错误)、仲裁丢失场景。波形分析确认CAN_TX和CAN_RX满足协议时序。
- 上板验证:将比特流下载至FPGA开发板,外接TJA1050收发器与PCAN-USB分析仪。回环测试发送ID=0x123、数据=0xAA的帧,连续运行1小时无CRC错误。
排障指南
- 仿真波形异常:检查位时序配置(TQ_PER_BIT和sample_point)是否正确,确保采样点位于位时间的60%~80%。
- 上板无响应:确认CAN收发器供电与电平转换正常,检查TX/RX引脚连接极性。
- CRC错误频繁:验证CRC-15多项式实现是否正确(0x4599),检查位填充逻辑是否在连续5个相同位后插入反相位。
- Fmax不达标:优化CRC计算为流水线结构,减少组合逻辑级数;调整时钟约束或使用多周期路径。
扩展建议
- 支持CAN FD:在现有架构基础上扩展数据段长度(最多64字节)和更高速率(如5 Mbps),需修改位时序和CRC算法。
- 多节点仲裁:添加多路CAN控制器实例,通过内部总线仲裁实现多通道通信。
- 集成Avalon/AXI总线:将CAN控制器封装为Avalon或AXI从设备,便于嵌入SoC系统。
参考资源
- CAN 2.0B协议规范(ISO 11898-1)
- Xilinx Vivado用户指南(UG973)
- TJA1050数据手册(NXP)
- PCAN-USB用户手册(PEAK-System)
附录
附录A:测试用例列表
| 测试用例 | 描述 | 预期结果 |
|---|---|---|
| 正常帧发送/接收 | 发送ID=0x123、数据=0xAA的标准数据帧 | 接收端正确还原ID和数据 |
| 错误帧注入 | 在发送过程中强制CRC错误 | 接收端检测到错误并发送错误帧 |
| 仲裁丢失 | 两个节点同时发送不同ID的帧 | 高优先级ID获胜,低优先级节点转为接收 |
附录B:XDC约束示例
create_clock -period 20.000 -name sys_clk [get_ports clk]
set_input_delay -clock sys_clk -max 5.0 [get_ports CAN_RX]
set_output_delay -clock sys_clk -max 5.0 [get_ports CAN_TX]


