2014-01-18 2 views
1

У меня есть следующий процесс, который, как предполагается право сдвигать свой вклад (INPUT_1) до тех пор, пока не достигнет 0, а затем закончить цикл:Невозможно завершить составление процесса с в то время как цикл

DFF_PROCESS: process (input_0, input_1, input_2, CLK) 
    variable eX : integer; 
    ... 
begin 
    eX := input_1; 
    ... 
    while (eX > 0) loop 
    if (CLK'event and CLK = '1') then 
     ... 
     eX := to_integer(shift_right(to_unsigned(eX,32), 1)); 
    end if; 
    end loop; 
    result <= rE; 
end process; 

Но когда Я пытаюсь скомпилировать его, он не генерирует никаких ошибок, но застрял на ~ 10% от аналитической части & Synthesis. Кажется, что компилятор работает (проверен через ProcessExplorer), однако даже после более чем часа не было никакого прогресса. Может ли кто-нибудь помочь?

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

ответ

2

синтезирование в то время цикла, как правило, плохая идея, и немного подумав покажет, почему ...

Хотя петли не гарантируется прекратить; и число итераций не может обычно быть известно при компиляции (синтезе) - поэтому вы пытаетесь создать аппаратную структуру, размер которой неизвестен до времени выполнения!

Это не будет работать ...

Обычно вам нужно преобразовать цикл While в тесной связи Для контура с локально статическими границами (примерно: может быть определена из этого исходного файла) - который синтезируемый.

В вашем случае вы преобразовываете переменную в 32-разрядную без знака и сдвигаете ее вправо 1 бит за раз: подходящий цикл For будет циклически перебирать биты в 32-битной без знака.

Это не справляется с различными входными значениями: однако условная (if ex = 0 then) внутри цикл будет делать это (и, очевидно, синтезируемый)

Что-то вроде ...

DFF_PROCESS: process (CLK, input_1) 
variable eX : unsigned(31 downto 0); 
    ... 
begin 
    eX := to_unsigned(input_1); 
    ... 
    for i in ex'range loop -- better way of saying 31 downto 0) 
     if rising_edge(clk) then 
      if ex > 0 then 
       ... 
       eX := shift_right(eX, 1); 
      end if; 
     end if; 
    end loop; 
end process; 

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

Есть два пути вперёд: один быстрый (один результат за такт), но генерирует много аппаратного обеспечения, а другой маленький (но это займет 32 тактовых цикла в худшем случае).

Первый разворачивает цикл, генерируя 32 копий тела цикла, чтобы сгенерировать результат в один тактовый цикл:

DFF_PROCESS: process (CLK) 
variable eX : unsigned(31 downto 0); 
    ... 
begin 
    if rising_edge(clk) then 
     eX := to_unsigned(input_1); 
     ... 
     for i in ex'range loop 
      if ex > 0 then -- done 
       ... 
       eX := shift_right(eX, 1); 
      end if; 
     end loop; 
     result <= ... 
    end if; 
end process; 

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

DFF_PROCESS: process (CLK) 
    variable eX : unsigned(31 downto 0); 
    type State_type is (Read, Process); 
    variable State : State_Type; 

begin 
    if rising_edge(clk) then 
     if State = Read then 
     eX := to_unsigned(input_1); 
     State := Process; 
     else 
     if ex = 0 then 
      result <= ... 
      State := Read; 
     else 
      ... 
      eX := shift_right(eX, 1); 
     end if; 
     end if; 
    end if; 
end process; 

(Вы можете добавить состояния, чтобы сделать его ждать, прежде чем читать новое значение, если вы хотите ...)

+0

спасибо за ответ, дал мне действительно некоторое представление. однако даже с предложенными вами изменениями проблема сохраняется: до сих пор не удается завершить компиляцию, получает A & S до 80%. – user3209815

+2

Если это относится к третьей версии, я могу только сделать вывод о наличии проблем с другими (не показанными) частями ваш код. Начните с малого (проверьте выше) и проработайте до разрыва синтеза. –

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