2013-12-10 55 views
2

我有一個簡單的寄存器,其中存儲值爲std_logic_vector。在仿真行爲中,輸出延遲1個週期。這背後的原因是什麼?這是由於clock'event的行爲嗎?如何解決這個問題?VHDL寄存器中的延遲

下面是代碼:

entity fault_reg is 
port (
    clk  : in std_logic; 
    rst  : in std_logic; 
    reg_in : in std_logic_vector(NUM_PORTS - 1 downto 0); 
    reg_out : out std_logic_vector(NUM_PORTS - 1 downto 0)); 
end fault_reg; 

architecture Behavioral of fault_reg is 
begin 
reg_impl : process(clk, rst) 
    begin 
     if rst = '1' then 
      reg_out <= (others => '0'); 
     elsif clk'event and clk='1' then 
       reg_out <= reg_in; 
     end if; 
    end process reg_impl; 
end Behavioral; 

這裏是波形: enter image description here

+1

這與在此之前僅發佈一點的問題完全相同。 http://stackoverflow.com/questions/20496660/strange-delay-of-one-cycle-in-modules-in-verilog。您也可能會看到更多有用的信息。 – Russell

+0

所以這是由於VHDL中的某種Delta延遲,在將輸入值分配給輸出之間會有一些延遲,並且由於此過程是同步的,所以它正在下一個時鐘週期寫入值,對嗎? – Digeek

+0

是的,延遲是由時鐘引起的。它被稱爲傳播延遲。 – Russell

回答

4

你寫的過程是一個同步過程,這對clkrst信號敏感;當clkrst發生變化時,該過程僅「醒來」以評估/更新輸出。因此,儘管reg_in可能會更改,但reg_out只會在下一個上升時鐘沿(clk'event and clk='1')或復位被確認(rst = '1')時更新。

的時間表打破了這樣的:

  1. 時鐘上升沿。
  2. reg_in在事件#1後不久發生變化。
  3. 時鐘邊緣上升。
  4. reg_out在事件#3之後不久發生了變化,事件#3的值爲reg_in,這是事件#2中變更的值。