并发和顺序语句中的VHDL上升和下降时钟

时间:2019-02-10 04:55:49

标签: vhdl

我看到一些奇怪的行为,即在顺序过程中执行与在并发语句中执行的完全相同的语句。

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周期。当在进程外运行时,尽管完全相同的语句始终为零。

为什么这两个语句会在一个流程中工作,但不能作为并发语句工作?

0 个答案:

没有答案