Я проектирую относительно простой арбитр памяти с двумя состояниями.VHDL - логический синтезируемый
- Состояние 1: Порт 1 соединен с памятью (состояние по умолчанию)
- Состояние 2: Порт 2 подключен к памяти (только при наличии запросов)
при моделировании в ModelSim отлично работает и доказывает, что мой арбитр работает по мере необходимости. Однако мне сказали, что код, который я написал, не синтезируется. Я включил код соответствующего процесса ниже.
Сигнал включения по запросу высок, а низкий сигнал подтверждения подтверждает, что порт был подан. Требование состоит в том, что если есть два одновременных запроса, порт 2 должен быть подключен. Однако, если порт 1 уже подключен из-за предыдущего запроса, порт 2 должен ждать, пока порт 1 не будет обслуживаться.
Мои вопросы:
- Какие проблемы с кодом, который я написал (и почему)?
- Что бы ваш подход для создания этого кода синтезируемый (не aksing для окончательного решения, но мы надеемся, полезные подсказки)
Из-за проблемы с форматированием кодовую часть этого поста я 'также включил код как изображение.
transition: process (clk)
begin
if rising_edge(clk) then
if reset = '1' then
state <= port1;
else
if (state = port1) and (req_p2.enable='1') and
(req_p1.enable='0' or rising_edge(req_p1.enable)) then
state <= port2;
elsif(state = port2) and (req_p2.enable='0') then
state <= port1;
end if;
end if;
end if;
end process;
Выглядит синтезируемо для меня. Синтезируйте его и сообщите о любых реальных проблемах (а не «Мне сказали») здесь. Я предполагаю, что что-то на самом деле * использует * 'state', иначе, после синтеза, он будет оптимизирован ни к чему. –