首页 > 编程知识 正文

canopen协议,can配置跑到硬件故障

时间:2023-05-06 06:19:17 阅读:39989 作者:2891

摘要针对CAN协议中提出的串行CRC检测原理,给出了其硬件实现方法和具体实现时需要注意的技术问题,给出了RTL级VHDL代码。 为了提高CRC编码的生成速度和CRC校验效率,介绍了CRC校验的并行原理,推导了CAN协议中CRC编码生成多项式的8位并行CRC编码逻辑关系式。 最后对串行和并行两种实现方式进行了性能比较,给出了进行CRC编码以满足CAN协议时应注意的问题。

关键字CAN协议; CRC检查; 串行; 并行的

1引言

通信系统总线在传输信息时,受到各种干扰的影响,在传输信息时不可避免地发生错误。 在CAN协议中,为了保证帧传输的可靠性和高的检错效率,采用了比特差错、填充差错、CRC差错、格式差错和响应差错检测方案。 通过以上错误检测方式,无法在损伤报文中检测到其损伤的概率为报文损伤率*4.7*10-11,因此CAN总线的极高错误检测率,目前广泛应用于工业控制、通信、汽车、军事等多个领域CRC校验是CAN协议中一种重要高效的检错方案,其生成多项式可以进行7级校验,具有编码简单、误判率低的优点。

2 CRC检测原理

CAN协议规定,必须对由帧开头、仲裁字段、控制字段和数据字段(如果存在)构成的填充比特流进行CRC编码。 具体地说,被除法多项式的系数由帧开头、仲裁字段、控制字段、数据字段(如果存在)和15比特(如果存在)最低系数) 0构成的未填充比特流给出,生成多项式由被除多项式除以生成多项式(系数用类型-2计算)作为发送到总线的CRC序列的发送节点和接收节点的CAN控制器用相同的方法生成CRC校验码,与发送节点发送的CRC校验码比较,消息是否出错

3 CRC校验码电路的硬件实现

CRC校验码在硬件上的实现可以采用串行和并行两种实现方式。 在串行方案中,每一位输入要编码的位流,在位流输入完成后生成校验码,并且校验码跟随要校验的位流发出或接收。 由于应该并行方式检查的比特流每k位输入到校验码生成电路,所以校验码的生成效率大大高于串行方式。 以下,对CAN协议中的CRC检查的生成多项式进行说明。

3.1 CRC校验码的串行实现

在CAN协议中,CRC码是15位,需要用15位移位寄存器来实现,移位寄存器c0c1c2……c12c13c14在CRC校验码的生成过程中注册CRC校验码的中间值,计算完成后,该值与最终的CRC校验码将c(t )=[c0c1c2……c12c13c14]设为时刻t的移位寄存器的状态,将复位时的初始状态设为c(0)=[ 000……000]。 移位寄存器的状态转移方程如下。

c(t1 ) ([ c0c1c 2……c12c 13 ] * [0| i14 ]C14dst ) g

=[ c0c1c 2……c12c 13 ] * [0| i14 ]C14 * gdst * g

=[c0c1c2……c12c13c14]*Adst*g

=c(t ) a (dst ) g

在上式中,I14表示14阶单位矩阵,dst表示串行输入数据,表示异或,并且g=[g0g1……g13g14]表示用于生成多项式的系数矩阵,以及a表示n阶矩阵。

通过以上的CRC校验码的状态变换方程式实现的RTL级的VHDL代码如下。

c=dsxorc(14;

if(rst='0' ) then

c=(others='0' );

elsif(rising_edge ) clk ) ) then

if(en_transmit='0' ) then

c=(others='0' );

elsif (en _ CRC _ code='1' andf _ ds='1' andf _ ds _ sync='0' ) then

if(c='1' ) then

c(14downto1)=c ) 13downto0) xor '10001011001100 ';

c(0)='1);

else

c (14下传to1)=c ) 13下传to 0;

c(0)='0);

结束If;

结束If;

结束If;

在上述代码中,rst是外部复位信号,en_transmit是帧发送使能信号,en_crc_code是CRC码使能信号,ds是输入串行数据,f_ds与ds同时有效,f

应注意,信号en_crc_code的发送分支和接收分支中必须包括要编码的比特流的填充和取消填充信息。 也就是说,不编码填充位。

3.2 CRC校验码的并行实现

CRC校验码的并行实现方式在CAN协议中并未示出,但并行实现方式具有较高的校验码生成效率,需要采用,现给出其实现方法

。其状态转移方程可表示为:

