在现代数字通讯中,要求信息在传输进程中形成的数字过失有必要足够低。但因为通讯信道存在噪声和传输特性不 抱负等原因形成了信号
的码间串扰,导致信息在传输进程产 生过失。为了最大极限地确保通讯进程中信息的完整性,需 要选用信道编码技能对可能发生的过失进行有用地操控,而 循环冗余校验码便是其间一个最有用的编码技能。
1 循环冗余校验码基本思想
循环冗余校验码是一种校错才能很强且运用十分广泛 的过失查验办法。循环冗余校验码选用在发送的有用码后边 参加校验码来完成数字通讯传输进程中数据的过失检测,通 常的构成能够描绘为:K位的有用信息数据串和R位的循环 冗余校验码并在一同传输。
1.1 循环冗余校验码生成基本原理
循环冗余校验码(亦称CRC码)在通讯信号校错里广泛使 用。其基本原理是,在发送端:即将发送的数据串序列当作 一个多项式T(x)的系数(比方,多项式为T(x)=x5+x3+x+1,则 此多项式的系数就为101011,一同能够自定义一个k次幂的 称为生成多项式的多项式G(x),为了使本来的数据串序列在 后边参加校验码,就有必要使其向左移,所以用Xk乘以T(x), 依据对二进制乘法的了解,得到的T(x)Xk,能起到把T(x) 原有数据串序列向左移动k位的成果。为了得到校验码,用 G(x)作除数,T(x)Xk作被除数,相除得到一个余数多项式 R(x)。然后将余数多项式R(x)并在待发送的数据串序列后 面,把这串新的数据串序列作为发送序列发送。在接纳端: 再次运用自定义的生成多项式G(x)去除接纳到的数据串序列多项式,假如相除所得到的余数多项式和在发送端核算得到的余数多项式相同,则标明信号传输正常,没有呈现过失;
假如两者不相同,就标明信号传输过错,就有必要查看各方面 要素,从头发送信息,直到两者相同停止。为了更直观地阐明循环冗余校验码的生成进程、校验 进程,以8位的有用信息数据串和4位的循环冗余校验码并在 一同传输为例。
生成进程:
(1)假定要发送的数据串序列为11011101。
(2)自定义的生成多项式G
(x)=x4+x3+x+1,其间k=4,相对应的序列为11011。
(3)把待发送的数据串序列向左移动4位,后边补0,从 而得到新的数据串序列为110111010000。
(4)运用模2除法,用生成多项式序列去除新生成的数据 串序列。即
这样得到了余数多项式R(x)对应序列为1010。
( 5 ) 将 余 数 多 项 式 R ( x ) 对 应 序 列 并 到 新 数 据 串 序 列 后 面 , 得 到 带 有 循 环 冗 余 校 验 码 的 数 据 串 序 列 :
110111011010。 校验进程: 假 如 信 息 在 传 输 过 程 中 没 有 受 到 影 响 而 发 生 错 误 的话,接纳到的带有循环冗余校验码的数据串序列必定能够被 在发送端所自定义的生成多项式整除,也便是:
1.2 生成多项式的注意事项 (1)生成多项式的最高位和最低位有必要为1。 (2)当所要传输的数据序列任何一位发生过错时,用生
成多项式做模2除法(即加法不进位,减法不借位,实际上就 是数字逻辑里的“异或”操作)后要使相除后的余数不为0。 (3)关于不同的位发生过错时,要使余数也不同。
(4)对余数持续做模2除法时,要使余数循环。
2 Verilog HDL中心程序
2.1 Verilog HDL完成循环冗余校验码的生成代码
其间DXS标明生成多项式PROCESS(clk,rst_n )
VARIABLE dzl: STD_LOGIC_VECTOR(16 DOWNTO 0); VARIABLE sdzl: S T D _ L O G I C _ V E C T O R ( 1 1
DOWNTO 0); BEGIN
IF (clk'event and clk='1') THEN IF rst_n='0' THEN hsd_r<='0';
dcrco_r<=B"0_0000_0000_0000_0000"; ELSIF dload='1' THEN
dzl :=sdata&'0'&'0'&'0'&'0'&'0';
sdzl :=sdata;
IF dzl(16)='1' THEN
dzl(16 DOWNTO 11):=dzl(16 DOWNTO 11) XOR DXS; END IF;
IF dzl(15)='1' THEN
dzl(15 DOWNTO 10):=dzl(15 DOWNTO 10) XOR DXS; END IF;
IF dzl(14)='1' THEN
dzl(14 DOWNTO 9):=dzl(14 DOWNTO 9) XOR DXS; END IF;
IF dzl(5)='1' THEN
图1 循环冗余校验码的生成、校验仿真
dzl(5 DOWNTO 0):=dzl(5 DOWNTO 0) XOR DXS; END IF;
dcrco_r<=sdzl & dzl(4 DOWNTO 0);
hsd_r<='1'; ELSE hsd_r<='0'; END IF; END IF;
END PROCESS;
2.2 循环冗余校验码的校验代码
PROCESS(clk,rst_n)
VARIABLE rdzl: STD_LOG%&&&&&%_VECTOR(16 DOWNTO 0); BEGIN
IF (clk'event and clk='1') THEN IF rst_n='0' THEN
rd_r <=X"000";
dfsh_r <='0';
err_r <='0';
ELSIF hrecv='1' THEN
rdcrc_r <=datacrci;
rdzl :=datacrci(16 DOWNTO 0); IF rdzl(16)='1' THEN
rdzl(16 DOWNTO 11):=rdzl(16 DOWNTO 11) XOR DXS; END IF;
IF rdzl(15)='1' THEN
rdzl(15 DOWNTO 10):=rdzl(15 DOWNTO 10) XOR DXS; END IF;
IF rdzl(14)='1' THEN
rdzl(14 DOWNTO 9):=rdzl(14 DOWNTO 9) XOR DXS; END IF;
IF rdzl(5)='1' THEN
rdzl(5 DOWNTO 0):=rdzl(5 DOWNTO 0) XOR DXS; END IF;
IF rdzl(5 DOWNTO 0)="000000"
THEN
rd_r < = r d c r c _ r ( 1 6DOWNTO 5);
dfsh_r <='1';
err_r<='0'; ELSE rd_r<=X"000"; err_r<='1'; END IF;
ELSE dfsh_r<='0'; END IF; END IF;
END PROCESS;
对循环冗余校验码的生成和校验进行了功用仿真,结 果如图1所示。
3 循环冗余校验码的使用
因为循环冗余校验码强壮的校验才能,在不同范畴, 循环冗余校验码的生成多项式位数也不同,依据IEEE官方 文件显现,为了更好地确保校验牢靠度,现在的位数越来越 大,现在最长的循环冗余校验码已达到160位。下面简略介 绍几种常见的循环冗余校验码及其使用范畴。
(1)USB接口用CRC5。对应的规范生成多项式:
P(x) = x5 + x2 + 1 (2)ATM协议等用CRC8。对应的规范生成多项式:P(x) = x8 + x2 + x + 1 (3)文件传输通讯协议,X25协议等用CRC16。对应的标
准生成多项式:
P(x) = x16 + x12 + x5 + 1 (4)IEEE802.3规范用CRC32。对应的规范生成多项式: P(x) = x32 + x26 + x23 + x22 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2
+ x + 1
(5)ISO 3309规则的CRC64。对应的生成多项式:
P(x) =x64 + x62 + x57 + x55 + x54 + x53 + x52 + x47 + x46 + x45 + x40
+ x39 + x38 + x37 + x35 + x33 + x32 + x31 + x29 + x27 + x24 + x23 + x22 + x21 +
x19 + x17 + x13 + x12 + x10 + x9 + x7 + x4 + x + 1
4 结语
循 环 冗 余 校 验 码 已 经 成 为 各 行 各 业 通 信 校 验 中 最 普 遍的校验方法。本规划将循环冗余校验码的生成与校验过 程进行详尽的剖析,终究选用Altera公司开发的FPFA芯片 EP1C12Q240C8进行成果验证。试验标明FPGA在完成循环 冗余校验码方面有着简略高效的优势。在未来完成更多位的 循环冗余校验中有着更深远的用处。