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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 4940|回复: 8

[求助] 关于crc移位寄存器的设计

[复制链接]
发表于 2012-8-21 22:57:13 | 显示全部楼层 |阅读模式

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

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

x
最近刚接触CRC,有点疑惑,比如下面的代码。
module serial_crc_ccitt (
clk     ,
reset   ,
enable  ,
init    ,  
data_in ,  
crc_out
);
//-----------Input Ports---------------
input clk     ;
input reset   ;
input enable  ;
input init    ;
input data_in ;
//-----------Output Ports---------------
output [15:0] crc_out;
//------------Internal Variables--------
reg   [15:0] lfsr;
//-------------Code Start-----------------
assign crc_out = lfsr;
// Logic to CRC Calculation
always @ (posedge clk)
if (reset) begin
   lfsr <= 16'hFFFF;
end else if (enable) begin
   if (init) begin
     lfsr <=  16'hFFFF;
   end else begin
     lfsr[0]  <= data_in ^ lfsr[15];
     lfsr[1]  <= lfsr[0];
     lfsr[2]  <= lfsr[1];
     lfsr[3]  <= lfsr[2];
     lfsr[4]  <= lfsr[3];
     lfsr[5]  <= lfsr[4] ^ data_in ^ lfsr[15];// ????????????????
     lfsr[6]  <= lfsr[5];
     lfsr[7]  <= lfsr[6];
     lfsr[8]  <= lfsr[7];
     lfsr[9]  <= lfsr[8];
     lfsr[10] <= lfsr[9];
     lfsr[11] <= lfsr[10];
     lfsr[12] <= lfsr[11] ^ data_in ^ lfsr[15];//???????????????????????
     lfsr[13] <= lfsr[12];
     lfsr[14] <= lfsr[13];
     lfsr[15] <= lfsr[14];
   end
end  


endmodule
其中的两行  lfsr[5]  <= lfsr[4] ^ data_in ^ lfsr[15];
     lfsr[12] <= lfsr[11] ^ data_in ^ lfsr[15];
为什么lfsr[4]和lfsr[11]要和(data_in ^ lfsr[15])异或呢?不是应该和lfsr[15]异或吗?
比如如果lfsr[15]是0,就应该直接移位不做除法。但如果data_in是1,lfsr[4]和lfsr[11]就会和1异或,而不是直接移位。
发表于 2012-8-22 08:35:31 | 显示全部楼层
有个软件,把这种LFSR描述的很形象,有图,很直观,还可以自动生成代码和相应序列什么的~~
“LFSR 代码自动生成工具v1.2”
http://www.fpga.com.cn/freeip.htm#others
 楼主| 发表于 2012-8-22 22:40:15 | 显示全部楼层
原理是什么呢
发表于 2012-8-23 17:59:13 | 显示全部楼层
去看一下CRC算法的原理图就明白是怎么回事了。
 楼主| 发表于 2012-8-23 23:09:36 | 显示全部楼层
如果lfsr[15]是0,就应该直接移位不做除法。但如果data_in是1,lfsr[4]和lfsr[11]就会和1异或,而不是直接移位。 这不就和crc算法不一致了吗?
 楼主| 发表于 2012-8-23 23:13:05 | 显示全部楼层
是不是应该写成
always @ (posedge clk)
if (reset) begin
   lfsr <= 16'hFFFF;
end else if (enable) begin
   if (init) begin
     lfsr <=  16'hFFFF;
   end else begin
     lfsr[0]  <= data_in ^ lfsr[15];
     lfsr[1]  <= lfsr[0];
     lfsr[2]  <= lfsr[1];
     lfsr[3]  <= lfsr[2];
     lfsr[4]  <= lfsr[3];
     lfsr[5]  <= lfsr[4] ^ lfsr[15];
     lfsr[6]  <= lfsr[5];
     lfsr[7]  <= lfsr[6];
     lfsr[8]  <= lfsr[7];
     lfsr[9]  <= lfsr[8];
     lfsr[10] <= lfsr[9];
     lfsr[11] <= lfsr[10];
     lfsr[12] <= lfsr[11] ^ lfsr[15];
     lfsr[13] <= lfsr[12];
     lfsr[14] <= lfsr[13];
     lfsr[15] <= lfsr[14];
   end
end
发表于 2012-8-24 09:55:30 | 显示全部楼层
看一下CRC的多项试,把那个抽头的图话出来就可以理解了
 楼主| 发表于 2012-8-24 22:10:13 | 显示全部楼层
本帖最后由 xlong 于 2012-8-24 22:11 编辑

无标题.jpg
无标题2.jpg
G=x3+x+1
这两种结构等价吗
发表于 2012-10-10 22:08:01 | 显示全部楼层
回复 8# xlong

假设计算CRC16,第一个图对应的输入数据应该是{data_in,16'b0}串行输入,第二个图对应的输入数据就是data_in的串行输入,第一个原理好明白,但是第二个还没搞清楚,这两个图都是正确的,但是输入数据不同
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

×

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

GMT+8, 2024-5-6 05:27 , Processed in 0.027366 second(s), 7 queries , Gzip On, Redis On.

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