2013-03-02 42 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