本文共 3771 字,大约阅读时间需要 12 分钟。
针对CAN协议中提出的串行CRC检验原理,给出其硬件实现方法及具体实现时应需注意的技术问题,给出了RTL级的VHDL代码。为了提高CRC编码的生成速度和CRC检验的效率,介绍了CRC检验的并行原理,并针对CAN协议中CRC编码的生成多项式推导出了8位并行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 上式中,I14为14阶单位阵,dst为串行输入数据,⊕表示异或,g=[g0g1……g13g14]为生成多项式的系数行矩阵,而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所示。寄存器每位的表示如c6= c9⊕c13⊕dp2⊕dp6。在实际编码中,需添加一些控制信号,如异步复位信号、编码同步清零信号、编码同步使能信号等。 表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 |
Area (LUTs) | Delay (ns) | DFFs | Clock (MHz) | |
并行方式 | 35 | 8 | 15 | 119.6 |
串行方式 | 8 | 6 | 15 | 160.9 |
from:http://www.educity.cn/develop/535000.html
转载地址:http://ujemi.baihongyu.com/