我有一个8位并行CRC32计算器逻辑,可用VHDL。我想仅在 5个有效数据位上计算CRC-32。我怎么能这样做?
我们说“my_data”是:“01010” 但问题是我的CRC计算器会期望8位数据,所以我试图在“my_data”末尾附加3-0,所以它看起来像这样:“01010_000”。通过这样做,我得到错误的CRC32结果。
答案 0 :(得分:1)
将您的五位放在您将输入逻辑的最重要的8位中,使最不重要的三位全为零。独家或0x996495a3
的结果。完成。
您需要将五位放在字节的最高位,因为CRC以最低有效位开始。在您的五位之前提供一组常量位仅会将结果更改为异或或某些常量。 (我们可以将低三位变成任何东西,只要它们总是相同的。那么只有我们排他的常数或结果才会改变。)
您可以通过使用8个零位的CRC对5个零位的CRC进行异或来获得0x996495a3
。
这个C例程计算任意数量零位的标准CRC-32(你正在使用的CRC-32,最后一个或全1):
uint32_t crc32zeros(unsigned zeros) {
uint32_t crc = ~0;
while (zeros--)
crc = crc & 1 ? (crc >> 1) ^ 0xedb88320 : crc >> 1;
return ~crc;
}
然后:
crc32zeros(5) ^ crc32zeros(8) == 0x996495a3
最终的反转不会改变你得到的常数,因为两次反转取消了。我把它包括在内,结果与常用的(可能是最常用的)CRC-32一致。
具有更多计算的替代方案,但允许CRC的任何起始值,将在最后撤消几个零的影响。在这种情况下,将5位保留在最低有效位中,在高3位中保留零,用该字节和任何起始值计算CRC,然后撤消最后三个零的效果。 C中的这个例程可以做到:
uint32_t crc32unzeros(uint32_t crc, unsigned bits) {
crc = ~crc;
while (bits--)
crc = crc & 0x80000000 ? ((crc ^ 0xedb88320) << 1) | 1 : crc << 1;
return ~crc;
}
然后我们举个例子:
crc32unzeros(crc32zeros(8), 3) == crc32zeros(5)
答案 1 :(得分:0)
通常,您不能使用简单的n位并行CRC计算器逻辑来并行计算m位的CRC。它可能在某些特殊情况下工作,具体取决于多项式,数据集,初始值等。所以像@ user1155120已经提到过,你需要一个5位并行CRC32计算器。
如果您需要在不同的位宽上计算并行CRC,通常的解决方案是为您需要计算的每个位宽实现一个n位并行CRC计算器块,并根据您的计算器将计算器块输出多路复用到CRC寄存器位有效/使能信号。