You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 18:03:12