2017-01-24 5 views
0

У меня есть эта часть кода, которая не синтезируется, потому что количество циклов, выполняемых циклом, не является определенным. Я начинаю с VHDL, как я могу преобразовать его в синтезируемую форму? Примечание: Я пробовал делать это с циклом for, также как и оператор break, но он по-прежнему не синтезируется из-за инструкции break. код ниже, чтобы вычислить значение ЭИ таким образом, что наибольший общий делитель ЭИ и Пхи 1.Как сделать цикл, без определенных ограничений, синтезируемый?

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 
entity gcd11 is 
Port (ee : out integer; 
     Phi : in integer); 
     --gc : out integer); 
end gcd11; 

architecture Behavioral of gcd11 is 
signal rem1,dd,dv,gc,temp: integer; 
begin 
process(temp,Phi,rem1,dd,dv,gc) 
begin 
gc<=2; 
temp<=1; 
while(gc/=1) loop 
    temp<=temp+1; 
    rem1<=1; 
    if (temp<Phi)then 
     dd<=Phi; 
     dv<=temp; 
     elsif(temp>=Phi) then 
     dd<=temp; 
     dv<=Phi; 
    end if; 
    while(rem1/=0) loop 
     rem1<= dd mod dv; 
     dd<=dv; 
     gc<=dv; 
     dv<=rem1; 
    end loop; 
end loop; 
ee<=temp; 
end process; 
end Behavioral; 
+1

Несколько комментариев - 1) У вас нет часов, 2) Не используйте неограниченные целые числа (будет выводить больше оборудования, чем требуется), 3) Избегайте деления/мод на FPGA (попробуйте, если это возможно, пересмотреть проблему), 4), в то время как петли обычно не являются синтезируемыми (это ваш вопрос). Что касается циклов while, они эффективно: 1) проверяют состояние, 2) делают что-то, 3) goto (1) или заканчивают. Вы должны иметь возможность реализовать основные функции в процессе и проверить флаг (ы) на входе или использовать конечный автомат для «эмулирования» цикла while – gsm

ответ

1

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

Рядом с этим-основном это, что не позволит вам синтез:

петля: Важно понимать, что цикл VHDL не перебирать, как цикл программного обеспечения, но развернувшаяся в процессе синтеза и в результате логика (все итерации) будет выполняться как параллельные аппаратные блоки

Это означает, что если у вас есть цикл цикла, который будет работать 8 раз, описанная схема будет создана 8 раз. Follwing цикл будет создавать-параллельно «И» ворота каждый из которых принимает 1 битых входной сигнал от шины A и 1 бит от сигнала B.

for I in 0 to 7 loop 
    Z(I) <= A(I) and B; 
end loop; 

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

mod: Функция Modulo вообще не подходит для синтизиса. Только если ваши операнды (входы) фиксированы (synthisis можно рассчитать выходную авансом) или у вас есть заявление, напоминающий код ниже синтезатор позволит. (Моды с мощностью 2)

z <= y mod 2**x 

signal declartion: В VHDL, который должен быть синтезирован, вам нужно сообщить инструменту, как «большой» (чтение: сколько бит) сигнала. Общепринятой практикой является не использование объявления с тупым целым числом, а использование типа std_logic_vector целого числа заданного диапазона. сигнал x: std_logic_vector (31 до 0); сигнал y: целочисленный диапазон от 1 до 31;

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