FPGA verilog can mcp2515 altera xilinx工程 代码 程序
本文基于Altera/Xilinx双平台工程,阐述一套以FPGA为SPI主设备、MCP2515为CAN协议控制器的完整通信链路方案。设计采用纯Verilog实现,时钟域隔离、参数化波特率、扩展/标准帧自适应收发,并配套RTL仿真脚本,可一键跑通ModelSim/QuestaSim。重点放在“FPGA如何以最小CPU干预完成CAN报文透明转发”这一核心诉求,兼顾可移植性与可扩展性。
FPGA verilog can mcp2515 altera xilinx工程 代码 程序 ...altera、xilinx工程 均提供 ...标准帧、扩展帧 均提供 ...提供仿真激励文件testbench 资料包清单: 1.程序:altera/xilinx工程代码、Verilog/testbench均提供。 代码均在电路板验证 2.说明书 3.quartus ii 13.0:软件安装包 注1:工程均带有激励testbench,软件安装好之后,仿真路径设置之后,打开,点击RTL Simulation即可开始仿真 注2:所有代码均为纯Verilog(PLL除外) 注3:给出testbench代码,并且已经在电路板中验证过。
一、概述
本文基于Altera/Xilinx双平台工程,阐述一套以FPGA为SPI主设备、MCP2515为CAN协议控制器的完整通信链路方案。设计采用纯Verilog实现,时钟域隔离、参数化波特率、扩展/标准帧自适应收发,并配套RTL仿真脚本,可一键跑通ModelSim/QuestaSim。重点放在“FPGA如何以最小CPU干预完成CAN报文透明转发”这一核心诉求,兼顾可移植性与可扩展性。
二、系统架构
2.1 顶层数据流
用户时钟24 MHz ──► 片上PLL ──► 100 MHz系统时钟
│
▼
┌-------------------------------┐
│ MCP2515_SPI_III_top │
│ (顶层调度+跨时钟域复位同步) │
└-----------┬-------------------┘
│ 32-bit配置总线
▼
┌-------------------------------┐
│ spi_timing_ctrl_3 │
│ (SPI-CPOL=0/CPHA=0主控时序) │
└-----------┬-------------------┘
│ 8-bit MOSI/MISO
▼
MCP2515芯片
│
▼
CANH/CANL总线
2.2 关键模块划分
| 模块名 | 职责 | 设计要点 |
|---|---|---|
| systemctrlpll | 时钟/复位产生 | 上电延时1 ms,锁相环locked后释放异步复位;提供100 M/90°/16 M多路时钟 |
| mcp2515_init | 寄存器初始化 | 基于ROM查表,17条配置命令顺序下发;完成后拉高init_done |
| mcp2515_receive | 接收引擎 | 查询RXB0中断标志,自动读取ID+DLC+Data,清中断标志;帧类型位宽可参数化 |
| mcp2515_send | 发送引擎 | 等待TXB0空,写ID+DLC+Data,拉低TX0RTS 100个时钟再拉高,完成发送 |
| spitimingctrl_3 | 低层SPI时序 | 1 MHz SCK,24-bit指令帧(命令+地址+数据),读写共用;busy信号脉冲返回 |
三、初始化流程
- 上电复位
系统时钟稳定后,PLL locked信号同步到100 MHz域,生成1 ms宽脉冲的sysrstn。此时canrstn保持低电平,MCP2515硬件复位引脚被强制拉低。
- SPI接口唤醒
canrstn释放后,spitimingctrl_3模块开始工作;其内部10 µs定时器保证片选建立时间,随后进入IDLE态等待上层命令。
- 寄存器批量配置
mcp2515init状态机按ROM地址0→16顺序取出预置值,依次写入CNF1/2/3、TXRTSCTRL、RXB0CTRL、滤波器屏蔽器等寄存器;最后切回Normal模式,initdone置位。
- 中断标志清除
初始化末尾主动读一次RXB0CTRL,把可能上电置位的RX0IF清掉,防止误触发接收引擎。
四、接收流程(查询式)
- 接收引擎持续查询RX0IF(寄存器0x2C bit0)。
- 一旦置位,进入读数据序列:
0x61→0x62→0x63→0x64→0x65→0x66…0x6D,共13字节,分别对应ID高/低、IDE、RTR、DLC、Data0-7。 - 读完最后字节,回写0x2C把RX0IF清零,同时拉高receive_done一个时钟,通知顶层“帧已就绪”。
- 顶层收到receive_done后,把同一帧内容原封不动提交给发送引擎,实现“环回”验证。
五、发送流程(触发式)
- 发送引擎等待sendrequestack=1,表示接收侧已准备好数据。
- 查询TXB0CTRL bit4(TXREQ),=0表示发送缓冲区空。
- 顺序写TXB0SIDH、TXB0SIDL、TXB0EID8、TXB0EID0、TXB0DLC、TXB0D0…D7。
- 拉低TX0RTS引脚≥100时钟(物理层要求),再拉高,激活CAN控制器发送。
- 等待TXREQ由1→0,置位send_done,状态机回到IDLE。
六、波特率与滤波器配置
- 采用16 MHz晶振时,CNF1/2/3寄存器已预置500 kbps参数(Tq=125 ns,SJW=1,PropSeg=1,PS1=8,PS2=8)。
- 如需切换波特率,仅需替换Mcp2515_Params.h内宏定义,重新编译即可,无需动RTL。
- 验收滤波器默认全开(RXM0=0x00),方便调试;量产可改为只接收特定ID段,降低FPGA负载。
七、时钟域与跨域握手
- 100 MHz主时钟域:init、receive、send、SPI时序。
- 24 MHz时钟域:仅用于can_osc1输出给MCP2515作外部时钟源。
- 复位同步:异步复位同步释放,采用二级DFF,确保canrstn在100 MHz域释放时满足Recovery/Removal。
- SPI-busy信号(config_end)为单时钟脉冲,直接驱动各引擎状态机,无跨域风险。
八、仿真与验证
- testbench在接收done事件后,立即把recid/recdata*赋给send侧,形成闭环;串口打印“SIMULATION PASSED”即表明环路正确。
- 支持两种仿真模式:
- 行为级:spitimingctrl_3内部SPI时钟1 MHz,跑500 µs即可看到完整帧。
- 时序级:采用Quartus/ISE生成的SDF,反标后检查建立/保持时间,确保在100 MHz下余量>0.5 ns。
九、移植指南
- 平台差异
- Altera:PLL使用altpll,输出c0=100 M、c1=100 M(-90°)、c2=16 M。
- Xilinx:改用clk_wiz,同等输出,锁相环参数已封装在tcl脚本,一键生成。
- 引脚复用
顶层仅9个IO:clk、rstn、spi*、canosc1、canrst_n、TX0RTS。其余引脚可自由分配,适配任意144pin以下封装。
- 时钟频率调整
若外部晶振非24 MHz,仅需修改PLL倍/分频系数;spitimingctrl3内SPIFREQ参数同步改为系统时钟/SPI时钟即可。
十、性能指标
- 单帧接收→发送延迟:≤ 180 µs(500 kbps,8字节数据,含SPI读写+寄存器解析)。
- 最大连续帧率:约 3 000 fps(8字节,无滤波,FPGA 100 MHz)。
- 资源占用:Cyclone IV EP4CE10 < 800 LE;Spartan-6 XC6SLX9 < 350 Slice。
十一、可扩展方向
- 升级为中断驱动:将MCP2515的/INT引脚接入FPGA,减少查询功耗。
- 增加发送队列:片内例化异步FIFO,CPU通过Avalon/AXI-Lite写入,实现突发发送。
- 支持CAN-FD:换用MCP2517FD,SPI时钟提至20 MHz,数据段速率可达8 Mbps。
- 双CAN冗余:例化两套本IP,共用100 MHz时钟,实现冗余通道热备份。
十二、结论
该框架以“纯硬件状态机”方式完成CAN控制器管理,无需嵌入式CPU介入,具备低延迟、高确定、易移植的特点。通过预留的寄存器接口,用户可在上层快速叠加自定义逻辑(如报文过滤、时间戳、故障注入),是工业控制、车载网关、实时数据采集等场景的理想CAN通信底座。

更多推荐



所有评论(0)