如何使用8位并行CRC计算器计算5位有效数据的CRC32?

时间:2016-11-28 09:09:15

标签: vhdl crc32

我有一个8位并行CRC32计算器逻辑,可用VHDL。我想仅在 5个有效数据位上计算CRC-32。我怎么能这样做?

我们说“my_data”是:“01010” 但问题是我的CRC计算器会期望8位数据,所以我试图在“my_data”末尾附加3-0,所以它看起来像这样:“01010_000”。通过这样做,我得到错误的CRC32结果。

2 个答案:

答案 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寄存器位有效/使能信号。