在 Verilog的江湖里,流傳著一段,兩段,三段式狀態(tài)機的傳說。它們各有優(yōu)劣,本文就書寫三段式狀態(tài)機的錯誤原因進行探尋。
本文會涉及到Verilog的基本語法,需要一定的Verilog基礎,包括對reg,always,狀態(tài)機的一些認識,數字電路基礎。
三段式狀態(tài)機,將狀態(tài)機分為三段,功能為狀態(tài)轉移,狀態(tài)轉移條件判斷,輸出邏輯等。
存在問題的“三段式狀態(tài)機”代碼如下:
程序比較簡單,于是直接上板驗證。
經過上板調試,發(fā)現問題存在于當empty為低時,rd_en并沒有拉高。于是,我首先懷疑整個系統(tǒng)是不是一直處于復位狀態(tài)。
經過查找,發(fā)現rst一直保持低電平,整個程序不在復位狀態(tài)。這就很神奇了。
后來,經過提醒和仔細查找原因,才發(fā)現這個狀態(tài)機寫的其實存在問題。狀態(tài)轉移條件判斷和狀態(tài)轉移都使用時序邏輯,兩者并行運行,問題就凸顯出來了。
舉例說明,假設當前狀態(tài)state
, next_state
都處于IDLE
狀態(tài);
事實上,這么寫,造成的問題是state相對其他信號可能會晚一節(jié)拍。狀態(tài)機晚一節(jié)拍,可能會導致時序錯亂。
而事實上,三段式狀態(tài)機當然不是這么寫的。
首先,三段式狀態(tài)機由三部分(段)組成,前面也提到了,是狀態(tài)轉移,狀態(tài)轉移條件判斷,輸出邏輯等。
首先談到狀態(tài)轉移,三段式狀態(tài)機有state, next_state信號作為指示。兩者在位寬,信號類型上一模一樣,都是reg型變量。
狀態(tài)轉移很簡單,大致如下:
其中,IDLE
是預先定義的常量,使用localparam
,parameter
定義即可,或者可以使用`define定義宏變量參數,然后放在一個通用的參數模塊文件里,供項目里所有文件調用,后續(xù)再詳細講解這塊吧。
這塊的內容,僅僅是將next_state的值打一拍,通過了一個寄存器,意義何在呢,要結合狀態(tài)轉移條件判斷一起看。
狀態(tài)轉移條件判斷代碼大致如下:
這塊的內容主要是做next_state值變更的條件判斷,結合功能來說,就是做狀態(tài)值的更新。
那可能有人會問:
- always @ (*) 是什么意思
簡單來說,always @ ( ) 意為每時每刻都在運行,也就是組合邏輯,你也可以使用always @ (state, a, b)方式來代替always @ ( )。但是,假如always列表里的信號不全,可能造成的影響又是什么呢?
- reg類型為什么放在組合邏輯里面做
reg型變量最后綜合的電路也可能是組合邏輯,也不是說always塊一定綜合出時序邏輯,主要還是跟敏感列表有關,其次always里只能使用reg型變量
- 為什么你的if沒有補全else
對于時序邏輯來說,沒有補全else,default等不會生成鎖存器;對于組合邏輯來說,沒有else,default確實可能生成鎖存器,但是鎖存器生成的原因是因為設計代碼中要求組合邏輯去保持或者說記憶住某個值,這本該是時序邏輯該干的事,組合邏輯干不了,所以生成鎖存器;而本段代碼,第一行代碼就相當于已經為所有無法進入if條件的情況增加了默認情況,就是賦值為state的狀態(tài)。
這兩塊內容都跟狀態(tài)轉移有關,第二塊進行條件判斷,而判斷不僅要根據外部信號,也要根據自身所在的狀態(tài),所以第一塊進行狀態(tài)值的更新。
那么這么做的好處是什么呢?跟一段式狀態(tài)機相比,將狀態(tài)轉移與判斷和輸出邏輯分開寫,方便后續(xù)的調試。
因為在調試階段,查找問題時會去查找問題所在的狀態(tài),然后再比對代碼中該狀態(tài)的判斷條件,沒有錯誤再比對該條件下問題信號的輸出邏輯,調試更為方便。
那么第三段的輸出邏輯,代碼大致如下:
首先,輸出邏輯這段并不是要求只用一個always寫完所有的輸出邏輯;其次,使用時序邏輯輸出,更利于信號的時序分析和時序收斂。
當然,一段式狀態(tài)機也并不是一無是處,很多時候,在一些邏輯簡單,功能簡單的場景下,我也愿意使用一段式狀態(tài)機。兩段式狀態(tài)機用的比較少,感覺像是一段式和三段式狀態(tài)機的過渡狀態(tài),有點雞肋的感覺。
-
鎖存器
+關注
關注
8文章
918瀏覽量
41782 -
時序邏輯電路
+關注
關注
2文章
94瀏覽量
16634 -
狀態(tài)機
+關注
關注
2文章
492瀏覽量
27786 -
Verilog語言
+關注
關注
0文章
113瀏覽量
8341
發(fā)布評論請先 登錄
相關推薦
【Z-turn Board試用體驗】有限狀態(tài)機三段式描述方法(轉載)
徹底搞懂狀態(tài)機(一段式、兩段式、三段式)!一個實例,三種方法對比看!!!(程序)
關于三段式狀態(tài)機的疑惑,希望有人來為我解答。(新手求罩)
Verilog三段式狀態(tài)機描述及模版
Verilog三段式狀態(tài)機描述及模版
三段式和四段式耳機的引腳定義
Verilog三段式狀態(tài)機描述(轉載)
關于使用FPGA三段式狀態(tài)機的三點好處,你有什么看法?

評論