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

+0

извините, что это была опечатка. этот обновленный код дает эту ошибку –

+1

Iterator = iterator + 1 не находится в предложении else, скорее всего, работает только в модели sim, поскольку используются блокирующие назначения. Iterator = 0, не будет выполняться на аппаратном уровне. – Morgan

ответ

3

три (пять) вещей, я заметил:

1) Я хотел бы использовать «или» вместо запятой, чтобы отделить «CLK» и «сброс» в вашем всегда @ заявлении

2) В реальной логике с тактовой частотой вы всегда должны использовать блокирующие назначения для всего, что вы ожидаете, чтобы вывести флопы. Блокирующие назначения должны использоваться только для временных переменных.

3) Вы смешиваете блокирующие и неблокирующие назначения с «выводом». Это определенно нет-нет.

4) Ваш инкремент итератора находится за пределами сброса, если/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

, итак, где я могу увеличить итератор для удаления этой ошибки. –

+0

Сделав« else »частью инструкции сброса, включите шаг приращения, если« итератор » не переворачивается. Ответ отредактирован, чтобы включить код и стилистические исправления. –

+0

Код не будет работать должным образом, если диапазон для итератора не увеличен. '50000000' требует не менее 26 бит, а' итератор' имеет только 24 бита. – Greg