这是如何使用多项式计算 CRC-A - x^16 + x^12 + x^5 + 1

How is this calculating CRC-A using polynomial - x^16 + x^12 + x^5 + 1

我看到了这段代码。但我不确定这里的 CRC 是如何计算的。我知道计算 CRC 的理论方法,但我想这里可能使用了某种不同的逻辑。请指正。

r_o[14:13] <= r_o[13:12];
r_o[12]    <= r_o[11]^r_o[15]^x16;
r_o[11]    <= r_o[10];
r_o[10:6]  <= r_o[9:5];
r_o[5]     <= r_o[4]^r_o[15]^x16;
r_o[4]     <= r_o[3];
r_o[3:1]   <= r_o[2:0];
r_o[0]     <= r_o[15]^x16;

好吧,如果你知道理论上的方法,我们可以从

开始

假设 u 是输入位,并且每次迭代计算 r = r * x + u*x^16,请记住在给定的环 x^16 = x^12 + x^5 + 1 中,直接实现将是

parameter X16_MASK = 16'h1021; // (1 << 12) ^ (1 << 5) ^ 1
function [15:0] step(input [15:0] prev_state, input u);
  logic [15:0] state;
begin
  
  state = {prev_state[14:0], 1'b0};
  if(state[15]) state = state ^ X16_MASK;
  if(u) state = state ^ X16_MASK;
  step = state;
end
endfunction

这个可以简单写成{r_o[14:0], 1'b0} ^ (X16_MASK * (r_o[15] ^ u)),让综合优化什么都行,应该可以简化1位信号的乘法。现在检查遮罩影响的位置,您将获得上面的作业。

我会简化

r_o[11]    <= r_o[10];
r_o[10:6]  <= r_o[9:5];

r_o[11:6] = r_o[10:5]

r_o[4]     <= r_o[3];
r_o[3:1]   <= r_o[2:0];

r_o[4:1] = r_o[3:0]

在您提供的代码中,我遗漏了对 r_o[15] 的赋值。

所以你可以说

r_o[15:13] <= r_o[14:12];
r_o[12]    <= r_o[11]^r_o[15]^x16;
r_o[11:6]  <= r_o[10:5];
r_o[5]     <= r_o[4]^r_o[15]^x16;
r_o[4:1]   <= r_o[3:0];
r_o[0]     <= r_o[15]^x16;

如果你喜欢一个线性位封装

r_o <= {r_o[14:12], r_o[11]^r_o[15]^x16, r_o[10:5], r_o[4]^r_o[15]^x16,r_o[3:0], r_o[15]^x16}