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

发布者:开国古泉最新更新时间:2012-03-08 来源: 单片机与嵌入式系统应用 关键字:差错校验  查表法  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寄存器[page]

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 ;恢复数据指针[page]

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 引用地址:循环冗余校验码的单片机及CPLD实现

上一篇:W77E58在RTU遥信单元中的应用
下一篇:基于32位单片机MC68HC376高可靠系统设计

推荐阅读最新更新时间:2024-03-16 12:54

在Protel99SE下实现可编程逻辑器件设计
摘要:通过工程实例介绍了在DSPDigital Signal Processing数字信号处理系统设计中,利用PRO-TEL99SE嵌套的Advanced Protel PLD99硬件描述语言CUPL进行可编程逻辑器件设计的方法。 关键词:可编程逻辑器件(PLD);硬件描述语言(CUPL);Protel99se 1 引言 在以往的DSP设计中,采用TTL、CMOS电路和专用数字电路进行设计时,器件对电路的处理功能是固定的,用户不能定义或修改其逻辑功能。但随着电子技术的发展和工程对所需功能复杂程度的进一步提高,系统将需要很多芯片,这样, 在芯片之间,以及芯片和印刷电路板的布线和接点也相应增多,因而导致系统的可靠性下降
[工业控制]
利用FPGA和CPLD数字逻辑实现ADC
  数字系统的设计人员擅长在其印制电路板上用FPGA和CPLD将各种处理器、存储器和标准的功能元件粘合在一起来实现数字设计。除了这些数字功能之外,FPGA和CPLD还可以使用LVDS输入、简单的电阻电容(RC)电路和一些FPGA或CPLD的数字逻辑单元实现共模功能,从而构建模数转换器(ADC)。   与数字逻辑相连接时,ADC是一种常用的模拟功能块,例如,FPGA或CPLD连接至模拟传感器的现实世界时,ADC是不可或缺的。本文将阐述采用莱迪思半导体公司的参考设计和演示板来实现低频率(DC至1K Hz)和高频率(高达50K Hz)ADC。针对每种设计的应用示例,即网络交换机中的系统.和语音通信系统中的频率检测将在文中验证。   
[嵌入式]
利用FPGA和<font color='red'>CPLD</font>数字逻辑实现ADC
采用51单片机和CPLD构建复杂电路系统的设计思想
  一、引言   单片机市场可以用巨无霸来形容,其中51 单片机使用者就更多了,针对51 单片机无需更多的介绍,这里必须强调一点,只要你精通了51 单片机,以后在实际工作中选用其它单片机也很容易了,这就是初学者学习51 单片机的价值。选择51 单片机学习入门容易,倒不是说51 系列单片机比别的型号简单,其实在8 位单片机家族中,51 系列单片机算是复杂的,但51 单片机在中国推广最彻底,教程也是最丰富,基本不用看英文资料就能学好,所以特别适合初学者学习用。   下面说说CPLD,从近来跟学生和爱好者交往中发现,初学者都很“讨厌”它,问我为什么要把单片机和CPLD 放一块儿,那样不是增加了学习的难度吗?其实深入学习单片机后,你就
[单片机]
采用51单片机和<font color='red'>CPLD</font>构建复杂电路系统的设计思想
基于CPLD的VXI总线接口的研制
    摘要: 文章以VXI总线开关矩阵模块为例,介绍了基于可编程逻辑器件的VXIbus寄存器基接口的开发过程。给出了选用ALTERA公司的可编程逻辑器件FLEX 10K10在MAXPLUSII环境下,结合VXIbus时序对接口逻辑电路进行波形仿真和时序分析的方法。     关键词: VXI总线 接口 CPLD FLEX 10K 1 引言 VXI总线测试系统是一种世界范围内完全开放的、适用于多个生产厂家的模块化仪器总线系统。随着仪器功能逐渐向复杂化发展,以数字电路为主的接口电路的设计也在追求更高的集成度,这时如果采用可编程逻辑器件(PLD)技术代替传统的中、小规模集成电路来实现电路设计,不仅可以节省
[应用]
基于AD7892SQ和CPLD的数据采集系统的设计
    引 言     本系统以AD7892SQ和CPLD(复杂可编程逻辑器件)为核心设计了一个多路信号采集电路,包括模拟多路复用、集成放大、A/D转换,CPLD控制等。采用硬件描述语言Verilog HDL编程,通过采用CPLD使数据采集的实时性得到提高。     1 硬件设计     针对多路信号的采集,本系统采用4/8通道ADG508A模拟多路复用器对检测的信号进行选择,CMOS高速放大器LF156对选中的信号进行放大,AD7892SQ实现信号的A/D转换,CPLD完成控制功能。电路如图1所示。     AD7892SQ是美国AD公司生产的LC2MOS型单电源12位A/D转换器,可
[单片机]
基于AD7892SQ和<font color='red'>CPLD</font>的数据采集系统的设计
CPLD实现基于PC104总线的429接口板
  PC104总线系统是一种新型的计算机测控平台,作为嵌入式PC的一种,在软件与硬件上与标准的台式PC(PC/AT)体系结构完全兼容,它具有如下优点:体积小、十分紧凑,并采用模块化结构,功耗低,总线易于扩充,紧固堆叠方式安装,适合于制作高密度、小体积、便携式测试设备,因此在军用航空设备上有着广泛的应用,但也正是PC104板的这种小尺寸结构、板上可用空间少给设计带来了一定的困难,所以本设计采用了复杂可编程器件CPLD,用CPLD完成了PC104总线与429总线通讯的主要电路,大大节省了硬件资源,本文着重介绍了CPLD部分的设计。 1 系统总体设计      CPLD是一种复杂的用户可编程逻辑器件,由于采用连续连接结构,易于预测延
[嵌入式]
基于DSP+CPLD的智能IED设计
本文的设计师基于DSP和CPLD搭建的智能IED(Intelligent Electronic Device,智能电力监测装置)可以同时采集多路信号,并通过FFT算法得到电网运行的关键数据。   基于IEC61850的智能变电站的逻辑如图1所示。IEC61850协议主要定义了变电站的信息分层结构:过程层、站控层和间隔层。本文重点研究智能IED设备,按照IEC61850协议的描述,IED检测设备位于间隔层和过程层。其中,负责存储测量数据、进行电网数据分析和诊断的主IED位于间隔层;与现场传感器直接联系的测量IED位于过程层;处于站控层的变电站现有计算机系统将存储长期的历史数据和诊断结果。      图1 智能变电站逻
[工业控制]
基于DSP+<font color='red'>CPLD</font>的智能IED设计
基于CPLD和ARM的异步LED显示屏控制系统设计
基于LED技术的大屏幕显示屏已经广泛用于广场、机场、体育场馆和车站等公共场所,在大屏幕上显示文字、动画、图像以及视频等多媒体信息。LED大屏幕控制系统在显示信息时,不需要经过计算机对数据进行处理,是直接读取存放在显示器缓冲区中的信息来显示的,当需要更新信息时,显示屏的数据采集模块向显示模块发送新数据。本文利用高速数据存储和处理的技术方法,设计了一种彩色异步LED大屏幕显示屏控制系统。   1系统设计   1.1系统的总体框架   本文设计的LED大屏幕显示屏控制系统总体框架如图1所示。   图1LED大屏幕控制系统结构图   从图中可以看出,系统主要包括以下4个组成部分:   1)上位机用户控制平台部分,主要用
[嵌入式]
基于<font color='red'>CPLD</font>和ARM的异步LED显示屏控制系统设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved