这是如何使用多项式计算 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}
我看到了这段代码。但我不确定这里的 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}