2013-03-19 3 views
2

У меня есть код VHDL, который использует havily синтаксис: благородные предшественникиКак я могу сделать этот код VHDL синтезируемым?

 signal_1 <= (others => '0')  when cau_state = st_idle  else 
        signal_2 - signal_3 when cau_state = st_cycle_1 else 
        signal_4    when cau_state = st_cycle_2 else 
        signal_5    when cau_state = st_cycle_3 else 
        signal_6    when cau_state = st_cycle_4 else 
        signal_1; 

Где cau_state сигнал, который содержит текущее состояние. Этот синтаксис работал в симуляции на Model-Sim, и все работало нормально. Но когда я хотел записать код в FPGA, код не синтезировался на 32-битной версии Altera Quartus II. 12.1 И я получил парование сообщения об ошибках:

Warning (13012): Latch CAU:uut|cross_3_sig[0][31] has unsafe behavior 
Warning (13013): Ports D and ENA on the latch are fed by the same signal CAU:uut|cau_state.st_cycle_2 
Warning (13012): Latch CAU:uut|cross_3_sig[0][30] has unsafe behavior 
Warning (13013): Ports D and ENA on the latch are fed by the same signal CAU:uut|cau_state.st_cycle_2 

я получаю эти сообщения для многих сигналов, но НЕ для всех сигналов, которые используют этот синтаксис. И для сигнала, который получает это сообщение, я получаю его для всех его бит: cross_3_sig[0][31] до cross_3_sig[0][0]. Синтаксис для сигнала cross_3_sig(0) является:

constant WIDTH   : integer := 32; 
... 
subtype scalar   is std_logic_vector((WIDTH-1) downto 0);         
type vector_nd  is array (natural range <>) of scalar; 
subtype vector_3d  is vector_nd(2 downto 0); 
... 
signal cross_3_sig   : vector_3d; 
... 
cross_3_sig(0)  <= sum_mults_out_sig    when cau_state = st_cycle_2 else    
         mult1_out_sig - mult2_out_sig when cau_state = st_cycle_9 else       
         cross_3_sig(0); 

И есть некоторые места, где я назначу cross_3_sig(0) в другие сигналы, т.е .:

numer_sig   <= C_ZERO - cross_3_sig(0) & (16 downto 0 => '0'); 
mult1_in2_sig  <= (others => '0') when cau_state = st_idle  else 
         ... 
         cross_3_sig(0) when cau_state = st_cycle_11 else 
         ... 

В чем проблема, и как я могу это исправить?

ответ

3

Проблема заключается в том, что эта форма выражения создает защелку (которая чувствительна к глюкам на ее управляющем сигнале), а кроме того, это защелка с несколькими управляющими сигналами, для которых нет прямого эквивалента в реальном оборудовании.

signal_1 <= (others => '0')  when cau_state = st_idle  else 
       ... 
       signal_6    when cau_state = st_cycle_4 else 
       signal_1; 

Каждый раз, когда вы видите (за пределами синхронизированного процесса) что-то вроде

signal_1 <= ... else signal_1; 

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

Правильное использование для этой модели является как мультиплексор, а не как память,

output_1 <= input_1 when ... else 
      input_2 when ... else 
      input_n; 

Правильным способом помнить старое значение SIGNAL1 является синхронизированным процессом, например,

process (clk) 
begin 
    if rising_edge(clk) then 
     if cau_state = st_idle then signal_1 <= (others => '0') 
     ... 
     elsif cau_state = st_cycle_4 then signal_1 <= signal_6; 
     end if; 
    end if; 
end process; 

Без назначений сигнал_1 будет поддерживать текущее значение.

Или лучше альтернатива: использовать случай заявление в процессе:

process (clk) 
begin 
    if rising_edge(clk) then 
     case cau_state is 
      when st_idle => signal_1 <= (others => '0') 
      ... 
      when st_cycle_4 => signal_1 <= signal_6; 
      -- when others => some default action 
     end case; 
    end if; 
end process; 

Это меняет семантику к синхронизированного конструкции, но unclocked конструкции хлопотно в FPGA, чтобы по меньшей мере!

+0

Что я сделал, это добавить 'и rising_edge (CLK)' ко всем операторам 'when', чтобы он выглядел так:' signal_1 <= (others => '0'), когда cau_state = st_idle и rising_edge (CLK) else signal_1; ' Это то же самое, что положить его внутрь процесса и дела? – SIMEL

+0

Если это работает, и оба сима и синтезатора поддерживают его, да, я так считаю. Кроме того, похоже, что я должен «sharth» извинения - теперь вы можете использовать стиль условного присваивания в процессе - если ваши инструменты поддерживают VHDL-2008! Назовите меня динозавром, но я (как и многие инструменты, все еще там) все еще не знаю всех VHDL-2008. «Sharth»: если вы отмените свой ответ, я подниму его ... –

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