FPGA上CRC32 MPEG-2算法的优化实现咨询
FPGA上CRC32 MPEG-2算法的优化实现咨询
我正在尝试在FPGA上实现CRC32 MPEG-2算法,先给大家看看我用C++写的参考实现,这是STM32F7默认的以太网CRC32版本:
/* STM32F7 default CRC-32 (Ethernet) */ #define CRC32_POLY 0x04C11DB7u #define CRC32_INIT 0xFFFFFFFFu uint32_t crc32_stm32_words(const uint32_t *data, uint32_t word_count) { uint32_t crc = CRC32_INIT; for (uint32_t i = 0; i < word_count; i++) { crc ^= data[i]; // WORD XOR (no bit/byte reflection) for (int bit = 0; bit < 32; bit++) { if (crc & 0x80000000u) crc = (crc << 1) ^ CRC32_POLY; else crc <<= 1; } } return crc; }
把它转换成SystemVerilog的经典实现也不算难,代码如下:
always_comb begin // Classic temp = din; temp = temp ^ INIT; for(int i = 0; i < ITER; i++) begin temp = step(temp); end dout = temp; end function automatic logic [WIDTH - 1:0] step(logic [WIDTH - 1:0] crc_next); logic msb; msb = crc_next[WIDTH - 1]; return (crc_next << 1) ^ (POLY & {WIDTH{msb}}); endfunction
不过我想进一步优化它,经过一番研究后,我了解到CRC本质上是多项式除法。用MATLAB我算出了MASK值,把算法简化成了仅由异或门组成的网络:
MASK[0] = 'hF7011641; MASK[1] = 'h19033AC3; MASK[2] = 'hC50763C7; MASK[3] = 'h8A0EC78E; ... MASK[31] = 'hFB808B20;
对应的新SystemVerilog实现如下:
always_comb begin temp = din; temp = temp ^ INIT; for(int i = 0; i < WIDTH; i++) begin dout_d[i] = ^(temp & MASK[i]); end end
我原本以为这种替代移位操作的纯异或门实现能优化资源占用,但综合设计后发现,两种实现的资源消耗几乎完全一样,完全没达到预期的优化效果。
所以我想请教各位,有没有更好的方法来优化这个CRC32 MPEG-2的FPGA实现呢?
备注:内容来源于stack exchange,提问作者stackwryd
相关产品推荐
相关产品推荐

