關於Verilog 寫法

狀態機篇

一、先科普

        狀態機是verilog開發者繞不過去的坎,複雜的控制邏輯一般都需要用到狀態機。

         一般常見的狀態機有 一段式、兩段式、三段式狀態機。

          這裏以常規三段式狀態機爲例,做簡要分析。寫過狀態機的猿的都知道,常規套路:一段狀態實際轉移。 一段狀態轉移條件,另一段是每個狀態乾的活。

           一般狀態機,假如說,不涉及到反饋,那麼一般狀態機寫法就可。以下時序圖爲例。sta1信號到來後,狀態機被激活,nx_status 立刻變成s1(純組合邏輯)。時鐘沿採集到sta1後,狀態機從s0跳轉到s1。在下一個時鐘沿採集到狀態status是s1後,開始幹活,拉起了axi_awvalid和axi_walid信號。

           這裏會有一個問題,假如說,每個狀態都幹相應的活,而幹活的結果,不需要反饋。那麼狀態機這種寫法一點問題都沒有,前一個時鐘狀態轉移,下一個時鐘開始幹活。幹活時刻 落後狀態轉移一個clk。沒什麼問題,所有的問題都是線性流水的,並朝着一個方向走的。

     這裏必須注意: axi_awvalid、axi_walid信號和狀態轉移信號sta1、sta2 不會有邏輯有交集,不會出現再同一個時刻採集(axi_awvalid & sta1)等這種情況。因爲你狀態轉移的變量和axi_awvalid、axi_walid 一點關係都沒有,也不依賴於axi_awvalid、axi_walid 對後面造成的影響。


二、坑貨解析

        假設這裏,狀態轉移的條件與後面axi_awvalid、axi_walid有關,那麼這麼寫就有問題。例如拉起來axi_awvalid 和axi_walid信號,需要對端送過來相應的ready信號,並採集到valid&ready信號,狀態才能轉移,如果對端沒有ready信號過來,我們需要keep住valid和data信號。也就是說,沒法在時鐘採集到status 在sta1狀態後,再幹活,然後等結果出來後,換下一個狀態。

我們在進入sta1後,立刻將valid信號拉上去,而不是說採集到sta1狀態後再拉上去。這樣幹活提前一拍。 由於提前一拍幹活,下一拍就可以根據乾的活結果如何確定,跳到哪個狀態上去。這裏加入sta2就是對面過來的ready信號。那麼我們看到valid和ready握手成功,則status在下一拍直接進入s2狀態。


總結:如果狀態轉移條件與當前狀態需要乾的活的結果有關,那麼用傳統狀態機不行。需要提前一拍幹活。

           也就是說,當前狀態指示當前狀態乾的活。 某個時鐘沿,使得sta跳到當前狀態,那麼這個時鐘沿後也要開始幹活。幹活這狀態是同步的。 不像以前,採集到進入這個狀態後,纔開始幹活。這樣會慢一拍。


多FIFO操作








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章