2016-11-30 2 views
0

В настоящее время я пытаюсь скомпилировать коммутатор с использованием двух циклов while. Для петель, функция сдвига и функция журнала не могут быть и речи. Однако, когда я пытаюсь его скомпилировать, он выдает ошибку «loop with non-constant loop conditions» в указанной строке. Условиями while в этой строке являются i < j, где j - N-1, N - параметр. Мой вопрос в том, что, поскольку N является параметром, почему он не действует постоянным даже во время компиляции и, следовательно, считается условием постоянного цикла?В то время как цикл с условиями неконстантного контура, но с использованием параметра

Вот код:

module shifter(input logic [0:0] SW0, SW1, SW2, SW3, SW4, SW5, SW6, SW7, SW8, SW9, SW10, 
       input logic [0:0] KEY0, KEY1, 
        output logic [0:0] LEDG0, LEDG1, LEDG2, LEDG3, LEDG4, LEDG5, LEDG6, LEDG7); 
parameter N=8;   

//receive input from switches 

logic [7:0] bits = '0; 
logic [7:0] out = '0; 
logic [0:0] move = '0; 
logic [2:0] shift = '0; 
logic next = 1; 

always_comb 
    begin 
    bits[7] = SW7[0]; 
    bits[6] = SW6[0]; 
    bits[5] = SW5[0]; 
    bits[4] = SW4[0]; 
    bits[3] = SW3[0]; 
    bits[2] = SW2[0]; 
    bits[1] = SW1[0]; 
    bits[0] = SW0[0]; 
    shift[2] = SW10[0]; 
    shift[1] = SW9[0]; 
    shift[0] = SW8[0]; 
    end 

logic i = 0;  
logic k = 0; 
logic [31:0] j = N - 1; 

[email protected](negedge KEY0) 
    begin 
     k <= shift[2:0]; 
     do 
     begin 
      move <= bits[0]; 
      do 
       begin 
       bits[i] <= bits[next]; 
       i <= i + 1;  
       next <= i + 1; 
       end  
      while (i < j); //<-------indicated line 
      bits[7] <= move; 
      k <= k - 1; 
     end 
     while(k > 0); 
     out <= bits; 
    end 

always_comb 
    begin 
     LEDG0 = out[0]; 
     LEDG1 = out[1]; 
     LEDG2 = out[2]; 
     LEDG3 = out[3]; 
     LEDG4 = out[4]; 
     LEDG5 = out[5]; 
     LEDG6 = out[6]; 
     LEDG7 = out[7]; 
    end 

endmodule 
+0

try 'i <(N-1)' вместо 'i noobuntu

+0

@noobuntu Я попробовал это, он добавил еще одну ошибку, в которой говорилось, что« цикл должен заканчиваться в течение 5000 итераций ». – user7231602

+0

Обычно это делается с помощью for- петля. Почему думаешь, что это не может быть и речи? – toolic

ответ

1

Проблема не с j, вы можете легко исправить, изменив свое заявление в качестве параметра:

parameter j = N -1; 

Реальная проблема с i и что вы используете неблокирующее присвоение для i. Таким образом, while переходит в бесконечный цикл, потому что у (i<j) никогда не будет возможности измениться - это всегда 0.

Вам понадобится другой подход к этой проблеме.

0

Несколько вопросов:

  1. i, k и next определены как один бит. Они не могут содержать значение выше единицы. Объявить их как:

    parameter j = N - 1; 
    bit [$clog2(N):0] next = 1; 
    bit [$clog2(N):0] i = 0; 
    logic [2:0] k = 0; 
    
  2. При назначении i, k и next вам нужно использовать блокирующие назначения (=). Неблокирование (<=) откладывает обновление; каждый цикл будет оцениваться i<j, k>0, i + 1; с их значением до negedge KEY0.

  3. Блокирующие задания также должны быть использованы в ваших присвоений move и bits по той же причине, как i, k и next.

  4. i и next должно быть установлено равным 0 и 1 для каждой петли k.

  5. назначается два разных всегда блока, поэтому он не может синтезироваться.

  6. Цикл k может не статична Раскатайте который также означает, что он не будет синтезировать

Вы можете разрешить пункты 2, 3, 4 и 5, перемещая циклическую логику из [email protected](negedge KEY0) в нижней части always_comb, который уже назначает bits. Затем измените неблокирование на блокировку для перемещенной логики.

Насколько я знаю, не каждый синтезатор поддерживает while-loops. Даже если ваш синтезатор поддерживает while-loops, он должен статически разворачиваться; требование для всех синтезируемых циклов.

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

  • case заявление
  • вниз сдвиг (>>) и арифметика вниз сдвиг (>>>) операторов
  • части -выбор адресации (+:), может также можно назвать диапазон квантованием

Вы также можете прочитать на долото сочленениях (например: {a,b}) и репликаторы (например: {4{1'b1}}).

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