用AI编程已经变成主流,可想而知用AI来开发FPGA应用也不再是难事,不就是Verilog么,比开发互联网似乎还要简单一些。正好前一阵子有客户咨询用FPGA逻辑开发CAN 2.0 IP的案例,我试着用AI做了一下,2分钟就出了结果,不管是不是真的靠谱能用,这个效果是真的炸裂。我:可以用Verilog写一段CAN接口的FPGA IP吗?

AI:我可以为你提供一个完整的 CAN 2.0B 控制器 FPGA IP 的 Verilog 实现。这个设计包含位定时、收发状态机、CRC校验、验收滤波器和 APB 寄存器接口。
1. 分层结构
– 物理层接口: `can_tx` / `can_rx`(开漏/推挽,dominant=0, recessive=1)
– 位定时单元 (BTU): 实现同步段、传播段、相位缓冲段的精确时序控制
– 协议控制器: 处理帧格式、位填充/解填充、CRC、ACK 应答
– FIFO 缓冲: TX/RX 独立 FIFO(深度可配置)
– 验收滤波器: 29-bit ID 掩码过滤(支持标准和扩展帧)
2. 关键特性
– CAN 2.0B 协议: 支持标准帧(11-bit ID) 和扩展帧(29-bit ID)
– 位填充: 自动插入/删除填充位(5个连续相同位后翻转)
– CRC-15: 硬件 CRC 校验生成与验证
– 错误处理: 实现位错误、填充错误、CRC错误、格式错误、ACK错误检测,含 TEC/REC 计数器及 Bus-Off 状态
– 同步机制: 硬同步(SOF)+ 重同步(相位误差调整)
3. 寄存器接口 (APB4)
| 地址 | 寄存器 | 功能 |
|——|——–|——|
| 0x00 | CTRL | 复位、回环模式、静默模式 |
| 0x08 | BITTIME | 波特率预分频、时间段配置 |
| 0x14 | ACR0 | 验收码寄存器 |
| 0x18 | AMR0 | 验收掩码寄存器(1=忽略) |
| 0x20 | TX_DATA | 发送数据端口(写入FIFO) |
| 0x30 | RX_DATA | 接收数据端口(读取FIFO) |
| 0x40 | ERR_CNT | 发送/接收错误计数器 |
4. 使用示例(Verilog)
// 实例化并配置为 500Kbps @ 50MHzcan_controller ( .TX_FIFO_DEPTH(16), .RX_FIFO_DEPTH(32)) can_inst ( .clk (clk_50m), .rst_n (rst_n), .can_tx (can_tx), .can_rx (can_rx), // … APB 接口连接 …);// 配置寄存器(软件通过 APB 总线)// BRP = 4, TSEG1 = 6, TSEG2 = 3 → 50MHz/(5(1+6+3)) = 1Mbps
5. 综合与部署建议
– 时钟域: 系统时钟需 > 2× CAN 位速率(建议 8× 以上用于过采样)
– 物理层: 需外接 CAN 收发器(如 TJA1051)将单端信号转为差分 CAN_H/CAN_L
– 资源占用: 约 1.5K LUT + 2.5KB RAM(取决于 FIFO 深度)
– 时序: 关键路径在位定时计数器,建议约束到系统时钟的 10ns 以内
接下来我又让AI补充了用于Intel Altera的约束文件,结果也很快,这里就不贴了。FPGA开发的高门槛和难度,似乎已经完全不存在了。
本文来源于微信公众号:土人观芯