循环冗余校验码的单片机及CPLD实现

最新更新时间:2006-05-07来源: 互联网 手机看文章 扫描二维码
随时随地手机看文章

    摘要:循环冗余码校验(CRC)是一种可靠性很高的串行数据校验方法。介质循环冗余码校验的基本原理,并分别用单片机和CPLD作了循环冗余码验的软件实现和硬件实现。包括汇编语言和VHDL语言源程序。

    关键词:差错校验 查表法 CPLD

1 基本原理

串行数据的差错检验是保证数据正确的必要手段,通常采用奇遇校验法和循环冗余校验法。这两种方法都是通过冗余数据来提供必要信息。奇偶校验法适用于以字节为单位数据传输。例如用偶校验传送1个ASCII字符时,要附加1个校验位,从而使全部9位中“1”的个数为偶数。奇偶校验简单易行,但当数据崩溃或出现多位错误时,往往不能检验出来,因而可靠性不高。

循环冗余码校验法利用了循环和反馈机制,校验码由输入数据与历史数据经过较为复杂的运算而得到。因此,冗余码包含了更为丰富的数据间的信息,可靠性更高。校好的循环冗余码可校验出以下错误:①全部数据位任意奇数个位出错;②全部数据位中任意连续2位出错;③处于一个8位时间窗内的任1~8位数据出错。

使用循环冗余码校验方法通信时,发送方先计算待发数据的校验码,然后将数据与校验码起发出;接收方接收数据的同时进行循环冗余码的计算,并将计算结果与来自发送方的校验码相比较,如不相同表示传输过程中出现了错误,接收方必须通知发送方再次发送该组数据。

假设要传输64位数据(最后8位是校验码),并使用多项式x8+x5+x4+1来产生8位循环冗余校验码(以下简称CRC码)。其逻辑结构可用异或门和移位寄存器表示,如图1所示。寄存器的值即为输入数据的CRC码。首先来输入数据与最低位的异或值,如为“0”,只需将当前CRC码逻辑右移1位(首位补零),即可得到新CRC码;如为“1”,则将当前CRC码与18H异或,再循环右移1位即可。该校验码有以下特点:①当输入的8位数据(低位在前)与当前CRC码相同时,输出的CRC码将是零。因此,当包含8位CRC码的全部64位数据输入后,输出的CRC码应为零。②只要有非零位即可判决传输错误,而必复杂的校验技术。

2 用汇编语言产生循环冗长余校验码

在8051单片机上,由以下代码可得8位CRC码(存于变量CRC中),8位输入数据暂存于ACC中。

DO_CRC:PUSH ACC ;保存输入数据

PUSH B ;保存B寄存器

PUSH ACC ;再次保存

MOV B,#8 ;共有8位数据

CRC_LOOP:XRL A,CRC

RRC A ;将最低位与输入数据的异或值放入进位标志中

MOV A,CRC

JNC ZERO

XRL A,#18H;当前CRC码与18H异或

ZERO: RRC A ;右移1位

MOV CRC,A ;保存新CRC码

POP ACC

RR A ;取出输入数据的第2位

PUSH ACC

DJNZ B,CRC_LOOP ;循环

POP ACC

POP B

POP ACC ;恢复各寄存器

RET

上述程序对每一位输入数据都要执行一系列操作,运算量很大,但内存占用少,适合于内存紧张的情况。当内存充裕时,可以使用效率更高的查表法。

3 用查表法求CRC码

将输入数据按字节分开,每字节值在0~255之间。令当前CRC码为00H,当分别输入0~255时,得到256个CRC码。将它们顺序排列就构成了循环冗余校验码表。用当前CRC码与输入字节异或后的值作为下标,查表即可求出新CRC码。下例中,crc存放CRC码,ACC存放输入字节,crc_table为循环冗余校验表的入口地址。代码如下:

XRL A,crc ;当前CRC码与输入数据异或

PUSH DPH

PUSH DPL ;保存数据指针

MOV DPTR #crc_table

MOVC A,@A+DPTR;查表

MOV crc,A

POP DPL

POP DPH ;恢复数据指针

RET

crc_table:

DB 00H,5EH,BCH,E2H,61H,3FH,DDH,83H

DB C2H,9CH,7EH,20H,A3H,FDH,1FH,41H

DB 9DH,C3H,21H,7FH,FCH,A2H,40H,1EH

……

4 循环冗余校验码的CPLD实现

用CPLD作循环冗余校验码的硬件实现,其速度更快,性能更好,而且只占用极少的CPLD内的资源。本人用Xilinx公司的XCV9536芯片,基于以下VHDL代码,实现了8位CRC码生成电路。代码下VHDL代码,实现了8位CRC码生成电路。代码中,s_in为输入串行数据,q为输出CRC码,d_new为当前CRC码。

Library IEEE;

use IEEE.std_logic_1164.all;

entity crc is

port(clk,s_in,reset:in STD_LOGIC,q:out STD_LOGIC_VECTOR (7 downto 0));

end crc;

architecture crc_arch of crc is

signal t1,t2,t3:std_logic;

signal d_new:std_logic_vector(7 downto 0);

begin

t1<=d_new(0)xor s_in; --t1为最低位与输入异或值

t2<=d_new(4)xor '1';

t3<=d_new(3)xor'1';

process(clk,reset)

begin

if clk event and clk='1'then

if reset='1'then

d_new<=x"0"; --复位时,CRC码置零

elsif t1='1'then

d_new<=t1&d_new(7 downto 5)&t2&t3&td_new(2 downto 1);--t1为"1"时的新CRC码

elsif t1='0'then

d_new<=t1&d_new(7 downto 1); --t1为"0"时的新CRC码

end if;

end if;

end process;

q<=d_new;--输出CRC码

end crc_arch;

5 总结

基于以上介绍的8位循环冗余校验码的软件及硬件实现方法,可以设计各种类型的循环冗余校检方法。由上述例程可以看出,循环冗余码校验是一种可靠性高、易于实现的校验方法。

编辑: 引用地址:循环冗余校验码的单片机及CPLD实现

上一篇:用单片机实现可编程逻辑器件的配置
下一篇:一个动态内存管理模块的实现

小广播
502 Bad Gateway

502 Bad Gateway


openresty
502 Bad Gateway

502 Bad Gateway


openresty
502 Bad Gateway

502 Bad Gateway


openresty
502 Bad Gateway

502 Bad Gateway


openresty
502 Bad Gateway

502 Bad Gateway


openresty
随便看看
    502 Bad Gateway

    502 Bad Gateway


    openresty

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 市场动态 半导体生产 材料技术 封装测试 工艺设备 光伏产业 平板显示 EDA与IP 电子制造 视频教程

词云: 1 2 3 4 5 6 7 8 9 10

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
502 Bad Gateway

502 Bad Gateway


openresty