(3) 問題3
可否用wait until的方式寫asynchrous reset for d-ff?
//========== 以上蕭兄的問題3結束 ==========
我們知道wait until是可以寫出D-FF的
但對於比較了解或常寫VHDL的人而言
寫D-FF一定不會用wait until的語法來寫
一定會寫在process裡面
因為以D-FF的行為及架構而言
它是屬於循序邏輯(sequential logic, S.L.)
所以會把它擺在process裡面
但是這個問題的重點
是在於wait until的語法
並不屬於S.L.這一塊
先來看一下VHDL的語法架構吧
上面的VHDL code正是一個D-FF
而在Circuit model中, 所有的描述式都是同時進行的(simultaneously)
也就是說, 不管在這裡面寫幾百個process
這些process都是同時發生的
但在process內部, 卻是循序式發生(sequential)
說到這裡, 也許有人注意到了
wait until跟rising_edge一樣
擺在process裡面的
如下列程式
architecture Behavioral of out_test is begin process begin wait until (clk = '1' and clk 'event); d_out <= d_in; end process; end Behavioral;
注意到了嗎
process後的sensitivity list不見了!!!
而且呢
wait until變成一行完整的"敘述句"!!!
這代表什麼呢???
回顧VHDL語法的本質
process可分為兩類
- process with sensitivity list
- process without sensitivity list
在process with sensitivity list中
sensitivity list所扮演的角色是"被監視且會改變的訊號"
(signal that is monitored for changes)
主要就是觀察這些在list中的訊號
如果產生改變的時候, 該做些什麼事
在這種情況下, 是不能使用wait的敘述的!!!
因為在有sensitivity list存在的情況下
隱含著兩種意義:
- 那些訊號隱含著"wait on"的語意
- process的執行只是"暫時"地結束於end process
那麼在process without sensitivity list呢
如同上述所言, 它是存在一個"隱含的"wait敘述
當沒有加上sensitivity list, 就一定得使用wait敘述
不然沒有會造成sensitivity源的存在
當我們今天若使用單一個sensitivity source
是可以用wait until來進行撰寫
如果需要去監視多個訊號源
像蕭兄所提的, 寫個asynchronous D-FF
(因為有async.的reset與clk兩個sensitivity source)
很抱歉, 你必須使用process with sensitivity list的寫法
除非你老媽變成兔子(咦???)
這樣才有辦法實現
所以各位可以把wait until當成是一個
實現最很簡單功能的D-FF
簡單到連reset訊號都不見了...
(這D-FF...不就要領殘障手冊了...)
其實有關於wait敘述有太多的問題需要交代清楚
它在VHDL裡面是個非常弔詭的語法
因為它存在的地方實在太多了
我會加以整理後另闢一篇來跟各位討論
以上就是"蕭兄的客問答"
如果這些文章能對各位看倌有所幫助
那麼蕭兄
你就是造福人群的"罪人" "恩人" (^.^b)
1 則留言:
很有趣的討論!一直以來都有留意你和蕭兄的blog.對於async dff必須使用process with sensitivity list的寫法, 想發表一下意見。其實能否寫成這樣?
process
begin
wait until reset'event or clk'event ;
if reset = '1' then
q <= '0' ;
elsif clk'event and clk = '1' then
q <= d ;
end if ;
end process ;
這樣就不用sensitivity list了。不過這種寫法跟有sensitivity list的寫法差不多。另外一種寫法是用 wait on reset, clk 代替 wait until。
張貼留言