循环码在数字通信中的作用

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

循环码在数字通信中的应用
摘要: 介绍了循环码的数学原理, 并根据循环码的代数特性, 论述了循环
码的硬件编码与校验过程和一种简单、快速实现软件编码与校验的方法—查表法。

0 概述
循环码是编码方式的一种,检错率高。

循环码用来检测随机或突发错误是非常有效的。

( n , k) 循环码能够检测长为n - k 或更短的任何突发错误,包括首尾
相接突发错误。

n - k + 1 位长的突发错误不能被检错的百分数是2- ( n- k - 1) ,若l > n - k - 1 ,则不能检测长为l 的突发错误的百分数为2- ( n- k) 。

软件查表法简单、实用、快速,可应用于各种通信软件中,确保数据传输的可
靠性。

有些单片机自带硬件编码电路。

在通信软件中大多数采用循环码进行数据差错控制。

了解循环码的数学原理,掌握硬件实现电路,运用简单快速的软件方法,对于各种通信软件编程员(包括单片机、系统机) 有很强的实际应用价值。

1 循环码的有关概念
为了能够充分理解循环码的软硬件实现过程,了解和掌握循环码的有关数学概念和性质是十分必要的。

1. 1 循环码的线性与循环性
设码长为n 的循环码表示方式为v = ( vn- 1 ,vn- 2 , ??vi , ??, v1 ,
v0 ) ,其中vi 为二进制数。

所谓“线性”是指任意两个循环码模2 相加所得的新码仍为循环码;所谓“循环性”是指任一个循环码的任一次循环移位所得的新码仍是循环码。

简单的表示就是,设v = ( vn- 1 , vn- 2 , ??, v1 , v0 ) 为循环码,那么v的一次循环移位v′= ( vn- 2 , ??, v1 , v0 , vn- 1 ) 也是循环码。

1. 2 循环码的多项式表示
若将码字v = ( vn- 1 , vn- 2 , ??, v1 , v0 ) 的各分量看作多项式v ( x) = vn- 1 xn- 1 + vn- 2 xn- 2 + ?+ v1 x + v0
的各次项的系数,则码字与码多项式一一对应,以下将不再区分码与码多项式
这两个概念。

如码字v =(01) 相对应的码多项式为g ( x) =x16 + x12 + x5 + 1。

用多项式来表示的循环码有着多项式的代数特性,可大大简化编码与译码的硬件电路设计。

1. 3 循环码的生成定理
若在信息为k 位,码字为n 位的循环码集合中,存在生成多项式g( x) = xn- k + gn- k - 1 xn- k - 1 + ??+g1 x + 1 ,它能生成循环码集合中的所有码字,且每一码字均是g ( x) 的倍式。

循环码结构为:循环码=信息位+ 冗余校验位。

冗余校验位也称为CRC。

可利用生成定理进行编码,大至步骤如下:①设u ( x) 为将要发送的信息多项式,信息位为k ,信息多项式表示为u ( x) = uk - 1 xk - 1 + ?? +u1 x1 + u0 ,若码字长为n ,那么应在码字中加入的冗余位为n - k 位。

冗余校验位的位数也是生成多项
式的次数,为使k 位信息位位于多项式的高次项,冗余位位于低次项,令xn-
k ·u ( x) ,展开为,xn- k ·u ( x) = xn- k ( uk - 1 xk - 1 + ? + u1 x1
+u0 x0 ) = uk - 1 xn- 1 + ?+ u1 xn- k - 1 + u0 xn- k
②再用生成多项式
g ( x) = xn- k + gn- k - 1 xn- k - 1 + ??+ g1 x + 1除xn- k ·u
( x) ,得到,xn- k ·u ( x) = a ( x) g ( x) + b ( x) ,其中: a ( x)为商式, b ( x) 为余式, g ( x) 次数为n - k 次,那么b ( x) 次数必然等于或小于n - k - 1 次,将b ( x) 展
开为b ( x) = bn- k - 1 xn- k - 1 + ??+ b1 x1 + b0
③重新组合②式中,得到xn- k ·u ( x) + b ( x) =a ( x) g ( x) 将其左端展开,得到xn- k ·u ( x) + b ( x) =uk - 1 xn- 1 + ? + u1 xn- k - 1 +
u0 xn- k + bn- k - 1 xn- k - 1 +??+ b1 x + b0 , 该多项式对应的码字为( uk - 1 ,??u1 ,u0 , bn- k - 1 , ?, b1 , b0 ) , 由循环码生成定理,该码字就是循环码。

