2015-03-31 2 views
0

Я пытаюсь использовать цикл for с динамической переменной для хранения элементов в массиве. Но когда я синтезирую код, он дает мне ошибку для динамической переменной. Вот код, который отлично работает в modelsim. С его просто одновременным, но я хочу загрузить этот код на целевое устройство FPGA.Как использовать динамическую переменную в xilinx

`define LENGTH 16  //length of array elements 
`define WIDTH 8   //width of element in array 

module multi; 

integer i,j,k,f,l,n=0; 
integer r=0; 
integer c; 

reg [`WIDTH-1:0] reuse [0:(`LENGTH/2)-1]; 
reg [`WIDTH-1:0] local [0:`LENGTH-1]; 
reg [`WIDTH-1:0] arr [0:`LENGTH-1]; 

initial 
begin 
    $readmemh("block.txt", arr); 

    for(i=0;i<`LENGTH;i=i+1)begin 
     c=0; 
     for(l=0;l<r;l=l+1)begin 
      if(reuse[l] ==arr[i])begin 
       c=c+1; 
      end 
     end 
     if(c==0)begin 
      f=0; 
      for(j=0;j<n;j=j+1)begin 
       if(local[j]==arr[i])begin 
       reuse[r]=arr[i]; 
       r=r+1; 
       f=1; 
        for(k=j;k<n-1;k=k+1)begin 
        local[k]=local[k+1]; 
        end 
        local[n-1]=4'hx; 
        n=n-1; 
       end 
      end 
      if(f==0)begin 
       local[n]=arr[i]; 
       n=n+1; 
      end 
     end 
    end 
    $display("reuse:"); 
    for (i=0; i < (`LENGTH/2); i=i+1) 
     $display("%d:%h",i,reuse[i]); 
    $display("local:"); 
    for (i=0; i < `LENGTH; i=i+1) 
     $display("%d:%h",i,local[i]); 
end 
endmodule 
+2

Какое оборудование может быть создано, когда цикл for имеет переменное число итераций. – Morgan

+0

Модуль не имеет входных и выходных портов, поэтому он будет синтезироваться ни к чему. Блоки 'initial' не описывают логику, они инициализируют ваши значения по умолчанию. Блоки 'always' описывают логику. – Greg

+0

То, что я пытаюсь сделать в этом коде, состоит в том, чтобы выделить многократно повторяющиеся элементы в массиве 'reuse' из 'arr'. Для проверки того, присутствует ли элемент в повторном использовании или нет, я поставил этот цикл. Если я делаю это с фиксированной длиной, я теряю свои проверки в не существующих элементах массива, если они есть. –

ответ

1

Существует принципиальное различие между написанием поведенческого кода Verilog и RTL Verilog кода (т.е. синтезируемого кода, который будет реализован в ASIC или FPGA). Для RTL важно помнить, что вы используете Verilog как язык описания аппаратного обеспечения, а не просто другую альтернативу C или множеству других языков программирования. Поэтому вам нужно иметь в виду, какое оборудование вы пытаетесь описать. Реальные аппаратные модули и чипы имеют входы и выходы, поэтому вы должны их указать. Если у вас нет каких-либо выходов, логический синтезатор будет с радостью оптимизировать весь ваш код, потому что модуль не нуждается в каком-либо из них, если есть выход. Поэтому вам нужно указать ввод-вывод.

Вам не нужно беспокоиться о восстановлении логики и картах Карно; механизм синтеза сделает такую ​​оптимизацию для комбинаторной логики для вас. Но у вас должно быть некоторое представление о том, какое хранилище вы пытаетесь реализовать (регистры, защелки, RAM, ROM) и о том, как облака комбинаторной логики будут подключаться к нему. Для всей синхронной логики требуются часы для управления этими элементами памяти. У вас должен быть какой-то план того, как результаты каждого этапа логики получаются конвейеризованными по вашему дизайну, даже если это всего лишь приблизительный эскиз. Синхронная логика должна быть определена внутри «всегда» блока с часами в списке чувствительности. Исходные блоки обычно не используются для аппаратного обеспечения (исключение: некоторые ПЛИС позволяют использовать начальные блоки для указания состояния питания ОЗУ, что не может быть сделано с ASIC).

И, наконец, настоящие аппаратные средства не приходят и не уходят. Вы можете создать модуль с параметризацией, который реализует достаточно логику для определенной функции, но вы не можете изменить количество логики в существовании во время выполнения, как вы пытаетесь сделать в этом коде. Параметрированные структуры допускаются в RTL, динамические структуры не существуют, так как нет способа создать новую логику после того, как проект был синтезирован. Если вам нужно что-то изменить размер «на лету», вам нужно будет составить код самого большого дизайна, который вам нужен, и выборочно использовать его подразделы во время работы.

+0

Спасибо за ваши комментарии, через которые я сейчас исправил свою ошибку. –

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