式中,c为15位移位寄存器,复位时各位均为0,在检验码生成过程中,寄存CRC检验码的中间值,其值每输入k位数据变化一次,编码完成后输出最终的检验码,c(t)和c(t+k)分别为c在t时刻及t+k时刻的状态,实际应用中c(t+k)表示紧随c(t)状态的并行k位数据输入后的状态,k 为并行宽度,此处取8,dp为k位并行输入数据,A即为3.1节所述方阵,

,其中的G亦为3.1节所述的生成多项式的系数行矩阵。矩阵运算过程中,  需注意的是:矩阵乘积的结果需进行模2处理,即奇数用1代替,偶数以0代替。由此得到基于CAN协议中生成多项式的8位并行CRC检验码逻辑表,如表1所示。寄存器每位的表示如c6= c9⊕c13⊕dp2⊕dp6。在实际编码中,需添加一些控制信号,如异步复位信号、编码同步清零信号、编码同步使能信号等。

表1  8位并行CRC检验码逻辑表

c(t+k)

c(t)、dp

c0

c7 c8 c9 c10c11 c13 c14 dp0 dp1 dp2 dp3 dp4 dp6 dp7

c1

c8 c9 c10 c11 c12 c14 dp1dp2 dp3 dp4 dp5dp7

c2

c9 c10 c11 c12 c13 dp2 dp3 dp4 dp5dp6

c3

c7c8 c9 c12 dp0 dp1dp2 dp4

c4

c7 c11c14 dp4 dp7dp10

c5

c8 c12 dp1dp5

c6

c9 c13 dp2 dp6

c7

c7 c8 c9 c11 c13dp0 dp1dp2dp4dp5

c8

c0 c7 c11 c12 c13dp0 dp4 dp5dp6

c9

c1 c8 c12 c13 c14 dp1 dp5 dp6 dp7

c10

c2c7 c8 c10 c11 dp0 dp1dp3 dp4

c11

c3 c8 c9 c11 c12 dp1 dp2dp4 dp5

c12

c4 c9 c10 c12 c13 dp6 dp2 dp3dp5

c13

c5 c10 c11 c13 c14dp3 dp4 dp6 dp7

c14

c6 c7 c8 c9 c10 c12 c13 dp0 dp1 dp2 dp3 dp5 dp7

3.3 性能对比

用VHDL语言对两种CRC检验码生成方法实现编码后,利用Model Technology公司的仿真软件ModelSim SE PLUS 5.6a进行了功能仿真以验证原理及编码的正确性。又利用Exemplar Logic公司的综合工具LeonardoSpectrum对两种代码分别进行了综合,综合过程中FPGA芯片选取Xinlinx公司的 2s200pq208,速度等级为5级,优化采取自动优化方式,结果如表2所示:

表2  串行和并行CRC编码性能对比

Area (LUTs)

Delay (ns)

DFFs

Clock (MHz)

并行方式

35

8

15

119.6

串行方式

8

6

15

160.9

由上表可以计算出,两种实现方式的速度比为119.6*k/160.9=119.6*8/160.9=5.95,消耗硬件资源比为4.375,时间延迟比为1.33,因而二者性能有很大的差异。

4结论

由以上讨论可以看出:采用串行实现方法、原理和电路结构简单,消耗硬件资源少,可以工作在较高的时钟频率下;采用并行实现方法、原理和实现电路复杂,消耗硬件资源多,工作频率虽然低于串行方式,但生成CRC检验码的速度(指效率)大大高于串行方式。因而,串行实现方法适合于硬件资源紧缺,检验码生成速度要求不高的场合;而并行实现方法适用于硬件资源丰富,检验码生成速度要求较高的场合。

在实际设计中,采用哪一种CRC检验方式,还需要考虑收发帧的需填充位流的结构。为了满足CAN协议的规定要求(即需检验帧起始位,仲裁场、控制场和数据场(若存在的话)组成的未经填充的位流,位流总长度为整数字节多一位),发送支路采用串行方式,可完全按照协议要求生成CRC检验码,接收支路由于多了 15位CRC检验码(外加帧起始位恰好为2个字节),可采用8位并行方式实现CRC检验。

参考文献:

1  BOSCH CAN Specification version 2.0

2  brdgs,戴光明. ATM协议处理中CRC的并行实现. 湖南城市学院学报,(自然科学版)

第13卷,第4期 2004年12月:68~69

3 dqdz, 顾新 .VHDL硬件描述语言与数字逻辑电路设计. 西安电子科技大学出版社

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。