2013-09-10 4 views
0

Я совершенно новичок в verilog, и я должен знать довольно много об этом довольно скоро для курса, который я беру в университете. Поэтому я играю с моей версией DE2 board и quartis2 и изучаю все.Условие Verilog Loop

Я пытаюсь сделать счетчик, который включается и выключается переключателем. Пока счетчик подсчитывает и сбрасывается на основе нажатия клавиши.

Это моя ошибка:

Error (10119): Verilog HDL Loop Statement error at my_first_counter_enable.v(19): loop with non-constant loop condition must terminate within 250 iterations 

Я понимаю, меня прошу предоставить переменный цикл, но даже при этом я получаю сообщение об ошибке. Это мой код:

module my_first_counter_enable(SW,CLOCK_50,LEDR,KEY); 

    input CLOCK_50; 
    input [17:0] SW; 
    input KEY; 

    output [17:0] LEDR; 

    reg [32:0] count; 
    wire reset_n; 
    wire enable; 

    assign reset_n = KEY; 
    assign enable = SW[0]; 
    assign LEDR = count[27:24]; 


    [email protected] (posedge CLOCK_50 or negedge reset_n) begin 
     if(enable) 
      if(!reset_n) 
       count = 0; 
      else 
       count = count + 1; 
    end 

endmodule 

Я надеюсь, что кто-то может указать на мою ошибку в моем цикле и позвольте мне продолжить.

Спасибо!

ответ

3

Я не думаю, что вы хотите использовать while петлю там. Как насчет:

[email protected] (posedge CLOCK_50 or negedge reset_n) begin 
      if(!reset_n) 
       count <= 0; 
      else if (enable) 
       count <= count + 1; 
    end 

Я также добавил неблокирующая задания <=, которые более подходят для синхронной логики.

+0

, хотя это действительно работает и на самом деле многому меня научил (например, это не похоже на другие микропроцессоры, которые я использовал). Я все еще хочу получить цикл while, поскольку это то, что я есть более знакомы. –

+0

Я немного изменил код, и каждый раз, когда я это делаю, я не могу понять, почему я получаю ошибки. Одно такое редактирование - это тот, который я только что опубликовал на этот вопрос. Знаете ли вы, почему, когда я перемещаю if (enable), сбой компиляции? –

0

Название

Ошибка (10119): Verilog HDL Loop Заявление об ошибке на: петли с непостоянной условие цикла должна заканчиваться в пределах итераций Описание

Эта ошибка может появиться в программном обеспечении Quartus® II когда синтез повторяется через цикл в Verilog HDL больше, чем предел цикла синтеза. Этот предел предотвращает потенциальный запуск синтеза в бесконечный цикл. По умолчанию этот предел цикла установлен на 250 итераций.

Обход/Фикс

Чтобы обойти эту ошибку, предел цикл может быть установлен с помощью опции VERILOG_NON_CONSTANT_LOOP_LIMIT в настройках Quartus II File (.qsf). Например:

set_global_assignment -name VERILOG_NON_CONSTANT_LOOP_LIMIT 300

+0

Я тоже это видел, но, вводя его в свой код, я получил ошибку в этой строке кода. –

+0

Как говорится, вам нужно поместить его в файл настроек, а не в свой код. И у вас нет ошибки в вашем коде, вы просто переходите через предел. Так что вам нужно либо увеличить лимит, либо подойти к выбору ответа @toolic :-) –

+0

oh! хорошо, я догадываюсь, что я скучаю понятным. Я рассмотрю настройку, что в моем файле настроек –

2

Блок будет запускаться каждый раз, когда есть положительный фронт часов. Там, где у вас был цикл while, ничего не значит в аппаратном обеспечении, ему все равно понадобятся часы, чтобы управлять флип-флопами.

Хотя петли могут быть использованы в testbeches для привода стимул

integer x; 
initial begin 
    x = 0; 
    while (x<1000) begin 
    data_in = 2**x ; //or stimulus read from file etc ... 
    x=x+1; 
    end 
end 

Я нахожу for петли или repeat быть больше пользы, хотя:

integer x; 
initial begin 
    for (x=0; x<1000; x=x+1) begin 
    data_in = 2**x ; //or stimulus read from file etc ... 
    end 
end 

initial begin 
    repeat(1000) begin 
    data_in = 'z; //stimulus read from file etc (no loop variable)... 
    end 
end 

NB: лично я хотел бы также добавить начать конец на все, чтобы не добавлять лишние строки позже и задаваться вопросом, почему они всегда или никогда не исполняются, особенно в то время как новые для языка. Он также имеет дополнительное преимущество, делая отступы выглядят немного лучше.

[email protected] (posedge CLOCK_50 or negedge reset_n) begin 
    if(!reset_n) begin 
    count <= 'b0; 
    end 
    else if (enable) begin 
    count <= count + 1; 
    end 
end 
+0

очень информативный. Большое спасибо! –

Смежные вопросы