2013-03-02 276 views
-1

我在xilinx中编写了一个程序,该代码在ModelSim中编译得很好,但在xilinx中编译时出现此错误。Xilinx中的模板错误

ERROR:Xst:899 - line 78: The logic for <iterator> does not match a known FF or Latch template. The description style you are using to describe a register or latch is not supported in the current software release.

我不知道为什么我收到这个错误。下面是代码:

module BcdCounter(input clk,input reset, output reg [3:0]out 
); 

reg [23:0]iterator; 

always @(posedge clk,negedge reset) 
begin 

if(~reset) 
begin 

out=0; 
iterator=0; 

end 

else 
// clock divider 
if(iterator==50000000) // 50Mhz clock divider 
begin 

out<=out+1; 
iterator=0; 

end 

iterator=iterator+1; 

end 


endmodule 

问候

+1

您正在混合阻塞和非阻塞赋值。这可能与它有关。 – dwikle 2013-03-02 13:59:33

+0

对不起,这是一个错字。此更新后的代码会给出此错误 – 2013-03-02 14:00:49

+1

Iterator = iterator + 1不在else子句中,可能仅适用于模型sim,因为已使用阻止分配。 Iterator = 0,不会在硬件中执行。 – Morgan 2013-03-02 14:14:54

回答

3

三(5个)的事情,我注意到:

1)我会用“或”而不是逗号分隔“CLK”和“复位”在你的“总是@”语句中

2)在实时钟控逻辑中,你应该总是使用阻塞赋值来预测任何你想要推断的触发器。阻塞分配只能用于临时变量。

3)您正在将阻塞和非阻塞赋值混合到'out'。这是一个明确的禁忌。

4)您的迭代器增量超出了复位if/else,这实际上会引发扳机。

5)旁边请缩进你的块。很难判断哪些线与哪些块左对齐相关联。

module BcdCounter (
    input   clk, 
    input   reset, 
    output reg [3:0] out 
); 

reg [23:0] iterator; 

always @(posedge clk or negedge reset) begin 
    if(!reset) begin 
     out  <= 0; 
     iterator <= 0; 
    end else begin 
     // 50MHz clock divider 
     if (iterator == 50000000) begin 
     out  <= out + 1; 
     iterator <= 0; 
     end else begin 
     iterator <= iterator + 1; 
     end 
    end 
end 

endmodule 
+0

所以我可以在哪里增加迭代器以消除这个错误 – 2013-03-02 17:39:41

+0

通过使复位语句的'else'部分包含增量步骤,如果'iterator'没有翻身。编辑回答包括代码和文体修复。 – 2013-03-02 23:33:36

+0

除非'iterator'的范围增加,否则代码将无法正常运行。 '50000000'需要至少26位,'迭代器'只有24位。 – Greg 2013-03-05 02:07:19