综上所述,循环码的编码过程可分为三步:
(1) 用xn- k 乘以待发送的信息多项式u ( x) ;
(2) 用生成多项式g ( x) 除xn- k ·u ( x) 得余式b ( x) ;
(3) 联合b ( x) 和xn- k ·u ( x) 得码多项式xn- k ·u ( x) + b
( x) 。

由以上三个步骤,可设计硬件编码电路,同时,由循环码生成定理可以看出,只
要是码字,就能被生成多项式g ( x) 整除,余式为0 ;反过来,不能被生成多项式整除的,即余式不为0 的,也就不是码字。

可以利用这一点对循环码进行检错。

2 硬件编码过程
根据前面所述的循环码编码的三个步骤,可设计硬件编码电路。

这三步可用一个除法电路来完成。

该电路有反馈连线,是根据生成多项式,g ( x) = xn- k + ?+ gn- k - 1 xn- k - 1 + ?+ g1 x + 1 作的( n - k) 级线性移存器。

那么以CCITT规定的生成
多项式g ( x) = x16 + x12 + x5 + 1 为例作的16 级线性移存器电路,如图1 ,同时设信息位为8 位,即一个字节。

图1 生成多项式为g(x) = x16 + x12 + x5 + 1 的循环码生成电路
该编码电路运算过程如下:第一步,门打开后,8 位信息位移入线路中,同时送
入通信信道,信息位从线路的前端移入,等价于用x16 左乘信息,一旦8位信息全部移入线路,在寄存器中的16 位数据就构成了余项,因而它们就是一致检验数据,即CRC 校
验值。

第二步,开关关上后,断开反馈连线。

第三步,移出校验值,并把它们送
入信道,这16 位一致校验元与8 位信息元一起构成一完整的码字。

循环码的错误检测过程, 设接收的码字为r ( x) ,它可以看成是一个等于或小于n - 1 次的多项式r ( x) = rn- 1 xn- 1 + ?+ r1 x1 + r0 ,用生成多项式g ( x) 除r ( x) ,则r ( x) = a ( x) g ( x) + s ( x) 。

称余式s ( x) 为伴随式,由循环码生成定理可知,当r ( x)是码多项式时, s ( x) = 0。

仍以CCITT 规定的生成多项式g ( x) = x16 + x12 + x5 + 1 为例做的检测电路如图2。

图2 生成多项式为g(x) = x16 + x12 + x5 + 1 的循环码检测电路
该电路的接收多项式是从电路左端移入寄存器,因为接收多项式r ( x) 是码字,无需左乘x16 ,当r ( x) 全部移入寄存器后,寄存器中的内容便是伴随式s ( x) 。

3 软件编码与校验
首先,要计算单字节数据的CRC 校验值。

该值的得出是对图1 编码电路的模拟,仔细分析图1 的除法电路, 它是一个具有反馈连线的16 级线性移存器,信息段的最高位D7 同移存器最高位A15 相异或,该值进入异或反馈流,然后进入累加器。

若该值为0 ,那么它对移存器的内容不施加任何影响,移存器的数据只是进行了一
次简单移位。

因0 ? 1 = 1 ,0 ? 0 = 0 ,异或运算后移存器内参与运算的位没有
改变,若该异或值为1 ,那么它相当于通过异或反馈流对移存器的值进行了一次模2 减法运算,因为1 ?
1 = 0 ;1 ? 0 = 1 ,移存器参与运算的位被改变。

因此,整个过程就是数据高位与移存器高位相异或,若值为0 ,移存器内的数据进行一次简单移位;若值为1 ,则移存器内的数据与除数进行一次异或运算。

根据上述分析可以计算单字节数据的CRC 校验值。

计算框图如图3 ,以下也称移存器为累加器,要记住一点,在求解CRC 值时,累加器初值置为0。

图3 单字节数据CRC 表格生成框图
一个字节可以表示256 个数,事先做好这256 个数的CRC 校验值,并做成表格,待数据发送和接收时查询,可用C 语言编写求CRC 值和做表格程序。

其次,分析在发送数据时如何利用上述CRC 校验值表格。

在发送单字节数据时,可直接查询CRC 表,因该表是单节数据的CRC 值,当发送多字节数据时,就不能直接利用该表。

参看图1 ,设累加器初值为0 ,多字节数据发送时,是一个字节接一个字节发送的,当第一个字节8 位全部进入累加器时,累加器内的数据为CRC 表内的值,当第二个数据字节8 位全部进入累加器后,因累加器内的初值不再为0 ,而是第一个数据的CRC 值, 累加器内的值将不能直接从CRC 表中查得,因该表是在累加器内初值为0 的情况下得到的。

