2016-11-22 2 views
0

Я проектирую относительно простой арбитр памяти с двумя состояниями.VHDL - логический синтезируемый

  • Состояние 1: Порт 1 соединен с памятью (состояние по умолчанию)
  • Состояние 2: Порт 2 подключен к памяти (только при наличии запросов)

при моделировании в ModelSim отлично работает и доказывает, что мой арбитр работает по мере необходимости. Однако мне сказали, что код, который я написал, не синтезируется. Я включил код соответствующего процесса ниже.

Сигнал включения по запросу высок, а низкий сигнал подтверждения подтверждает, что порт был подан. Требование состоит в том, что если есть два одновременных запроса, порт 2 должен быть подключен. Однако, если порт 1 уже подключен из-за предыдущего запроса, порт 2 должен ждать, пока порт 1 не будет обслуживаться.

Мои вопросы:

  1. Какие проблемы с кодом, который я написал (и почему)?
  2. Что бы ваш подход для создания этого кода синтезируемый (не aksing для окончательного решения, но мы надеемся, полезные подсказки)

the relevant process' code

Из-за проблемы с форматированием кодовую часть этого поста я 'также включил код как изображение.

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; 
+1

Выглядит синтезируемо для меня. Синтезируйте его и сообщите о любых реальных проблемах (а не «Мне сказали») здесь. Я предполагаю, что что-то на самом деле * использует * 'state', иначе, после синтеза, он будет оптимизирован ни к чему. –

ответ

2

Эта линия код не синтезируемый:

rising_edge(req_p1.enable) 

Чтобы сделать это синтезируемый вам нужно заменить функцию rising_edge с некоторой фактической логики, которая обнаруживает нарастающий фронт - это синхронный рост краевой детектор. Что-то вдоль линий это должно работать (я не знаю ваших требований):

sync_rising_edge: process (clk) 
begin 
    if rising_edge(clk) then 
    if reset = '1' then  
     req_p1_enable_d <= '0'; 
    else 
     req_p1_enable_d <= req_p1.enable; 
    end if; 
    end if; 
end process; 

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 (req_p1_enable_d = '0' and req_p1.enable = '1')) then 
        state <= port2; 

       elsif(state = port2) and (req_p2.enable='0') then 
        state <= port1; 
       end if; 
      end if; 

     end if; 
end process; 

rising_edge функция синтезируемый, если она используется обычным способом внутри с тактовой частотой процесса. См. my answer here.

+1

Чтобы уточнить, 'rising_edge (req_p1.enable)' может быть синтезирован сам по себе, но вопрос имеет значение 'if rising_edge (clk), а затем if (rising_edge (req_p1.enable)) then', то есть два вложенных кромки , и это то, что не является синтезируемым (комментируя в интересах искателя) –

+0

Спасибо @scary_jeff. Я уточню свой ответ. –

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