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信号脉冲返回

三、初始化流程

  1. 上电复位
    系统时钟稳定后,PLL locked信号同步到100 MHz域,生成1 ms宽脉冲的sysrstn。此时canrstn保持低电平,MCP2515硬件复位引脚被强制拉低。
  1. SPI接口唤醒
    canrstn释放后,spitimingctrl_3模块开始工作;其内部10 µs定时器保证片选建立时间,随后进入IDLE态等待上层命令。
  1. 寄存器批量配置
    mcp2515init状态机按ROM地址0→16顺序取出预置值,依次写入CNF1/2/3、TXRTSCTRL、RXB0CTRL、滤波器屏蔽器等寄存器;最后切回Normal模式,initdone置位。
  1. 中断标志清除
    初始化末尾主动读一次RXB0CTRL,把可能上电置位的RX0IF清掉,防止误触发接收引擎。

四、接收流程(查询式)

  1. 接收引擎持续查询RX0IF(寄存器0x2C bit0)。
  2. 一旦置位,进入读数据序列:
    0x61→0x62→0x63→0x64→0x65→0x66…0x6D,共13字节,分别对应ID高/低、IDE、RTR、DLC、Data0-7。
  3. 读完最后字节,回写0x2C把RX0IF清零,同时拉高receive_done一个时钟,通知顶层“帧已就绪”。
  4. 顶层收到receive_done后,把同一帧内容原封不动提交给发送引擎,实现“环回”验证。

五、发送流程(触发式)

  1. 发送引擎等待sendrequestack=1,表示接收侧已准备好数据。
  2. 查询TXB0CTRL bit4(TXREQ),=0表示发送缓冲区空。
  3. 顺序写TXB0SIDH、TXB0SIDL、TXB0EID8、TXB0EID0、TXB0DLC、TXB0D0…D7。
  4. 拉低TX0RTS引脚≥100时钟(物理层要求),再拉高,激活CAN控制器发送。
  5. 等待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。

九、移植指南

  1. 平台差异
    - Altera:PLL使用altpll,输出c0=100 M、c1=100 M(-90°)、c2=16 M。
    - Xilinx:改用clk_wiz,同等输出,锁相环参数已封装在tcl脚本,一键生成。
  1. 引脚复用
    顶层仅9个IO:clk、rstn、spi*、canosc1、canrst_n、TX0RTS。其余引脚可自由分配,适配任意144pin以下封装。
  1. 时钟频率调整
    若外部晶振非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通信底座。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