摘要 针对CAN协议中提出的串行CRC检验原理,给出其硬件实现方法及具体实现时应需注意的技术问题,给出了RTL级的VHDL代码。为了提高CRC编码的生成速度和CRC检验的效率,介绍了CRC检验的并行原理,并针对CAN协议中CRC编码的生成多项式推导出了8位并行CRC编码的逻辑关系式。最后对串行和并行两种实现方式进行了性能对比,并给出了为满足CAN协议而进行CRC编码时应注意的问题。
关键词 CAN协议;CRC检验;串行;并行
1 引言
通信系统总线在传输信息时,不可避免要受到各种干扰的影响,使得传输信息出错。CAN协议中,为了保证帧传输的可靠性和较高的检错效率,其采用了以下几种检错方式:位错误、填充错误、CRC错误、格式错误及应答错误检测。通过以上检错方式,它对于受损报文检测不到其受损的概率为:报文受损率*4.7*10-11,因而CAN总线极高的检错率使得它目前被广泛应用到工业控制、通信、汽车甚至军事等多个领域。CRC检验作为CAN协议中一种重要的且行之有效的检错方式,它的生成多项式可以检验7级,具有编码简单且误判率低的优点。
2 CRC检验原理
CAN协议中规定,需要对帧起始、仲裁场、控制场和数据场(若存在的话)组成的未经填充的位流进行CRC编码。具体实现方法为:被除多项式的系数由帧起始、仲裁场、控制场、数据场(若存在的话)及15位(最低系数)0组成的未经填充的位流给定,而生成多项式为X15+X14+X10+X8+X7+X4+X3+1,被除多项式被生成多项式除(系数按模-2计算),余数即为将要发至总线的CRC序列。发送节点和接收接点的CAN控制器均采用相同的方法生成CRC检验码,并与发送节点送出的CRC检验码进行比较,以判断报文是否出错,若出错,CAN控制器会依据总线仲裁原则及受损报文优先发送原则对已损坏报文自动进行重发。
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(t+1)= [c0c1c2……c12c13]*[0|I14]⊕(c14⊕dst)*g
= [c0c1c2……c12c13]*[0|I14]⊕c14*g⊕dst*g
= [c0c1c2……c12c13 c14]*A⊕dst*g
= c(t) *A⊕dst*g
上式中,I
14为14阶单位阵,ds
t为串行输入数据,⊕表示异或,g=[g
0g
1……g
13g
14]为生成多项式的系数行矩阵,而A为n阶方阵
。
依据以上的CRC检验码的状态转换方程实现的RTL级的VHDL代码如下:
c<=ds xor c(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' and f_ds='1' and f_ds_sync='0')then
if(c ='1')then
c(14 downto 1)<=c(13 downto 0) xor "10001011001100";
c(0)<='1';
else
c(14 downto 1)<=c(13 downto 0);
c(0)<='0';
end if;
end if;
end if;
在以上代码中,rst 为外部复位信号,en_transmit 为帧发送使能信号,en_crc_code 为CRC代码编码使能信号,ds为输入的串行数据,f_ds与ds同时有效,f_ds='1' and f_ds_sync='0'代表f_ds的上升沿,c为15位移位寄存器,用于寄存CRC检验码的中间结果并输出其最终结果。
需注意的是:信号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所示。寄存器每位的表示如c
6= c
9⊕c
13⊕dp
2⊕dp
6。在实际编码中,需添加一些控制信号,如异步复位信号、编码同步清零信号、编码同步使能信号等。
表1 8位并行CRC检验码逻辑表
c(t+k) |
c(t)、dp |
c0 |
c7 c8 c9 c10 c11 c13 c14 dp 0 dp1 dp2 dp3 dp4 dp6 dp7 |
c1 |
c8 c9 c10 c11 c12 c14 dp1 dp2 dp3 dp4 dp5 dp7 |
c2 |
c9 c10 c11 c12 c13 dp2 dp3 dp4 dp5 dp6 |
c3 |
c7 c8 c9 c12 dp0 dp1 dp2 dp4 |
c4 |
c7 c11 c14 dp4 dp7 dp10 |
c5 |
c8 c12 dp1 dp5 |
c6 |
c9 c13 dp2 dp6 |
c7 |
c7 c8 c9 c11 c13 dp0 dp1 dp2 dp4 dp5 |
c8 |
c0 c7 c11 c12 c13 dp0 dp4 dp5 dp6 |
c9 |
c1 c8 c12 c13 c14 dp1 dp5 dp6 dp7 |
c10 |
c2 c7 c8 c10 c11 dp0 dp1 dp3 dp4 |
c11 |
c3 c8 c9 c11 c12 dp1 dp2 dp4 dp5 |
c12 |
c4 c9 c10 c12 c13 dp6 dp2 dp3 dp5 |
c13 |
c5 c10 c11 c13 c14 dp3 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 贾丽媛
,戴光明
. ATM协议处理中CRC的并行实现
. 湖南城市学院学报,(自然科学版)
第13卷,第4期 2004年12月:68~69
3 侯伯亨, 顾新 .VHDL硬件描述语言与数字逻辑电路设计. 西安电子科技大学出版社