基于FPGA的CAN总线通信节点设计
FPGA顶层的模块设计如图5所示。其中clkdiv模块是将输入的50MHz时钟clock十分频后作为模块基准时钟。SJACTROL模块是控制总线通信的主模块,而RW模块则是根据主模块的信号生成SJA1000所需要的读写时序信号。SJACTROL模块通过start和iswr两个信号通知RW模块是否要进行读或写总线操作。若是写操作,则将地址和数据通过Addrout和Dataout传递给RW,RW将负责把数据准确地送到SJA1000的数据地址复用总线ADDR,并驱动SJA1000接收数据,在写操作完成后发送writeover信号通知SJACTROL写操作完成。读操作时RW根据SJACTOL送来的地址,从SJA1000的数据总线上读取数据,并将得到的数据通过Datasave总线返回给SJACTROL。

图5顶层模块设计
SJACTROL的状态机通过5个状态的转换来实现控制:空闲状态、初始化状态、查询状态、读状态、写状态。RW则是按照SJA1000的芯片数据手册进行时序逻辑设计。在编写模块时,需注意双向总线的编写技巧。双向口最好在顶层定义,否则模块综合的时候容易出错。
3仿真结果
FPGA中利用Verilog编程产生SJA1000的片选信号CS,地址锁存信号ALE,读写信号RD、WR。这些控制信号共同驱动SJA1000进行数据接收和发送。设计选取的是virtex系列的芯片,逻辑开发在ISE平台上进行。在FPGA的调试阶段,使用xilinx的应用软件ChipScopepro(在线逻辑分析仪)来在线观察FPGA设计内部信号的波形,它比传统的逻辑分析仪更方便。图6为在线进行数据传送接收时的实际波形。

图6SJA1000接收和发送数据的时序仿真
4结束语
通过对CAN通信系统的分析,利用FPGA作为CAN通信节点的主控制单元,对CAN节点的硬件接口电路设计方案进行了详细的说明,并编写了CAN节点通信流程中的初始化程序、数据发送接收程序。通过软硬件的联调,实现了CAN总线的通信功能,系统工作状态良好。实践证明CAN通信节点采用FPGA作为核心控制单元,与传统的单片机设计相比,更加灵活并且扩展性更强。
评论