在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 13293|回复: 19

请教Verilog实现CRC的问题

[复制链接]
发表于 2008-4-19 17:46:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
module crc16(EN,crc_in,data_in,crc_out,valid);
input[15:0] crc_in;
input[7:0] data_in;
input EN;
output[15:0] crc_out;
output valid;
reg[15:0] crc_out;
reg valid;
always@(crc_in or data_in or EN)
begin
if(EN==1)
begin

valid=1\'b0;
crc_out[0]=data_in[7]^data_in[6]^data_in[5]^data_in[4]^data_in[3]^data_in[2]^data_in[1]^data_in[0]^
  crc_in[8]^crc_in[9]^crc_in[10]^crc_in[11]^crc_in[12]^crc_in[13]^crc_in[14]^crc_in[15];
crc_out[1]=data_in[7]^data_in[6]^data_in[5]^data_in[4]^data_in[3]^data_in[2]^data_in[1]^
  crc_in[9]^crc_in[10]^crc_in[11]^crc_in[12]^crc_in[13]^crc_in[14]^crc_in[15];
crc_out[2]=data_in[1]^data_in[0]^crc_in[8]^crc_in[9];
crc_out[3]=data_in[2]^data_in[1]^crc_in[9]^crc_in[10];
crc_out[4]=data_in[3]^data_in[2]^crc_in[10]^crc_in[11];
crc_out[5]=data_in[4]^data_in[3]^crc_in[11]^crc_in[12];
crc_out[6]=data_in[5]^data_in[4]^crc_in[12]^crc_in[13];
crc_out[7]=data_in[6]^data_in[5]^crc_in[13]^crc_in[14];
crc_out[8]=data_in[7]^data_in[6]^crc_in[0]^crc_in[14]^crc_in[15];
crc_out[9]=data_in[7]^crc_in[1]^crc_in[15];
crc_out[10]=crc_in[2];
crc_out[11]=crc_in[3];
crc_out[12]=crc_in[4];
crc_out[13]=crc_in[5];
crc_out[14]=crc_in[6];
crc_out[15]=data_in[7]^data_in[6]^data_in[5]^data_in[4]^data_in[3]^data_in[2]^data_in[1]^data_in[0]^
  crc_in[7]^crc_in[8]^crc_in[9]^crc_in[10]^crc_in[11]^crc_in[12]^crc_in[13]^crc_in[14]^crc_in[15];

end

else
  crc_out[15:0]=4\'H0000;
  valid=1\'b1;
end
endmodule

不明白的地方是: crc_out[]= 后面的式子,是根据什么来的?
怎么计算的啊?
发表于 2008-5-8 15:34:39 | 显示全部楼层
根据你的CRC校验多项式推导来的
发表于 2008-5-8 19:00:18 | 显示全部楼层
你可以看看我的BLOG,有一个CRC的文章
http://jinqiuliao.spaces.live.com/
发表于 2008-5-9 16:58:09 | 显示全部楼层
再回复你两句:
CRC是一个M位2进制数除以(异或除)一个固定N+1位二进制数(根据不同的校验方法决定)得到一个N位余数,
将M和N一起传输,在信宿进行同样的除法,看结果是否一致;

当然上面说的是原理,实际实现的时候要解决以下问题:
1.校验速度,2.容易实现
所以你提供的verilog代码实现了8位并行计算crc,以提高速度(我试过推算,容易推错,结果大致相同,我就直接拿别人的来用了)
另外通过改进的算法,直接校验MN序列,得到一个固定值,叫做magic number,硬件容易实现

我说的不一定全对,IEEE上关于CRC并行计算的文章也有,有些东西也不容易懂,比如magic number的由来
我就抛砖引玉了,请达人指教。
发表于 2008-5-20 23:10:11 | 显示全部楼层
CRC校验分很多种,有8位,16位,32位等,不知道这里用的是多少位。
发表于 2008-5-21 20:49:38 | 显示全部楼层
你这个代码是八位并行计算的CRC16
这个式子是从CRC16的串行计算公式中推导出来的,它一个时钟周期可以计算8位数据的CRC值,楼上所说的magic number是由于寄存器初始为全一时,相当于被除式增加了一个常数,所以在校验计算时会产生一个定值,如果寄存器初始值为全0,校验的结果应该为0。
发表于 2009-1-21 10:29:11 | 显示全部楼层
very good
发表于 2009-2-19 16:18:14 | 显示全部楼层

11

说的不错啊~
发表于 2009-8-7 15:54:37 | 显示全部楼层
谁能解释下这么怎么推导的
头像被屏蔽
发表于 2009-8-7 16:51:06 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-22 12:42 , Processed in 0.025432 second(s), 10 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表