【发布时间】:2018-06-22 14:11:30
【问题描述】:
我在 Verilog 中实现了一个伽罗瓦线性反馈移位寄存器(以及在 MATLAB 中,主要是为了模拟 HDL 设计)。它运行良好,据我所知,我使用 MATLAB 计算 CRC-32 字段,然后将它们包含在我的 HDL 模拟中以验证数据包是否正确到达(使用 CRC-32 填充数据),这会产生良好的结果。
问题是我希望能够计算我在软件中实现的 CRC-32,因为我将使用 Raspberry Pi 通过 FPGA 中的 GPIO 输入数据,但我无法这样做。我试过this online calculator,使用相同的参数,但从来没有得到相同的结果。
这是我用来计算 CRC-32 的 MATLAB 代码:
N = 74*16;
data = [round(rand(1,N)) zeros(1,32)];
lfsr = ones(1,32);
next_lfsr = zeros(1,32);
for i = 1:length(data)
next_lfsr(1) = lfsr(2);
next_lfsr(2) = lfsr(3);
next_lfsr(3) = lfsr(4);
next_lfsr(4) = lfsr(5);
next_lfsr(5) = lfsr(6);
next_lfsr(6) = xor(lfsr(7),lfsr(1));
next_lfsr(7) = lfsr(8);
next_lfsr(8) = lfsr(9);
next_lfsr(9) = xor(lfsr(10),lfsr(1));
next_lfsr(10) = xor(lfsr(11),lfsr(1));
next_lfsr(11) = lfsr(12);
next_lfsr(12) = lfsr(13);
next_lfsr(13) = lfsr(14);
next_lfsr(14) = lfsr(15);
next_lfsr(15) = lfsr(16);
next_lfsr(16) = xor(lfsr(17), lfsr(1));
next_lfsr(17) = lfsr(18);
next_lfsr(18) = lfsr(19);
next_lfsr(19) = lfsr(20);
next_lfsr(20) = xor(lfsr(21),lfsr(1));
next_lfsr(21) = xor(lfsr(22),lfsr(1));
next_lfsr(22) = xor(lfsr(23),lfsr(1));
next_lfsr(23) = lfsr(24);
next_lfsr(24) = xor(lfsr(25), lfsr(1));
next_lfsr(25) = xor(lfsr(26), lfsr(1));
next_lfsr(26) = lfsr(27);
next_lfsr(27) = xor(lfsr(28), lfsr(1));
next_lfsr(28) = xor(lfsr(29), lfsr(1));
next_lfsr(29) = lfsr(30);
next_lfsr(30) = xor(lfsr(31), lfsr(1));
next_lfsr(31) = xor(lfsr(32), lfsr(1));
next_lfsr(32) = xor(data2(i), lfsr(1));
lfsr = next_lfsr;
end
crc32 = lfsr;
请看,我首先使用 32 个零填充来计算 CRC-32(LFSR 最后剩下的就是我的 CRC-32,如果我这样做,用这个 CRC-32 替换零,我的LFSR最后也变空了,就是验证通过了)。
我使用的多项式是 CRC-32 的标准:04C11DB7。另请参阅顺序似乎是颠倒的,但这只是因为它被镜像为在 MSB 中具有输入。当输入相同时,使用这种表示和镜像的结果相同,只是结果也会被镜像。
任何想法都会有很大帮助。
提前致谢
【问题讨论】: