Я вижу странное поведение, когда одни и те же операторы выполняются в последовательном процессе, а не как параллельный оператор.
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 мкл циклически, как и ожидалось.При запуске вне процесса, хотя одни и те же операторы всегда равны нулю.
Почему два оператора работают в процессе, а не как параллельные операторы?