2013-03-12 51 views
2

如果我在VHDL過程中編寫語句來指定a是+1,那麼這是一個好習慣嗎?VHDL中的<= a + 1是一個很好的練習嗎?

我對此感到困惑,因爲模擬器工作正常,但是當我嘗試在FPGA中實現時,綜合工具會抱怨創建鎖存器。

這是什麼意思?

+1

如果鎖存器有時保存該值,但沒有在時鐘塊中指定鎖存器,則隱含鎖存器。 – Morgan 2013-03-12 22:19:43

回答

7

你應該只在一個鐘控過程中做這樣的陳述。如果你想合成它,建議進行額外的初始化(重置)。可能如下:

process(clk, reset) 
begin 
    if reset='1' then 
     a <= 0; 
    elsif rising_edge(clk) then 
     a <= a + 1; 
    end if; 
end process; 
5

在鍾控程序中,這很好。其他地方,可能不是。

3

做一個時鐘的過程,這很好。它的意思是「的a下一個值應該是a +1當前值」


如果你做到這一點作爲一個連續的分配(任何過程之外的),什麼你說的是「是總是得到+ 1分配給它「這是一個自我參考循環!

如果包括a在啓動過程中的靈敏度名單,你會得到同樣的效果

process (en, a) 
begin 
    if en = '1' then 
     a <= a + 1; 
    end if; 
end process; 

(你可以用這種形式來創建透明鎖存器:

process (en, insig) 
begin 
    if en = '1' then 
     a <= insig; 
    end if; 
end process; 


如果你在非時鐘進程中執行它,它是敏感a

process (en) 
begin 
    if en = '1' then 
     a <= a + 1; 
    end if; 
end process; 

您將創建一個正邊沿觸發鎖存器,如a需要不斷的變化en之間的值。實際上,en成爲d型觸發器的時鐘。

+0

實際上,在您的最後一個例子中,Altera的綜合工具將實現'a'作爲由'en'定時的寄存器。 (這可以說是正確的,因爲沒有異步復位,所以不需要檢查en'event。)但這可能不是一個好主意! – pc3e 2013-04-18 08:29:15

+0

好點,我會注意到邊緣和透明鎖存器之間的區別...... – 2013-04-18 11:03:42

相關問題