这是我用于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
错误为:while不支持非恒定循环条件
在这里,我认为我不能使用for循环,因为它不是每次迭代后的线性增量(+1),(我没有错吗?)
请给我推荐其他合成方法!!
提前感谢Madhav(超大规模集成电路学生)
这里我认为我不能使用for循环,因为它不是线性增量(+1)每次迭代后,(我没有错吗?)
您不能使用while
循环,因为在编译时无法计算迭代次数:保持循环的条件是cnt[2:0]
不等于零,因此只有当电路工作并且值存储到cnt[2:0]
中时,才能知道要迭代的循环次数(0到7)。只有迭代次数不变的循环才是可合成的,因为XST合成这些循环的方法是展开它们。
请建议我其他方法来合成它!!
您必须选择FSM
设计,其输入是cnt
的当前值和err
的当前值。
顺便说一句:源代码中有很多编码错误。其中之一是:
if(err == 4||5||6||7)begin
这并不像你假装的那样读作"如果err等于四、五、六或七,那么…"。
你必须这样编码:
if ( err == 4 || err == 5|| err == 6 || err == 7 ) begin