微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 关于crc移位寄存器的设计

关于crc移位寄存器的设计

时间:10-02 整理:3721RD 点击:
最近刚接触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异或,而不是直接移位。

有个软件,把这种LFSR描述的很形象,有图,很直观,还可以自动生成代码和相应序列什么的
“LFSR 代码自动生成工具v1.2”
http://www.fpga.com.cn/freeip.htm#others

原理是什么呢

去看一下CRC算法的原理图就明白是怎么回事了。

如果lfsr[15]是0,就应该直接移位不做除法。但如果data_in是1,lfsr[4]和lfsr[11]就会和1异或,而不是直接移位。 这不就和crc算法不一致了吗?

是不是应该写成
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

看一下CRC的多项试,把那个抽头的图话出来就可以理解了







G=x3+x+1
这两种结构等价吗


假设计算CRC16,第一个图对应的输入数据应该是{data_in,16'b0}串行输入,第二个图对应的输入数据就是data_in的串行输入,第一个原理好明白,但是第二个还没搞清楚,这两个图都是正确的,但是输入数据不同

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top