的時分(週期)選擇我目前正在做一個VHDL項目,其中有一個計數器需要在100ms或1000ms內更新,如果按下一個鍵。vhdl
例子:
If Key3=0 then
c=c+1 (100ms)
elsif key3=1 then
c=c+1 (1000ms)
我想知道如何做到這一點的VHDL。
我相信我應該使用一個進程(時鐘,Key3),但我不知道如何使計數器增加基於期限。
在此先感謝!
的時分(週期)選擇我目前正在做一個VHDL項目,其中有一個計數器需要在100ms或1000ms內更新,如果按下一個鍵。vhdl
例子:
If Key3=0 then
c=c+1 (100ms)
elsif key3=1 then
c=c+1 (1000ms)
我想知道如何做到這一點的VHDL。
我相信我應該使用一個進程(時鐘,Key3),但我不知道如何使計數器增加基於期限。
在此先感謝!
我認爲你是有一部分的方式:
我相信我應該用一個過程(時鐘,密鑰3)但我不知道如何使基於週期計數器增加。
將問題看作是數字設計問題,而不是編碼問題。在真實的數字系統中,你會用什麼來衡量時間的流逝?從那裏使用這個參數來確定100ms還是1000ms已經過去。
一旦你可以測量時間,你如何確定一個特定的事件正在進行多久?
如果c
的類型是時間的變量(一個過程),那麼
if some_condition then
c := c + 100 ms;
else
c := c + 1000 ms;
end if;
是有效的VHDL,並且將在模擬工作,雖然時間不是很順利支持的合成。
最簡單的解決方案是讓C
以時間步長(如多個時鐘週期)進行計數,並添加其中的1個或10個。
例如,如果你有一個10MHz的時鐘:
constant Clock_Period : time := 100 ns;
constant ms_100 : natural := 100 ms/Clock_Period;
constant ms_1000 : natural := 1000 ms/Clock_Period;
signal c : natural;
...
if some_condition then
c <= c + ms_100;
else
c := c + ms_1000;
end if;
如果你改變時鐘頻率,調整clock_period聲明相匹配。
我們最近遇到了Vivado關於基於'time'類型生成常量和範圍的問題。正如你上面所描述的那樣,這完全優化到無。賽靈思承認,不支持'time'類型的對象。請參閱AR57964(http://www.xilinx.com/support/answers/57964.html) – PlayDough
@PlayDough您鏈接的AR指示類型Time在Vivado中受支持,但效果不佳。因此,賽靈思對Vivado用戶「不推薦」這種技術(也許他們在使用64位時使用32位算術???),而且Synplicity還存在其他問題。但在最高級別上最清楚地表示代碼應該是正常的做法;在工具支持不足的情況下偏離它。 –
夠公平的。時間被支持 - 很差。但正如你指出的那樣,我們受到我們使用的工具的限制。我們所做的是類似於:'constant Clock_Period:real:= 100.0e-9;'支持真正的值。 – PlayDough