这是我用于CRC校正的verilog代码,
module cor(m,err);
input m;
output err;
reg [10:0]data; // message and zeros concatenated
reg [7:0]poly; // polynomial equivalent
reg [15:0]err; //xor output
reg [3:0]cnt; // counter
reg [2:0]n; // zeros
wire [7:0]m;
reg [7:0]poly1; // copy of polynomial equivalent
reg [15:0]f; //shifted polynomial
//wire a;
reg [2:0]a;
initial a <= 3'b000;
initial cnt = 4'b1000;
//initial data <= {m,n};
initial poly1<= poly;
//always_comb
always @ (m or poly)
begin
data <= {m,n};
poly1 <= poly;
//data <= {m,n};
err <= data[7:0]^poly1;
while(!cnt[2:0] == 0)
begin
if(err == 4||5||6||7)begin
f <= poly1>>1;
cnt <=cnt-1;
err <= data^f;
err <= err<<1;
end
else if(err[7:4]== 2||3) begin
f <= poly1>>2;
cnt <= cnt-2;
err <= data^poly1;
err = err <<2;
end
else if(err[7:4]== 1) begin
f <= poly1>>3;
cnt <= cnt-3;
err <= data^poly1;
err <= err <<3;
end
else if(err[7:4]== 4'b0000)begin
f <= poly1>>4;
cnt <= cnt-4;
err <= data^poly1;
err <=err <<4;
end
else
err <= data^poly1;
end
if(err[7:4]==4'b0000) //checking remainder? zero
$display("no error detected");
else
$display("error detected");
err <= data^poly1; // correcting error
end
endmodule
我无法合成xst
错误是:
时不支持非恒定循环条件这里我认为我不能使用for循环,因为它在每次迭代后都不是线性增量(+1),(我没错?)
请建议我合成它的其他方法!!
提前致谢 Madhav(VLSI学生)
答案 0 :(得分:0)
这里我认为我不能用于循环,因为它不是线性增量 (+1)每次迭代后,(我没错?)
你不能使用你的while
循环,因为在编译时无法计算迭代次数:保持循环的条件是cnt[2:0]
不等于零,所以数量为循环迭代(0到7)只能在电路工作且值存储到cnt[2:0]
时才能知道。只有迭代一定次数的循环才是可合成的,因为XST用于合成这种循环的方式是展开它们。
请建议我合成它的其他方法!!
您必须选择FSM
设计,其输入值为当前值cnt
,当前值为err
。
顺便说一下:源代码中存在许多编码错误。其中之一是:
if(err == 4||5||6||7)begin
当你假装时,这并不是“如果错误等于四,五,六或七......”。
你必须像这样编码:
if ( err == 4 || err == 5|| err == 6 || err == 7 ) begin