У меня есть код 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
...
В чем проблема, и как я могу это исправить?
Что я сделал, это добавить 'и rising_edge (CLK)' ко всем операторам 'when', чтобы он выглядел так:' signal_1 <= (others => '0'), когда cau_state = st_idle и rising_edge (CLK) else signal_1; ' Это то же самое, что положить его внутрь процесса и дела? – SIMEL
Если это работает, и оба сима и синтезатора поддерживают его, да, я так считаю. Кроме того, похоже, что я должен «sharth» извинения - теперь вы можете использовать стиль условного присваивания в процессе - если ваши инструменты поддерживают VHDL-2008! Назовите меня динозавром, но я (как и многие инструменты, все еще там) все еще не знаю всех VHDL-2008. «Sharth»: если вы отмените свой ответ, я подниму его ... –