从图1 可以看出,当一个8 位的信息字
节进入16 位的累加器时,累加器中只有高8 位同信息位进行了异或运算,低8 位只是简单地移到了累加器的高8 位。

设累加器内高8 位数据为A8 ,低8 位数据为A0 ,8 位信息位为D ,那么保存A0 ,保存A8 ?D ,此时可以假设累加器初值为0 ,并用A8 ? D 值查CRC表,查得的值称为组合值,再用组合值同累加器内低8 位A0 相异或,即为第二个数据通过累加器时,累加器内的新值。

当第三个、第四个等等数据经过累加器时,与此类同。

在所有信息字节经过累加器后,累加器内最终的值便是多字节数据的CRC 校验值,
图4 为发送多字节数据时计算CRC 值的框图。

图4 发送多字节数据时计算CRC 值框图
图5 接收多字节数据时计算CRC 值框图
再次,分析在接收数据时如何利用CRC 校验值表格。

原则上是用软件模拟图2 所示的硬件电路,但当把发送数据的CRC 校验值也看作信息数据时,也可利用图1 所示的硬件电路, 它相当于将接收多项式左乘x16 即x16 ·r ( x) 。

因r ( x) 为码字,能被生成多项式g ( x) 整除,当然x16 ·r ( x) 也能被g ( x) 整除,这也就是说当接收数据全部经过图1所示电路时,累加器内最后的值为0 ,即多字节接收CRC 校验值为0 ,图5 为接收多字节数据时计算CRC值的框图。

值得注意的是在多字节CRC 校验值生成过程中,累加器的初值问题,一般情况下,将累加器初值设置为0 ,但在实际的通信过程中,会将信息段前面的前导零解释为数据校验正确,因0 的CRC 值恰好为0 ,从而引起错误接收。

解决的办法是将累加器的初值置为一个不为0 的数,并且只要发送方初值与接收方初值一致,在接收方就能得到0 校验值。

①首先使所有从机的SM2 位置1 处于只接收地址帧的状态。

②主机先发送一帧地址信息,其中8 位地址,第9 位为地址P数据信息的标志位。

该位置1 表示该帧为地址信息。

图3 总线型主从式多机通信框图
③从机接收到地址帧后,将各自的接收到的地址与本从机的地址比较。

对于地址相符的那个从机,使SM2 位清0 ,以接收主机随后发来的所有信息;对于地址不符的从机,仍保持SM2 = 1 ,对主机随后发来的数据不予理睬,直至发送新的地址帧。

④当从机发送数据结束后,发送一帧校验和,并置第9 位(TB8) 为1 ,作为从
机数据传送结束的标志。

⑤主机接收数据时先判断数据结束标志(RB8) ,若RB8 = 1 ,表示数据传送结束,并比较此帧校验和,若正确,则回送正确信号00H ,此信号令该从机复位(即重新等待地址帧) ;若校验和出错,则发送0FFH ,令该从机重发数据。

若接收帧的RB8 = 0 ,则原数据到缓冲区,并准备接收下帧信息。

⑥若主机向从机发送数据,从机在第3 步中比较地址相符后,从机令SM2 = 0 ,同时把本站地址发回主机。

作为应答信
号之后才收到主机发送来的数据。

其它从机继续监听地址(SM2 = 1) ,无法收到数据。

⑦主机收到从机的应答地址后,确认地址是否相符。

如果地址不符,发复位信
号(数据帧中TB8 =1) ;如果地址相符,则清TB8 ,开始发送数据。

⑧从机收到复位命令后回到监听地址状态(SM2 = 1) ;否则开始接收数据和命令。

(3) 通信程序设计
设主机发送的地址联络信号00H ,01H , 02H 为从机设备地址,地址FFH 是命令个从机恢复SM2 为1 的状态即复位。

主机的命令编码为:01H 请求从机接收主机的数据命令;02H 请求从机向主机发送数据命令。

其它都按从机向主机发送数据命令02H 对待。

从机的状态字节格式为:D7 D6 D5 D4 D3 D2 D1 D0
ERR 0 0 0 0 0 TRDY RRDY
RRDY= 1 :从机准备好接收主机的数据。

TRDY= 1 :从机准备好向主机发送数据。

ERR = 1 :从机接收到的命令是非法的。

通常从机以中断方式控制和主机的通信。

相关文档
最新文档