verilog之狀態機


verilog之狀態機設計

1、狀態機的原理

狀態機,就是基於狀態變化而設計的硬件模塊,是一種常見的設計思路。掌握狀態機的使用,是初步建立復雜邏輯設計能力的開始。所謂的狀態機,和高級語言程序的流程圖十分類似,具有逐步執行,步步遞進的特點。由於硬件的特殊性,一般的狀態機都是閉環的,要求能夠回到初始狀態。狀態機就是硬件流程圖,將並行執行的硬件結構通過時序控制轉化為有效地順序執行。

這一點體現在verilog中就是狀態機通過一個狀態塊和一個條件塊,將高級語言中的逐步特性短暫地建立於硬件中,是設計者可以有效地分析信號當前處於的區域。簡而言之,狀態機就是C語言中的while(1),不斷地執行不同狀態下的模塊功能。當然,設計的語句比較復雜,實現每條語句的方法也是需要采用模塊化設計。這里和軟件上的設計思路還是有所區別的。

個人理解,狀態機的作用是有效地減少了設計者在信號轉化過程中需要不斷考慮的時序問題,以及在條件轉化中的約束問題。由於狀態的限定,使得條件約束變得簡單。當然,對於熟練的硬件設計者來說,自定義條件約束也是可以實現的。

2、狀態機的組成

狀態機由三部分組成:狀態、驅動和輸出。狀態,這就不用多說,就是狀態機名字的由來。通過數字或者其他標識,將每一段時間區分於一個狀態。驅動,就是狀態變化的條件。這個是狀態機設計的關鍵。一般在設計狀態機前會先繪制關系圖,目的就是明確驅動。至於輸出,就是根據狀態區分條件從而達到控制輸出的目的。

首先看一下狀態的聲明。一般而言,狀態只需要有現在狀態和下一狀態,通過組合邏輯關聯即可實現。最簡單的就是狀態1的下一狀態為狀態2,狀態2的下一狀態為狀態1。采用組合關聯而非時序關聯,主要是減少時序冗余和可能的狀態自鎖。時序冗余好理解,組合邏輯總是比時序邏輯用的資源少。時序自鎖,也就是狀態延時變化可能導致的問題。比如前面的簡單狀態轉化。在1->2時,現狀態轉化為2,在現狀態保持2的第一個周期內,下一狀態還是2,這就導致狀態一直處於2.當然,這只是一個極端的情況。

至於驅動,就是根據每個狀態下的條件判斷出狀態的變化。常用的有某信號出現高電平、某計數器計時到位、多個信號復雜條件等。驅動的最穩妥的方法就是畫出狀態圖,以防遺漏。

輸出,就是將運行成功的狀態機的狀態轉化為標准的控制信號。這里的輸出和單純使用時鍾外加控制線的方式輸出的優勢在於可以自動區分條件。比如,在狀態1中的控制條件只會作用於狀態1,而不會影響其他狀態。這好比認為構建了一個局部條件。在信號越來越復雜的情況下,局部條件顯然具有重要的優勢。在設計比較大的模塊時,隨着信號變化的區分度越來越高,單純使用轉化信號來控制是困難的。

一般的狀態機的寫法也是基於這三部分來寫的,可以合並。計數器可以認為是三合一的狀態機,只不過大部分人只會使用計數到達或者計數不足兩個狀態,所以就直接合並在一起。對於直接輸出狀態的設計而言,只需要兩個部分即可。

3、狀態機的作用

在學習硬件設計時,狀態機無疑是重要的一環。掌握狀態機的設計,可以從邏輯思維過渡到硬件分析。掌握狀態機,才能逐步地接觸到硬件設計中的組合與時序的轉化。可以說,狀態機是組合邏輯和時序邏輯的標准搭配,如同集成電路中的CMOS單元一樣基礎。學習了狀態機,就可以初步的了解狀態和時序的搭配方法,為后面更為復雜的設計打下基礎。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM