我看到一些奇怪的行为,即在顺序过程中执行与在并发语句中执行的完全相同的语句。
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,可在每个mclk上升沿保持sclk的状态。那总是在一个过程中运行并且运行良好。接下来的两个问题就是问题。当在一个进程中运行时,它们可以正常工作,并按预期的那样将sclk的上升沿和下降沿值精确保持1 mclk周期。当在进程外运行时,尽管完全相同的语句始终为零。
为什么这两个语句会在一个流程中工作,但不能作为并发语句工作?