如果我在VHDL過程中編寫語句來指定a是+1,那麼這是一個好習慣嗎?VHDL中的<= a + 1是一個很好的練習嗎?
我對此感到困惑,因爲模擬器工作正常,但是當我嘗試在FPGA中實現時,綜合工具會抱怨創建鎖存器。
這是什麼意思?
如果我在VHDL過程中編寫語句來指定a是+1,那麼這是一個好習慣嗎?VHDL中的<= a + 1是一個很好的練習嗎?
我對此感到困惑,因爲模擬器工作正常,但是當我嘗試在FPGA中實現時,綜合工具會抱怨創建鎖存器。
這是什麼意思?
你應該只在一個鐘控過程中做這樣的陳述。如果你想合成它,建議進行額外的初始化(重置)。可能如下:
process(clk, reset)
begin
if reset='1' then
a <= 0;
elsif rising_edge(clk) then
a <= a + 1;
end if;
end process;
在鍾控程序中,這很好。其他地方,可能不是。
做一個時鐘的過程,這很好。它的意思是「的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型觸發器的時鐘。
實際上,在您的最後一個例子中,Altera的綜合工具將實現'a'作爲由'en'定時的寄存器。 (這可以說是正確的,因爲沒有異步復位,所以不需要檢查en'event。)但這可能不是一個好主意! – pc3e 2013-04-18 08:29:15
好點,我會注意到邊緣和透明鎖存器之間的區別...... – 2013-04-18 11:03:42
如果鎖存器有時保存該值,但沒有在時鐘塊中指定鎖存器,則隱含鎖存器。 – Morgan 2013-03-12 22:19:43