基于FPGA的CAN总线控制器设计
扫描二维码
随时随地手机看文章
摘要:使用Verilog HDL硬件描述语言完成了对CAN总线控制器的设计,能够实现符合CAN2.0A协议的所有功能。本总线控制器的外部接口采用Altera公司开发的Avalon总线接口,增强了控制器的应用灵活性。本设计使用Modelsim软件完成了功能仿真和时序仿真。
关键词:CAN总线;控制器;现场可编程门阵列
0 引言
CAN(控制器局域网)是一种先进的串行通信协议,由德国BOSCH公司开发,并最终成为国际标准(ISO11898),是国际上使用最广泛的现场总线之一。目前世界上已有20多家CAN总线控制器生产商,110多种CAN总线控制器芯片和集成CAN总线控制器的微处理器芯片。
由于定制的CAN总线控制器芯片不能嵌入到SoC(片上系统)中,而采用分立元器件实现CAN总线接口,使得系统中器件数量增加,同时也增大了系统面积,本文所介绍的CAN总线控制器正是由Verilog HDL语言描述,既可以作为一个独立的设备,也可以作为一个模块集成到FPGA中。
虽然目前国内外已有很多人研究或设计了CAN总线控制器IP核,但其中大多数只是对控制器中的某一个模块进行了研究和设计,并没有实现一个完整的CAN总线控制器的功能,例如文献只对CAN控制器的状态机进行研究,文献只对CAN控制器的位定时模块进行研究。而完整实现了CAN总线控制器功能的作品中,最高工作频率又不是很理想,例如Mentor Graphics公司提供的MCAN2D1 CAN2.0 Network Controller的最高工作频率只有32.46MHz,文献中介绍的CAN总线控制器的最高工作频率也只有50MHz,这些IP核显然不能适应高速环境的要求,同时文献中介绍的控制器对外接口中出现了寄存器使能位等接口,这种接口不符合Avalon总线规范,不利于集成到FPGA芯片中,其通用性肯定较差,所以研究并设计出一款高速且通用性强的CAN总线控制器的IP核仍然是有其重要意义的。
1 系统实现
1.1 系统框图
本设计中将整个CAN控制器系统分为了11个模块,分别是Avalon总线接口模块、寄存器组模块、接收缓冲器模块、发送缓冲器模块、接收滤波模块、CRC校验模块、状态机模块、标识符填充模块、错误计数器模块、位填充模块、位定时模块。其结构框图如图1所示。
1.2 主要模块介绍
1.2.1 寄存器组模块
本模块由位宽为8bit,深度为256的寄存器组实现其功能,其中已经使用的寄存器为23个,其余的供以后扩展。本设计采用将各个独立的控制及状态寄存器集成在一起的设计思想,任何对控制器的初始化以及数据的接收和发送都是从写寄存器组开始的。
1.2.2 CRC校验模块
CRC(循环冗余校验码)是一种能力非常强的检错、纠错码,常用于串行传送的辅助存储器与主机的数据通信和计算机网络中。它的基本原理是:在k位信息码后再拼接r位的校验码,整个编码长度为n位,因此,这种编码又叫(n,k)码。对于一个给定的(n,k)码,可以证明存在一个最高次幂位n-k=r的多项式g(x),根据g(x)可以生成七位信息的校验码,而g(x)叫做这个CRC码的生成多项式。
CAN总线协议就是采用的CRC校验,并且是16位的C R C-1 6校验码, 生成多项式为,可转换为二进制码组1100010110011001。生成CRC码的具体过程是:由帧起始、仲裁场、控制场、数据场(数据帧有数据场,远程帧没有数据场)组成的被除数右移15位后与生成多项式的二进制码组进行模2除,生成的15位余数就是所需的CRC码。
本模块的主要作用有两个:1)在控制器处于发送状态时,计算出CRC码,同时将帧起始、仲裁场、控制场、(数据场)、CRO场按帧格式的要求进行打包;2)在控制器处于接收状态时,将接收到的由帧起始、仲裁场、控制场、(数据场)、CRC场组成的被除数与生成多项式的二进制码组进行模2除,结果为0,则接受数据,不为0,则丢弃数据,并产生CRC校验错误。
1.2.3 立填充模块
在CAN总线协议中,当控制器处于发送或接收状态时,若控制器检测到总线上出现连续6个相同极性的电平时(帧结尾除外),控制器将会检测到错误而停止发送或接收数据,此时控制器将会由发送或接收状态转换为错误状态。
本模块的主要作用是:在发送状态时,连续发送5个相同极性的位时,若第5位与将要发送的第6位极性不同时,在第5位和第6位之间插入1个极性与第6位相同的位,若第5位与将要发送的第6位极性相同,在第5位和第6位之间插入1个极性与第6位相反的位;在接收状态时,连续接收5个相同极性的位时,若第6位与之前5位的极性不同,则舍弃第6位,若第6位与之前5位的极性相同,则产生位填充错误,控制器将停止接收数据,此时控制器也将由接收状态转换为错误状态。同时,本模块也具有检测位错误,位填充错误,形式错误及应答错误的功能。另外,模块还具有生成错误帧、过载帧、间歇帧的功能。
1.2.4 状态机模块
状态机模块在整个控制器中扮演着“大脑”的作用,它控制着其它模块的操作。相比于文献中未采用状态机的设计,采用状态机会使得各个模块的功能作用更为明确,系统结构更为清晰合理,同时也更便于各个模块之间的协调控制。本状态机模块的设计采用和文献中相同的设计,将控制器分为了10种模式:总线脱离、总线启动、总线空闲、模式选择、发送模式、接收模式、错误模式、间歇模式、超载模式及挂起模式。CAN状态机状态转移图如图2所示。
掉电、复位及总线上过多的错误都会使控制器进入总线脱离模式;系统上电、复位解除或过多错误而复位后的下个时钟会使控制器进入总线启动模式;在总线启动模式下,若之前因掉电、复位使控制器进入总线脱离模式,当控制器监测到总线上1次连续11个隐性位(逻辑电平1”)时,控制器进入总线空闲状态,若因过多错误使控制器进入总线脱离模式,则当控制器监测到总线上128次连续11个隐性位时,控制器进入总线空闲模式;当控制器没有数据发送但监测到总线上有显性位(逻辑电平“0”)时,控制器进入接收模式,而当控制器有数据发送同时监测到总线上有显性位时,控制器进入模式选择模式;模式选择其实就是一个总线仲裁,此时标识符将扮演仲裁位的角色,显性位的优先级更高,若总线仲裁失败则控制器进入接收模式,仲裁成功则进入发送模式;一帧数据成功发送完成后,控制器会进入间歇模式;若间歇帧发送成功,则控制器会再次进入总线空闲模式。状态机由空闲模式转换为模式选择模式的仿真图如图3所示。
1.2.5 位定时模块
位定时模块控制着控制器报文发送或接收的节奏,这个节奏就是位时间,它由四部分组成:同步段、传播段、相位缓冲段1和相位缓冲段2,这四个段均由时间份额构成,时间份额是根据预先设置的分频值对输入时钟进行分频得到的。
位定时模块还有一个重要的功能是将本节点与总线上的其它节点进行时钟同步。由于每个CAN节点使用的是独立的时钟,所以不同节点之间会有相位差,这些相位差严重时会影响报文发送和接收的准确性,所以有必要对不同节点进行时钟同步。
2 系统验证
整个系统的功能仿真和时序仿真是借助Modelsim软件完成的。图4所示是对控制器发送数据的验证,测试用的发送数据为随意选择的:00101001,仲裁场和控制场也是任选的,分别为:110100101110、110001,设置好寄存器组后,控制器计算出对应的CRC码为:110111001111 011,之后控制器将数据按CAN协议的帧格式打包逐位发送出去。
控制器最初处于总线脱离模式,复位结束后进入总线启动模式,当控制器检测到总线上的1次连续11个隐性位时,进入总线空闲模式,接着当控制器检测到总线出现第一个显性位时,进入模式选择模式,在此模式下,控制器进行的操作就是总线仲裁,确定本节点是否获得总线控制权,由于本测试采用的是控制器自测模式,即输出线与输入线连在一起,所以仲裁时间为12个位时间,仲裁成功后,控制器会进入发送模式,若无错误产生,数据发送完成后控制器进入间歇模式,最后进入总线空闲模式。
经过一系列的测试验证后,表明本CAN总线控制器能够发送或接收所有符合CAN2.0A协议的报文帧。
3 结束语
本设计实现了所有符合CAN2.0A协议的CAN总线控制器功能,最高工作频率为139.43MHz,这也达到了最初的设计目的。控制器的时序分析如图5所示。
本文作者创新点为:首先控制器的外围接口采用Avalon总线接口,这使得本设计的通用性更强:其次是本设计的最高工作频率达到了139.43MHz,能够适应高速通信的要求。