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