2016-03-08 42 views
4

我被賦予了一個啓用D觸發器的代碼。使用時鐘並啓用

process(clk, en) 
    begin 
     if rising_edge(clk) then 
      if en = ‘1’ then 
       Q <= D; 
     end if; 
    end if; 
end process; 
  1. 有人告訴我,我應該使用if rising_edge(clk) and en = ‘1’ then ...爲什麼?
  2. 爲什麼不是如果在if時鐘之前爲en = '1',因爲時鐘頻繁更換?
  3. ,是有必要指定在此過程中括號process(clk, en)en
+1

將'en'放在'rising_edge'之前可能會導致一個門控時鐘。通過改變propabilities或通過優先級來排序信號可以減輕可讀性,因爲很多人都這樣做,並期望這樣做:)。 – Paebbels

回答

3
  1. 有些人認爲,VHDL編譯器和合成器無法弄清楚,這是因爲你在這裏顯示的同樣的事情。我從來沒有直接比較輸出,但如果它很重要,我會非常難過。

  2. 改變往往並不在硬件真正的問題。理論上,這應該不重要。實際上,如果您更改了條件的順序,編譯器可能會錯誤地警告您的敏感列表。

  3. 它不是。

2

這裏是回答了你的問題全部3:

如果你的編碼順序邏輯,明智的做法是堅持一個模板。下面是與時序邏輯沒有異步重置,而這一切綜合工具應該明白這樣一個模板:

process(clock) -- nothing else should go in the sensitivity list 
begin 
    -- never put anything here 
    if rising_edge(clock) then -- or falling_edge(clock) 
     -- put the synchronous stuff here 
     -- ie the stuff that happens on the rising or falling edge of the clock 
    end if; 
    -- never put anything here 
end process;   

所以en不應該在敏性列表,它不應該在同一個if語句作爲測試時鐘已經過測試。

如果你考慮一下,en不應該在靈敏度列表中的另一個很好的理由:沒有異步復位的觸發器的輸出只在時鐘改變時纔會改變;當D輸入改變時它不會改變。