vhdl

2016-04-26 82 views
0

的時分(週期)選擇我目前正在做一個VHDL項目,其中有一個計數器需要在100ms或1000ms內更新,如果按下一個鍵。vhdl

例子:

If Key3=0 then 
c=c+1 (100ms) 
elsif key3=1 then 
c=c+1 (1000ms) 

我想知道如何做到這一點的VHDL。

我相信我應該使用一個進程(時鐘,Key3),但我不知道如何使計數器增加基於期限。

在此先感謝!

回答

1

我認爲你是有一部分的方式:

我相信我應該用一個過程(時鐘,密鑰3)但我不知道如何使基於週期計數器增加。

將問題看作是數字設計問題,而不是編碼問題。在真實的數字系統中,你會用什麼來衡量時間的流逝?從那裏使用這個參數來確定100ms還是1000ms已經過去。

一旦你可以測量時間,你如何確定一個特定的事件正在進行多久?

0

如果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聲明相匹配。

+0

我們最近遇到了Vivado關於基於'time'類型生成常量和範圍的問題。正如你上面所描述的那樣,這完全優化到無。賽靈思承認,不支持'time'類型的對象。請參閱AR57964(http://www.xilinx.com/support/answers/57964.html) – PlayDough

+0

@PlayDough您鏈接的AR指示類型Time在Vivado中受支持,但效果不佳。因此,賽靈思對Vivado用戶「不推薦」這種技術(也許他們在使用64位時使用32位算術???),而且Synplicity還存在其他問題。但在最高級別上最清楚地表示代碼應該是正常的做法;在工具支持不足的情況下偏離它。 –

+0

夠公平的。時間被支持 - 很差。但正如你指出的那樣,我們受到我們使用的工具的限制。我們所做的是類似於:'constant Clock_Period:real:= 100.0e-9;'支持真正的值。 – PlayDough