VHDL восходящие и падающие часы в параллельных и последовательных утверждениях - PullRequest
0 голосов
/ 10 февраля 2019

Я вижу странное поведение, когда одни и те же операторы выполняются в последовательном процессе, а не как параллельный оператор.

library ieee;
use ieee.std_logic_1164.all;

entity two_clocks is
    port(
        mclk : in std_logic;
        sclk : in std_logic;
        sclk_rising_edge, sclk_falling_edge : out std_logic
    );
end two_clocks;

architecture rtl of two_clocks is

    signal sclk_reg : std_logic;

begin

    -- register keeping track of sclk state on every mclk rising edge
    sclk_reg_p : process (mclk)
    begin
        if (rising_edge(mclk)) then
           sclk_reg <= sclk;

           -- this does work and holds the rising and falling edges for exactly one
           -- mclk cycle as expected
           sclk_rising_edge <= sclk and not sclk_reg;   
           sclk_falling_edge <= not sclk and sclk_reg;               
        end if;
    end process;

    -- this never works in the simulator or on hardware, always zero for both
    -- and never holds for a clock cycle as expected
    sclk_rising_edge <= sclk and not sclk_reg;   
    sclk_falling_edge <= not sclk and sclk_reg;   


end rtl;

Это произошло, когда я пытался реализовать подчиненное ядро ​​spi.У меня есть глобальные часы (mclk) и spi-часы (sclk).Детали не имеют значения, кроме того, что у меня есть два тактовых генератора, работающие на разных скоростях.

У меня есть регистр sclk_reg, который сохраняет состояние sclk на каждом переднем фронте mclk.Это всегда работает в процессе и работает нормально.Следующие два утверждения являются проблемой.При запуске в процессе они работают нормально и удерживают нарастающие и падающие значения sclk ровно на 1 мкл циклически, как и ожидалось.При запуске вне процесса, хотя одни и те же операторы всегда равны нулю.

Почему два оператора работают в процессе, а не как параллельные операторы?

...