синтезирование в то время цикла, как правило, плохая идея, и немного подумав покажет, почему ...
Хотя петли не гарантируется прекратить; и число итераций не может обычно быть известно при компиляции (синтезе) - поэтому вы пытаетесь создать аппаратную структуру, размер которой неизвестен до времени выполнения!
Это не будет работать ...
Обычно вам нужно преобразовать цикл 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;
(Вы можете добавить состояния, чтобы сделать его ждать, прежде чем читать новое значение, если вы хотите ...)
спасибо за ответ, дал мне действительно некоторое представление. однако даже с предложенными вами изменениями проблема сохраняется: до сих пор не удается завершить компиляцию, получает A & S до 80%. – user3209815
Если это относится к третьей версии, я могу только сделать вывод о наличии проблем с другими (не показанными) частями ваш код. Начните с малого (проверьте выше) и проработайте до разрыва синтеза. –