2017-01-29 43 views
0

當aclrn = 0時,我必須實現一個D-鎖存,它遵循異步復位,當sclrn = 0時同步復位。實施應該能夠遵循兩種重置方法。在VHDL中使用異步和同步復位的D-鎖存

下面是我基於基本D鎖存器在VHDL中提出的(我只包括該過程)。

process(aclrn,clock) 
begin 
if (aclrn='0') then 
q <= '0'; 
elsif (rising_edge(clock)) then 
    if (sclrn='0') then 
    q <= '0'; 
    else 
    q <= d; 
end if; 
end if; 
end process; 

其中

clock, d, aclrn, sclrn : in std_logic; q : out std_logic 

我是正確的過程並不需要採取sclrn作爲參數,但只有aclrn和時鐘?還有其他不一致嗎?

預先感謝您。

+0

您在靈敏度列表上正確。其他不一致:布爾表達式(3x)周圍的括號是不必要的混亂,縮進不一致。 –

+0

@BrianDrummond謝謝你指出!括號是Java的習慣。 –

回答

2

你說的D鎖存器,但編碼觸發器。你真的需要一個D鎖存器嗎?或者你不小心使用了鎖存器而不是寄存器? 如果你真的需要一個觸發器,你做對了。 你已經把aclrn和時鐘放在正確的靈敏度列表中。您不需要將sclrn放入列表中,因爲它是同步的。對於觸發器 賽靈思XST教程示例進行正沿時鐘和同步設置

architecture archi of registers_3 is 
begin 
    process (C) 
    begin 
     if (C'event and C='1') then 
      if (S='1') then 
       Q <= '1'; 
      else 
       Q <= D; 
      end if; 
     end if; 
    end process; 
end archi; 

和XST編碼例爲觸發器進行正沿時鐘和異步復位

architecture archi of registers_2 is 
begin 
    process (C, CLR) 
    begin 
     if (CLR = '1')then 
      Q <= '0'; 
     elsif (C'event and C='1')then 
      Q <= D; 
     end if; 
    end process; 
end archi; 

通過混合這些兩個你得到你的答案。我看到你的代碼沒有錯。知道你是否編寫了你所要求的最好的方法就是模擬它。

如果您需要鎖存器,請注意鎖存器對水平而不是邊緣敏感。這是帶有正門和異步復位的LATCH的一個示例

architecture archi of latches_2 is 
    begin 
     process (CLR, D, G) 
     begin 
      if (CLR='1') then 
       Q <= '0'; 
      elsif (G='1') then 
       Q <= D; 
      end if; 
     end process; 
    end archi; 
+0

非常感謝,很好的答案!你是對的,我的意思是D觸發器,這只是爲了方便起見,我的教科書沒有區分這兩個名字,對此抱歉。 –

+0

@ P.Lance沒關係。使用閂鎖而不是FF很常見:) – Laleh

+0

@BrianDrummond完成! :) – Laleh