作者paulalien (外星人)
看板comm_and_RF
标题[问题] CRC 错误侦测
时间Wed Jan 2 23:34:14 2008
CRC的运算方法就是利用长除法求得余数
然而硬体设计方式为使用移位暂存器和互斥或闸合成
就是类似一个pncode的方式
然而我想问的是
1:为何使用类似pncode的方式,当资料全部输出完的下一笔资料,就是所谓的余数???
还有如何使长除法跟硬体的想法连结在一起,现在我二者都懂,不过联想不起来,谢谢
2:我使用CRC-3的方式 (X^3+X^2+1)
verilog code大致如下
always @(posedge clk)
begin
if(reset)
data_out<=0;
else
xor_out[0] <= data_out[2] ^ data_in;
xor_out[1] <= data_out[0];
xor_out[2] <= data_out[1] ^ xor_out[0];
data_out <= xor_out;
end
并且在传送端输入10101010
^ ^
| |
msb lsb
经过CRC-3能求得110,所以在接收端的data最後加入110(也就是10101010+110),
再经过CRC-3能求得最後余数为0
代表正确
不过我在使用CRC-4以及CRC-16
均不能解回正解,也就是余数为零,请问是input data bit有限制吗?
还是我哪里弄错了
下面为 CRC-16的code (X^16+X^15+X^2+1)
xor_out[0] = data_out[15] ^ data_in;
xor_out[1] = data_out[0];
xor_out[2] = data_out[1] ^ xor_out[0];
xor_out[3] = data_out[2];
xor_out[4] = data_out[3];
xor_out[5] = data_out[4];
xor_out[6] = data_out[5];
xor_out[7] = data_out[6];
xor_out[8] = data_out[7];
xor_out[9] = data_out[8];
xor_out[10] = data_out[9];
xor_out[11] = data_out[10];
xor_out[12] = data_out[11];
xor_out[13] = data_out[12];
xor_out[14] = data_out[13];
xor_out[15] = data_out[14] ^ xor_out[0];
data_out<=xor_out;
谢谢...
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.217.208.198
1F:→ wildwolf:verilog 里面 <= 与 = 有很大的不同 122.124.7.167 01/03 05:17
2F:→ wildwolf:你做 LFSR 应该用 <= 不然结果会不对 122.124.7.167 01/03 05:18
3F:→ paulalien:我已经改好了,不过结果还是不对,请问 163.13.133.33 01/03 12:04
4F:→ paulalien:是哪里出问题? 谢谢... 163.13.133.33 01/03 12:05
5F:→ paulalien:已解,由於是同时输出,都不能加"<=" 163.13.133.33 01/03 16:02
6F:推 horsehead:你的同时输出是指??? 61.228.74.159 01/03 20:40