Не удается вывести регистр для at, поскольку он не хранит свое значение за границей тактового сигнала.

Это, должно быть, самая распространенная проблема среди людей, плохо знакомых с VHDL, но я не вижу, что я здесь делаю неправильно! Кажется, это соответствует всем идиомам, которые я встречал при разработке правильного конечного автомата. Я компилирую в Altera Quartus 9.2, для чего это стоит. Фактическая ошибка:

«Не удается вывести регистр для «spiclk_out» в [файл] [строка], потому что он не удерживает свое значение за границей часов»

ENTITY spi_state_machine IS
    PORT(
            spiclk_internal : IN STD_LOGIC;
            reset : IN STD_LOGIC;
            spiclk_out : BUFFER STD_LOGIC
    );
END spi_state_machine;

PROCESS(spiclk_internal, reset)
BEGIN
    IF reset = '1' THEN
        spiclk_out <= '0';
    END IF;

    IF spiclk_internal = '1' AND spiclk_internal'EVENT THEN --error here
        spiclk_out <= NOT spiclk_out;
    END IF;
END PROCESS;

Спасибо за ваше время.


person Harold Forrest    schedule 13.05.2011    source источник
comment
Может быть, вам нужно присвоить spiclk_out в предложении ELSE для этого IF?   -  person Marty    schedule 13.05.2011


Ответы (1)


Как написано, процесс заставит spiclk_out переключаться на spiclk_internal ребрах, даже когда reset активен, что не должно вести себя триггерами с асинхронными сбросами.

То, что вы, вероятно, хотите, это

SPICLK: process(spiclk_internal, reset)
    if reset = '1' then
        spiclk_out <= '0';
    elsif spiclk_internal'event and spiclk_internal='1' then
        spiclk_out <= not spiclk_out;
    end if;
end process SPICLK;
person Tomi Junnila    schedule 13.05.2011