690134780050X循环冗余校验码码X的值加步骤

您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
[x-y]补.ppt 175页
本文档一共被下载:
次 ,您可全文免费在线阅读后下载本文档。
下载提示
1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。
2.该文档所得收入(下载+内容+预览三)归上传者、原创者。
3.登录后可充值,立即自动返金币,充值渠道很便利
你可能关注的文档:
··········
··········
解答 执行舍入操作后,其结果值分别为:  [x1]补=11.0110 (不舍不入)  [x2]补=11.0110 (舍)
 [x3]补=11.0110 (舍)  [x4]补=11.1000 (入)
[例28] 设有浮点数x=2-5×0.0110011,y=23×(-0.1110010),阶码用4位移码表示,尾数
(含符号位)用8位补码表示。求[x×y]浮。要求用补码完成尾数乘法运算,运算结果尾数保留高8位(含符号位),并用尾数低位字长值处理舍入操作
移码采用双符号位,尾数补码采用单符号位,则有
[Mx]补=0.0110011, [My]补=1.0001110,
[Ey]移=01 011, [Ey]补=00 011, [Ex]移=00 011,
[x]浮=00 011, 0.0110011,
[y]浮=01 011, 1.0001110 解答续
(1) 求阶码和  [Ex+Ey]移=[Ex]移+[Ey]补=00 011+00 011=00 110,值为移码形式-2。
(2) 尾数乘法运算可采用补码阵列乘法器实现,即有 [Mx]补×[My]补=[0.0110011]补×[1.0001110]补 =[1.1010]补
(3) 规格化处理 乘积的尾数符号位与最高数值位符号相同,不是规格化的数,需要左规: 尾数左移一位变为 1.0100。符合规格化要求
为保证结果不变,阶码减一变为00 101(-3), 解答续 (4) 舍入处理  尾数为负数,取尾数高位字长,按舍入规则,舍去低位字长,故尾数为1.0100101 。   最终相乘结果为   [x×y]浮=00 101,1.0100101
其真值为  
x×y=2-3×(-0.1011011) 习题练习 有十六进制数:X=F8880000H,请计算以下列表示情况下X的值(要求:写成规格化浮点数的形式,尾数用二进制表示,阶码用十进制表示) (1)一个无符号数;
(2)一个补码整数; (3)一个奇校验无符号整数(最左边为校验位);
(4)一个IEEE754单精度浮点数 (5)一个尾数为24位(X的最左边为其符号位),阶码为8位(X的左起第2位为其符号位),且尾数与阶码都是原码表示的浮点数; (6)一个尾数为24位(X的最左边为其符号位),阶码为8位(X的左起第2位为其符号位),且尾数与阶码都是补码表示的浮点数。
(先自己做,然后老师板书讲解) 解: X=F8880000H= (1)0.1×232; (2)-0000000
=-0. 7; (3)0.×231; (4)S=1, e=E-127=(,
M= X=(-1)S×(1.M) ×2 E-127 = -1. =-0.1;
(5)S=1, E=[]原= -=-113, M= X=(-1)S×M×2 E
= -0. =-0.1×2-116; (6)S=1,
E=[]补=-=-15, M=
X=(-1)S×M×2 E= -0. 。
2、在整数定点机中,若寄存器的内容为80H,当它分别代表原码、补码、反码、无符号数及一个无符号整数的奇偶校验码且最右边一位为校验时,所对应的十进制值是多少?
答案: 设X=80H,则: [X]原=,X=0 [X]补=,X=-128 [X]反=,X=-127 无符号数:X==12810 奇偶校验码:X=10
已知X = -1001111,Y = +0111001, 求[X+Y]移和[X-Y]移,并指出溢出情况。
[X+Y]移=[X]移+[Y]补=+= 不溢出
[X-Y]移=[X]移+[-Y]补=+=  溢
正在加载中,请稍后...尤其不知道绝对值x与绝对值y的相加有什么意义?能有尤其不知道绝对值x与绝对值y的相加有什么意义?能有具体步骤的话最好.
分类:数学
1.3x?x+10x+4=0 3x?x什么意思,题目不清楚?2.( x-2)?=(2x+3)?x-2=2x+3 或x-2=-(2x+3)x=-5 或x=5/3
设函数f(x)=x+1/x(x不等于0)的图像为C1,C1关于点A(2,1)对称的图像为C2C2对应的函数为g(x)求函数y=g(x)的解析式并确定其定义域
设C2上任一点坐标是B(x,y),则B关于A对称的点坐标是C(4-x,2-y),C在C1上,则有:2-y=4-x+1/(4-x)y=x-2-1/(4-x)即g(x)=x-2+1/(x-4)定义域x-4不=0,即(-无穷,4)U(4,+无穷)
y=sin(x+1/3兀)sin(x+1/2兀)=-1/2[cos(2x+5π/6)-cos(-π/6)]所以T=2π/w=2π/2=π
证明:设3≤x1<x2≤5,∵f(x1)-f(x2)=1+1-2+1=2+1)-3(x1+1)(x1+1)(x2+1)=2-x1)(x1+1)(x2+1),x2-x1>0,x1+1>0,x2+1>0,∴2-x1)(x1+1)(x2+1)>0,即
f(x1)>f(x2),故函数函数f(x)=在[3,5]上单调递减.故当x=3时,函数取得最大值为 ,当x=5时,函数取得最小值为 .
tan2a=tan[(a+b)+(a-b)]=[tan(a+b)+tan(a-b)]/[1-tan(a+b)tan(a-b)]=(2/5+1/4)/(1-2/5*1/4)=(13/20)/(18/20)=13/18sin2A=±13/√(13?+18?)=±13/√493=(±13/493)√493tan(a+b)=2\5,是2/5还是5/2呀
是派.先求|sinx|的周期,是派.再求根号tanx/2 的周期,把图画出来就知道了,也是派.
其他相关问题1、 商品条码X,确定校验位X的数值,并指出代表国家的几位数字,确定是哪个国家的商品。_百度知道
1、 商品条码X,确定校验位X的数值,并指出代表国家的几位数字,确定是哪个国家的商品。
我有更好的答案
X = 4所属国家:中国
采纳率:43%
为您推荐:
其他类似问题
您可能关注的内容
商品条码的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。求函数y=(1-x^2)/(1+x^2)的值域。要很详细很详细的步骤._百度知道
求函数y=(1-x^2)/(1+x^2)的值域。要很详细很详细的步骤.
求函数y=(1-x^2)/(1+x^2)的值域。
y=(1-x^2)/(1+x^2)y=(-1-x^2+2)/(1+x^2)y=2/(1+x^2)-11+x^2&=10&1/(1+x^2)&=10&2/(1+x^2)&=2-1&2/(1+x^2)-1&=1所以是(-1,1]
采纳率:42%
解法一、由y=(1-x^2)/(1+x^2)
得 x^2(y+1)=1-y所以x^2=(1-y)/(1+y)≥0即(y-1)/(y+1)≤0
解之得 -1<x≤1故所求值域为(-1,1]解法二、参看以下第三个回答。
y=(1-x^2)/(1+x^2) =1-x^4因为x^4大于等于0即1-x^4小于等于1即函数y=(1-x^2)/(1+x^2)的值域y小于等于1
y=2/(1+x^2)-1x^2∈[0,+∞),1/(1+x^2)∈(0,1]2/(1+x^2)∈(0,2]y∈(-1,1]
设t=x^2,则y=(1-t)/(1+t)=[2-(1+t)]/(1+t)=[2/(1+t)]-1(此法叫做分离常数)因为t=x^2&=0所以2&=2/(1+t)&0,所以1&=y&-1希望对你有所帮助。
其他3条回答
为您推荐:
其他类似问题
值域的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。from:http://www.openhw.org/chudonganjin/blog/12-08/e6.html&
最详细易懂的CRC-16校验原理(附源程序)
1、循环校验码(CRC码):
是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定。
2、生成CRC码的基本原理:
任意一个由二进制位串组成的代码都可以和一个系数仅为&0&和&1&取值的多项式一一对应。例如:代码1010111对应的多项式为x6+x4+x2+x+1,而多项式为x5+x3+x2+x+1对应的代码101111。
标准CRC生成多项式如下表:
&& 名称&&&&&&& &&生成多项式&&&&&&&&&&&&& 简记式*&& 标准引用
&& CRC-4&&&&&&& &x4+x+1&&&&&&&&&&&&&&&&& 3&&&&&&&& ITU G.704
&& CRC-8&&&&&&& &x8+x5+x4+1&&&&&&&&&&&&& 0x31&&&&&&&&&&&&&&&&&&&
&& CRC-8&&&&&& &&x8+x2+x1+1&&&&&&&&&&&&& 0x07&&&&&&&&&&&&&&&&&&&
&& CRC-8&&&&&& &&x8+x6+x4+x3+x2+x1&&&&&& 0x5E
&& CRC-12&&&&& &&x12+x11+x3+x+1&&&&&&&&& 80F
&&&CRC-16&&&&& &&x16+x15+x2+1&&&&&&&&&&& 8005&&&&& IBM SDLC
CRC16-CCITT &x16+x12+x5+1&& 1021&&&ISO HDLC, ITU X.25, V.34/V.41/V.42, PPP-FCS
&& CRC-32&&&&& x32+x26+x23+...+x2+x+1 04C11DB7 ZIP, RAR, IEEE 802 LAN/FDDI, IEEE 1394, PPP-FCS
&& CRC-32c&&&& x32+x28+x27+...+x8+x6+1 1EDC6F41 &&&&SCTP
3、CRC-16校验码的使用:
&&&&现选择最常用的CRC-16校验,说明它的使用方法。
根据Modbus协议,常规485通讯的信息发送形式如下:
&& 地址& 功能码&& 数据信息& 校验码
&& 1byte&& 1byte&& nbyte&&&&2byte&&
CRC校验是前面几段数据内容的校验值,为一个16位数据,发送时,低8位在前,高8为最后。
例如:信息字段代码为: 1011001,校验字段为:1010。
发送方:发出的传输字段为:&&1 0 1 1 0 0 1 1 0 10
&&&&&&&&&&&&&&&&&&&&&&&&&&信息字段&&&&&& 校验字段
接收方:使用相同的计算方法计算出信息字段的校验码,对比接收到的实际校验码,如果相等及信息正确,不相等则信息错误;或者将接受到的所有信息除多项式,如果能够除尽,则信息正确。
4、CRC-16校验码计算方法:
常用查表法和计算法。计算方法一般都是:(1)、预置1个16位的寄存器为十六进制FFFF(即全为1),称此寄存器为CRC寄存器;(2)、把第一个8位二进制数据(既通讯信息帧的第一个字节)与16位的CRC寄存器的低&&&&&& 8位相异或,把结果放于CRC寄存器,高八位数据不变;(3)、把CRC寄存器的内容右移一位(朝低位)用0填补最高位,并检查右移后的移出位;(4)、如果移出位为0:重复第3步(再次右移一位);如果移出位为1,CRC寄存器与多
&&& 项式A001(00&0001)进行异或;(5)、重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理;(6)、重复步骤2到步骤5,进行通讯信息帧下一个字节的处理;(7)、将该通讯信息帧所有字节按上述步骤计算完成后,得到的16位CRC寄存器的高、低&&&&&& 字节进行交换;(8)、最后得到的CRC寄存器内容即为:CRC码。
以上计算步骤中的多项式A001是8005按位颠倒后的结果。
查表法是将移位异或的计算结果做成了一个表,就是将0~256放入一个长度为16位的寄存器中的低八位,高八位填充0,然后将该寄存器与多项式0XA001按照上述3、4步骤,直到八位全部移出,最后寄存器中的值就是表格中的数据,高八位、低八位分别单独一个表。
5、提供两个经典的程序示例(皆验证通过)
(1)&&&&&C查表法版本:
&&&& 特点:速度快,语句少,但表格占用一定的程序空间。
&*pucFrame 为待校验数据首地址,usLen为待校验数据长度。返回值为校验结果。
USHORT usMBCRC16( UCHAR * pucFrame, USHORT usLen )
&&& UCHAR ucCRCHi = 0xFF;
&&& UCHAR ucCRCLo = 0xFF;
&&& int iI
&&& while( usLen-- )
&&&&&&& iIndex = ucCRCLo ^ *( pucFrame++ );
&&&&&&& ucCRCLo = ( UCHAR )( ucCRCHi ^ aucCRCHi[iIndex] );
&&&&&&& ucCRCHi = aucCRCLo[iIndex];
&&& return ( USHORT )( ucCRCHi && 8 | ucCRCLo );
static const UCHAR aucCRCHi[] = {
&&& 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
&&& 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
&&& 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
&&& 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
&&& 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
&&& 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
&&& 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
&&& 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
&&& 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
&&& 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
&&& 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
&&& 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
&&& 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
&&& 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
&&& 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
&&& 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
&&& 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
&&& 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
&&& 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
&&& 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
&&& 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
&&& 0x00, 0xC1, 0x81, 0x40
static const UCHAR aucCRCLo[] = {
&&& 0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7,
0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E,
&&& 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, 0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9,
&&& 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC,
&&& 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
&&& 0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32,
&&& 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D,
&&& 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A, 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38,
&&& 0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF,
&&& 0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
&&& 0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1,
&&& 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4,
&&& 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F, 0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB,
&&& 0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA,
& &&0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
&& &0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0,
&&& 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97,
&&& 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C, 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E,
&&& 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89,
&&& 0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
&&& 0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83,
&&& 0x41, 0x81, 0x80, 0x40
(2)&&&&&汇编计算法版本:
&&&&特点:需要计算n*8次(n为信息字节数),运行速度慢,占用程序时间,但节省空间资源。
TEMP&&&&&&&&&& &&EQU&&&&40HCHKSUMBYL&&&EQU&&&&46H&&&&&&&&&&&&&&&&&&;校验和低字节CHKSUMBYH&&&EQU&&&&47H&&&&&&&&&&&&&&&&&&;校验和高字节DATALENGTH&&EQU&&&&4FH&&&&&&&&&&&&&&&&&&;待校验的数据串长度&&&&&&&&&&&&
&ORG& &0000H&MOV&&&TEMP,#1EH&MOV&&&TEMP+1,#6&MOV&&&TEMP+2,#20H&MOV&&&TEMP+3,#0&MOV&&&TEMP+4,#0&MOV&&&TEMP+5,#2&LCALL&MAKE_CHKSUM&SJMP&&$&;--------------------------------------------------------------------------;运行:&&1E&06&20&00&00&02&01&A4&&,16进制,设备地址,命令,存储器地址高,存储器地址低,参数高,参数低,校验低,校验高。;---------------------------------------------------------------------------MAKE_CHKSUM:&&&&&& &&;RTU&模式,CRC&-&16&校验,用软件模拟仿真检查无误&&&&&&&&& MOV&&&R0,#TEMP&&&&&&&&MOV&&&CHKSUMBYL,#0FFH&&;1.预置&16&位寄存器为十六进制&FFFF(即全为&1),低字节&&&&&&&&MOV&&&CHKSUMBYH,#0FFH&&;&&预置&16&位寄存器为十六进制&FFFF(即全为&1),高字节&&&&&&&&MOV&&&DATALENGTH,#6&&&&&&&&&;待校验的数据串长度CHKSUM_LP1:&&&&&&&&MOV&&&A,@R0&&&&&&&&&&&;2.把第一个&8&位数据与&16&位&CRC&寄存器的低位相异或,&&&&&&&&XRL&&&A,CHKSUMBYL&&&&&&&&MOV&&&CHKSUMBYL,A&&&&&&&&&&&;并把结果放于CRC&寄存器&&&&&&&&MOV&&&R7,#8CHKSUM_LP2:&&&&&&&&&MOV&&&A,CHKSUMBYH&&&&&&&&&CLR&&&C&&&&&&&&&RRC&&&A&&&&&&&&&&&&&&&&&&&;把寄存器的内容右移一位(朝低位),先移动高字节&&&&&&&&&MOV&&&CHKSUMBYH,A&&&&&&&&&MOV&&&A,CHKSUMBYL&&&&&&&&&RRC&&&A&&&&&&&&&&&&&&&&&&&&&;再移动低字节&&&&&&&&&MOV&&&CHKSUMBYL,A&&&&&&&&&JNC&&&CHKSUM_JP&&;4.检查最低位(移出位),如果最低位为&0&,重复第&3&步(再次移位)&&&&&&&&&MOV&&&A,CHKSUMBYL&&&&&&& &XRL&&&A,#01H&&&&&&&&&&&&&;如果最低位为&1,CRC&寄存器与多项式&A001&进行异或&&&&&&&& MOV&&&CHKSUMBYL,A&&&&&&&&&MOV&&&A,CHKSUMBYH&&&&&&&&&XRL&&&A,#0A0H&&&&&&&&&MOV&&&CHKSUMBYH,ACHKSUM_JP:&&&&&&&&&DJNZ&&R7,CHKSUM_LP2&&&;重复步骤&3、4,右移&8&次,8&位数据全部进行了处理&&&&&&&&&INC&&&R0&&&&&&&&&DJNZ&&DATALENGTH,CHKSUM_LP1&;重复步骤2-5,进行下一个&8&位数据的处理&&&&&&& &RET&&&&&&&&&&&&&&&&&& &END
首先介绍一个不错的CRC校验的网站,& 现在估计所有的工程应用均来自该网站生成的代码。使用方便。
但是该网站的代码不易于CRC的学习和研究,但是保证是对的,工程实践证明。现在将我的研究成果和大家分享一下:用于任意CRC的校验。
&&& 网站上的校验方式最大提供CRC32 和任意数据位(最大511)的校验。当然一般的情况下应该是够用了。我所做的设计可以扩展到任意数据的校验,当然是并行数据的校验,串行数据的校验应用可以参照网上的一些资料。很简单,不再赘述。以CRC32为例
首先建立函数,=====设计的的关键
//--------------------------------------------------------------------------function [31:0] next_c32;&&&
input [31:0] &&&&input B; &&&&&&&begin&& &next_c32 = {crc[30:0],1'b0} ^ ({32{(crc[31] ^ B)}} &32'h04c11db7);//下划线的部分为本征多项式end
endfunction
/*这是校验和左移一位求校验和的计算公式*/
相同的如果CRC8
//--------------------------------------------------------------------------function [7:0] next_c8;&&&
input [7:0] &&&&input B; &&&&&&&begin&& &next_c8 = {crc[6:0],1'b0} ^ ({8{(crc[7] ^ B)}} & 8'h03);//下划线的部分为本征多项式end
endfunction
其他的是一样的。
其次 如果我们要求CRC32_D(M)M& &= 32
function [31:0] next_c32_&//M+1 is the data maximum withinput [M:0]input [31:0]integer &i;begin&next_c32_ge =&for(i=0; i&=M; i="i"+1) begin&&&&& next_c32_ge = next_c32(next_c32_ge,data[M-i]);&endendendfunction
假设我们求CRC32_D64& 那么M=63
function [31:0] next_c32_D64;&//M+1 is the data maximum withinput [63:0]input [31:0]integer &i;begin&next_c32_D64 =&for(i=0; i&=63; i="i"+1) begin&&&&& next_c32_D64 = next_c32(next_c32_D64,data[63-i]);&endendendfunction
假设我们求CRC32_D128& 那么M=127
function [31:0] next_c32_D128;&
input [127:0]input [31:0]integer &i;begin&next_c32_D128 =&for(i=0; i&=127; i="i"+1) begin&&&&& next_c32_D128= next_c32(next_c32_D128,data[127-i]);&endendendfunction
再次如果我们要求CRC32_D(M) M&=32
function [31:0] next_c32_input [31:0]input [31:0]input [4:0]integer &i;begin&next_c32_le =&for(i=0; i&=31- i="i"+1) begin&&&&& next_c32_le = next_c32(next_c32_le,inp[31-be-i]);&endendendfunction
我们首先校验完毕所有的有效数据位下面的函数是对CRC的空闲位的修正。
function [K-1:0] next_cK_1_any_LEK_1;input [N-1:0]input [K-1:0]begin&&&& next_cK_1_any_LEK_1 = next_c32_le({data,{(K-N){1'b0}}},{crc[K-1:N],{(K-N){1'b0}}},(K-N))^{crc&end&endfunction
//以CRC32D16& K =32&& N =16 这个函数就变成
function [31:0] next_C32_D16;input [15:0]input [31:0]begin&next_C32_D16 = next_c32_le({data,{16{1'b0}}},{crc[31:16],{16{1'b0}}},16)^{crc&&16};&end&endfunction
经过和Qii软件仿真无误。本来想做成动态数据长度校验的函数,本人也作了一些尝试,在CRC--N&&&&&&&&&& N = 2^m时都是没有问题的 比如CRC8& CRC16 CRC32 CRC64 等等,但是若是不是这些数值比如CRC12 CRC10的Qii会抱错(因为部分函数的输入部分必须为常数),但是Modelsim不会抱错而且仿真和实际的结果一致。可以用来做。&这边仅仅举了CRC32 的例子,其他的也都类似。
library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;---- Uncomment the following library declaration if instantiating---- any&Xilinx&primitives in this code.--library UNISIM;--use UNISIM.VComponents.entity CODE_74_NEW isPort (& &&&clk : in&&STD_LOGIC;& && && &&&data_in: in&&STD_LOGIC_VECTOR (3 downto 0);& &&&--cnt_out: out std_logic_vector (2 downto 0);& &&&--dtemp_out: out std_logic_vector (3 downto 0);& && && &&&data_crc : out&&STD_LOGIC);& &&&end CODE_74_NEW;architecture Behavioral of CODE_74_NEW is&&constant multi_coef:std_logic_vector (3 downto 0):="1101";--生成多项式系数,MSB一定为1,g(x)=x^3+x^2+1&&beginprocess(clk)&&variable crcvar,dtemp,sdata:std_logic_vector(3 downto 0);--除法运算被除数变量&&variable cnt:std_logic_vector (2 downto 0):="000";--运算次数控制&&beginif clk'event and clk='1' thencnt:=cnt+1;--cnt_out&=--dtemp_out&=& && & if cnt&=4 then --前四个时钟,串行输出四位信息码& & if&&cnt=1 then --初始化操作& && &dtemp:=data_--装载原数据,用于运算校验码& && &sdata:=data_--装载原数据,保存& &&&& &&& && && & data_crc&=sdata(3);--当计数器小于4时,每来一个时钟串行输出一位信息码& && && & sdata:=sdata(2 downto 0) & '0'; --左移& && &&& & --以下为校验码运算& & if dtemp(3)='1' then&&--当前运算的四位码,如果最高位为1则可进行模二除法& &&&crcvar:=dtemp(3 downto 0) xor multi_--异或运算模二除法& &&&dtemp:=crcvar(2 downto 0) & '0';--运算后补零& &&&else dtemp:=dtemp(2 downto 0) & '0';--当前运算的四位码,如果最高位为0则只进行移位补零& && &&&&elsif&&cnt&4&&then --后三个时钟串行输?位校验码& && &data_crc&=dtemp(3);--输出,移位&& & dtemp:=dtemp(2 downto 0) & '0';& && &if cnt=7 then&&--第7个时钟清零& && & cnt:=(others=&'0');& &&&end B
阅读(...) 评论()

我要回帖

更多关于 乐车漆加油卡充值步骤 的文章

 

随机推荐