狀態機設計的一般步驟_淺談狀態機

來源:公眾號【ZYNQ】ID ??:FreeZynq

????????????????????????????????????????????????????????????????????????????整理 :李肖遙

本文目錄

  1. 前言

  2. 狀態機簡介

  3. 狀態機分類
    Mealy 型狀態機
    Moore 型狀態機

  4. 狀態機描述
    一段式狀態機
    二段式狀態機
    三段式狀態機

  5. 狀態機優缺點

  6. 總結

  7. 擴展-四段式狀態機

01. 前言

狀態機是FPGA設計中一種非常重要、非常根基的設計思想,堪稱FPGA的靈魂,貫穿FPGA設計的始終。

02. 狀態機簡介

什么是狀態機:狀態機通過不同的狀態遷移來完成特定的邏輯操作(時序操作)狀態機是許多數字系統的核心部件, 是一類重要的時序邏輯電路。通常包括三個部分:
下一個狀態的邏輯電路
存儲狀態機當前狀態的時序邏輯電路
輸出組合邏輯電路

03. 狀態機分類

通常, 狀態機的狀態數量有限, 稱為有限狀態機(FSM) 。由于狀態機所有觸發器的時鐘由同一脈沖邊沿觸發, 故也稱之為同步狀態機。

根據狀態機的輸出信號是否與電路的輸入有關分為 Mealy 型狀態機和 Moore 型狀態機

3.1,Mealy 型狀態機

電路的輸出信號不僅與電路當前狀態有關, 還與電路的輸入有關

9c4ee8968292ad0a3c5e285131bd1f86.png

3.2,Moore 型狀態機

電路的輸出僅僅與各觸發器的狀態, 不受電路輸入信號影響或無輸入

e14342aa3a4743ded5f92fb97e0696ea.png

狀態機的狀態轉移圖, 通常也可根據輸入和內部條件畫出。一般來說, 狀態機的設計包含下列設計步驟:

  • 根據需求和設計原則, 確定是 Moore 型還是 Mealy 型狀態機;

  • 分析狀態機的所有狀態, 對每一狀態選擇合適的編碼方式, 進行編碼;

  • 根據狀態轉移關系和輸出繪出狀態轉移圖;

  • 構建合適的狀態機結構, 對狀態機進行硬件描述。

04. 狀態機描述

狀態機的描述通常有三種方法, 稱為一段式狀態機, 二段式狀態機和三段式狀態機。
狀態機的描述通常包含以下四部分:

  • 利用參數定義語句 parameter 描述狀態機各個狀態名稱, 即狀態編碼。狀態編碼通常有很多方法包含自然二進制編碼, One-hot 編碼,格雷編碼碼等;

  • 用時序的 always 塊描述狀態觸發器實現狀態存儲;

  • 使用敏感表和 case 語句(也采用 if-else 等價語句) 描述狀態轉換邏輯;

  • 描述狀態機的輸出邏輯。

下面根據狀態機的三種方法來具體說明

4.1,一段式狀態機

 1module?detect_1(
2input?clk_i,
3input?rst_n_i,
4output?out_o
5);
6reg?out_r;
7//狀態聲明和狀態編碼
8reg?[1:0]?state;
9parameter?[1:0]?S0=2'b00;10parameter?[1:0]?S1=2'b01;
11parameter?[1:0]?S2=2'b10;12parameter?[1:0]?S3=2'b11;
13always@(posedge?clk_i)
14begin
15??if(!rst_n_i)begin
16????state<=0;
17????out_r<=1'b0;18??end19??else20????case(state)21??????S0?:22??????begin23????????out_r<=1'b0;
24????????state<=?S1;
25??????end
26??????S1?:
27??????begin
28????????out_r<=1'b1;29????????state<=?S2;30??????end31??????S2?:32??????begin33????????out_r<=1'b0;
34????????state<=?S3;
35??????end
36??????S3?:
37????????begin
38????????out_r<=1'b1;39??????end40????endcase41end42assign?out_o=out_r;43endmodul44

一段式狀態機是應該避免使用的, 該寫法僅僅適用于非常簡單的狀態機設計。

4.2,兩段式狀態機

 1module?detect_2( 2????input?clk_i, 3????input?rst_n_i, 4????output?out_o 5??); 6??reg?out_r; 7??//狀態聲明和狀態編碼 8??reg?[1:0]?Current_state; 9??reg?[1:0]?Next_state;10??parameter?[1:0]?S0=2'b00;11??parameter?[1:0]?S1=2'b01;12??parameter?[1:0]?S2=2'b10;13??parameter?[1:0]?S3=2'b11;14??//時序邏輯:?描述狀態轉換15??always@(posedge?clk_i)16??begin17????if(!rst_n_i)18??????Current_state<=0;19????else20??????Current_state<=Next_state;21??end22??//組合邏輯:描述下一狀態和輸出23??always@(*)24??begin25????out_r=1'b0;26????case(Current_state)27??????S0?:28????????begin29??????????out_r=1'b0;30??????????Next_state=?S1;31????????end32??????S1?:33????????begin34??????????out_r=1'b1;35??????????Next_state=?S2;36????????end37??????S2?:38????????begin39??????????out_r=1'b0;40??????????Next_state=?S3;41????????end42??????S3?:43????????begin44??????????out_r=1'b1;45??????????Next_state= S0;46????????end47????endcase48??end49??assign?out_o?=?out_r;50endmodule51

兩段式狀態機采用兩個 always 模塊實現狀態機的功能, 其中一個 always 采用同步時序邏輯描述狀態轉移, 另一個 always 采用組合邏輯來判斷狀態條件轉移。

4.3,三段式狀態機

 1module?detect_3(
2????input?clk_i,
3????input?rst_n_i,
4????output?out_o
5??);
6??reg?out_r;
7??//狀態聲明和狀態編碼
8??reg?[1:0]?Current_state;
9??reg?[1:0]?Next_state;
10??parameter?[1:0]?S0=2'b00;11??parameter?[1:0]?S1=2'b01;
12??parameter?[1:0]?S2=2'b10;13??parameter?[1:0]?S3=2'b11;
14??//時序邏輯:?描述狀態轉換
15??always@(posedge?clk_i)
16??begin
17????if(!rst_n_i)
18??????Current_state<=0;
19????else
20??????Current_state<=Next_state;
21??end
22??//組合邏輯:?描述下一狀態
23??always@(*)
24??begin
25????case(Current_state)
26??????S0:
27????????Next_state?=?S1;
28??????S1:
29????????Next_state?=?S2;
30??????S2:
31????????Next_state?=?S3;
32??????S3:
33????????begin
34??????????Next_state?=?S0;
35????????end
36??????default?:
37??????Next_state?=?S0;
38????endcase
39??end
40??//輸出邏輯:?讓輸出 out,?經過寄存器 out_r 鎖存后輸出,?消除毛刺
41??always@(posedge?clk_i)
42??begin
43????if(!rst_n_i)
44??????out_r<=1'b0;45????else46??????begin47????????case(Current_state)48??????????S0,S2:49????????????out_r<=1'b0;
50??????????S1,S3:
51????????????out_r<=1'b1;52??????????default?:53????????????out_r<=out_r;54????????endcase55??????end56??end5758??assign?out_o=out_r;59endmodule60

三段式狀態機在第一個 always 模塊采用同步時序邏輯方式描述狀態轉移, 第二個always 模塊采用組合邏輯方式描述狀態轉移規律, 第三個 always 描述電路的輸出。通常讓輸出信號經過寄存器緩存之后再輸出, 消除電路毛刺。

05. 狀態機優缺點

1、一段式狀態機

只涉及時序電路,沒有競爭與冒險,同時消耗邏輯比較少。

但是如果狀態非常多,一段式狀態機顯得比較臃腫,不利于維護。

2、兩段式狀態機

當一個模塊采用時序(狀態轉移),一個模塊采用組合時候(狀態機輸出),組合邏輯電路容易造成競爭與冒險;當兩個模塊都采用時序,可以避免競爭與冒險的存在,但是整個狀態機的時序上會延時一個周期。

兩段式狀態機是推薦的狀態機設計方法。

3、三段式狀態機

狀態機輸出采用了同步寄存器輸出,也可以避免組合邏輯電路的競爭與冒險。并且在狀態機的采用這種組合邏輯電路+次態寄存器輸出,避免了兩段式狀態機的延時一個周期(三段式狀態機在上一狀態中根據輸入條件判斷當前狀態的輸出,從而在不插入額外時鐘節拍的前提下,實現寄存器的輸出)。

三段式狀態機也是比較推崇的,主要是由于維護方便, 組合邏輯與時序邏輯完全獨立。

06. 總結

靈活選擇狀態機,不一定要拘泥理論,怎樣方便怎樣來

07.擴展

四段式不是指三個always代碼,而是四段程序。使用四段式的寫法,可參照明德揚GVIM特色指令Ztj產生的狀態機模板。

明·德·揚四段式狀態機符合一次只考慮一個因素的設計理念。

  • 第一段代碼,照抄格式,完全不用想其他的。

  • 第二段代碼,只考慮狀態之間的跳轉,也就是說各個狀態機之間跳轉關系。

  • 第三段代碼,只考慮跳轉條件。

  • 第四段,每個信號逐個設計。

有興趣的話可以自己去學習一下,或者http://www.mdyedu.com/product/299.html自行看視頻。

??????????????????END??????????????????點擊【閱讀原文】可轉到IC技術圈,獲取更多知識分享

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/528983.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/528983.shtml
英文地址,請注明出處:http://en.pswp.cn/news/528983.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java中default_Java 中關于default 訪問權限的討論

Java中關于成員變量訪問權限問題一般書中會給出如下表格&#xff1a;簡單地描述一下表中的內容&#xff1a;用private 修飾的成員變量只能在類內部訪問&#xff1b;用default修飾的成員變量可以再內部訪問&#xff0c;也可以被同個包(同一目錄)中的類訪問&#xff1b;default修…

python手機解釋器_python3

Python解釋器Linux/Unix的系統上&#xff0c;Python解釋器通常被安裝在 /usr/local/python3這樣的有效路徑(目錄)里。我們可以將路徑 /usr/local/python3/bin 添加到您的Linux/Unix操作系統的環境變量中(最好參照您python的安裝路徑進行添加)&#xff0c;這樣您就可以通過 shel…

increment java_Java中的increment()有什么作用?

publicclassThisTest{privateinti0;//第一個構造器&#xff1a;有一個int型形參ThisTest(inti){this.ii1;//此時this表示引用成員變量i&#xff0c;而非函數參數iSystem.out.println("Intconstructori—...public class ThisTest {private int i0;//第一個構造器&#xff…

python保存模塊_Python使用Pickle模塊進行數據保存和讀取的講解

pickle 是一個 python 中, 壓縮/保存/提取 文件的模塊&#xff0c;字典和列表都是能被保存的.但必須注意的是python2以ASCII形式保存&#xff0c;而在python3中pickle是使用轉換二進制的數據壓縮方法保存數據所以&#xff0c;在保存或者讀取數據的時候&#xff0c;打開文件應該…

java 輸出當月日歷_java 實現打印當前月份的日歷

實現當前日歷的打印&#xff0c;當前日期用*來表示。關鍵得出這個月的第一天是星期幾。基姆拉爾森計算公式W (d2*m3*(m1)/5yy/4-y/100y/400) mod 7在公式中d表示日期中的日數1&#xff0c;m表示月份數。y表示年數。注意1&#xff1a;在公式中有個與其它公式不同的地方&#xff…

pythonmessage用法_請問Mac下如何用python讀取iMessage信息?

很早之前&#xff0c;學習Python web編程的時候&#xff0c;就涉及一個Python的urllib。可以用urllib.urlopen(“url”)。read()可以輕松讀取頁面上面的靜態信息。但是&#xff0c;隨著時代的發展&#xff0c;也來越多的網頁中更多的使用javascript、jQuery、PHP等語言動態生成…

xmlhttprequest 跨域_跨域資源共享(CORS)安全性

跨域資源共享(CORS)安全性背景 提起瀏覽器的同源策略&#xff0c;大家都很熟悉。不同域的客戶端腳本不能讀寫對方的資源。但是實踐中有一些場景需要跨域的讀寫&#xff0c;所以出現了一些hack的方式來跨域。比如在同域內做一個代理&#xff0c;JSON-P等。但這些方式都存在缺陷&…

java 圖片識別 tess4j_圖像文字識別(四):java調用tess4j識別圖像文字

轉自&#xff1a;https://blog.csdn.net/a745233700/article/details/80203340javajava調用tess4j識別圖像文字Tesseract-OCR支持中文識別&#xff0c;而且開源和提供全套的訓練工具&#xff0c;是快速低成本開發的首選。前面記錄過在java中調用tesseract-orc&#xff0c;該方法…

sql in轉換為join_同一個SQL語句,為啥性能差異咋就這么大呢?(1分鐘系列)

《數據庫允許空值&#xff0c;往往是悲劇的開始》一文通過explain來分析SQL的執行計劃&#xff0c;來分析null對索引命中情況的影響&#xff0c;有不少朋友留言&#xff0c;問explain結果中的type字段&#xff0c;ref&#xff0c;ALL等不一樣的值究竟是什么含義。今天花1分鐘簡…

java rmi接口 超時設置_Spring RMI客戶端讀超時設置 | 學步園

標準Java的RMI設置我所知道的有三種方式&#xff0c;其中第1、2種不區分框架均適用&#xff0c;但影響整個JVM級別的RMI服務1. 啟動時設置sun.rmi.transport.tcp.responseTimeout&#xff0c;單位是毫秒java -Dsun.rmi.transport.tcp.responseTimeout502.在應用程序中設置環境變…

python黑客庫長安十二時辰 更新_【Python成長之路】python 從零學爬蟲 -- 沒時間看《長安十二時辰》電視劇怎么辦?直接爬取所有劇情吧!...

【寫在前面】最近大火的《長安十二時辰》真的是好看&#xff0c;算的是良心網劇了。但是由于平時工作時間較長&#xff0c;經常無法準時追劇&#xff0c;并且又因為不想見到元裁那對挨千刀的(作為演員&#xff0c;演技是值得肯定的&#xff0c;角色演繹的讓人看的心煩)。因此就…

java字符串筆試題_五道Java常見筆試題及答案匯總

1、String和StringBuffer的區別&#xff1f;答&#xff1a;Java平臺提供了兩個類&#xff1a;String和StringBuffer&#xff0c;它們可以儲存和操作字符串&#xff0c;即包含多個字符的字符數據。這個String類提供了數值不可改變的字符串。而這個StringBuffer類提供的字符串進行…

遙感原理與應用孫家炳_2.2遙感應用模型

章節概覽遙感應用模型是遙感的一種定量化手段&#xff0c;通常在遙感領域有一個更廣為人知的名詞——定量遙感。但是定量遙感是一種方法模型而非技術手段&#xff0c;隨著科學的發展&#xff0c;熱門越來越體會到定量遙感的必要性。定量遙感的應用是十分廣泛的&#xff0c;也是…

python升級命令debian_debian python 2.7.11 升級

首先下載源tar包可利用linux自帶下載工具wget下載&#xff0c;如下所示&#xff1a;下載完成后到下載目錄下&#xff0c;解壓tar -zxvf Python-2.7.11.tgz進入解壓縮后的文件夾cdPython-2.7.11在編譯前先在/wp-content/local建一個文件夾python27(作為python的安裝路徑&#xf…

mysql必學十大必會_MYSQL 學習(一)--啟蒙篇《MYSQL必知必會》

MYSQL必知必會一. DDL 數據定義語言Data Definition Language 是指CREATE&#xff0c;ALTER和DROP語句。DDL允許添加/修改/刪除包含數據的邏輯結構&#xff0c;或允許用戶訪問/維護數據(數據庫&#xff0c;表&#xff0c;鍵&#xff0c;視圖......)的邏輯結構。DDL是關于“元數…

python連接wifi_python 自動重連wifi windows的方法

如下所示&#xff1a;# codingutf-8import urllib2import urllibfrom cookielib import CookieJarimport osimport reimport timeclass ConnectWeb(object):def __init__(self):self.cookiejarinmemory CookieJar()self.opener urllib2.build_opener(urllib2.HTTPCookieProce…

java for新循環_Java 8 新語法習慣 (for 循環的函數替代方案)

我們看這樣一個示例public class ForDemo {public static void main(String[] args) {// TODO Auto-generated method stubSystem.out.println("Get set...");for (int i 0; i < 4; i) {System.out.println(i"...");}}}測試結果Get set...0...1...2...…

喜馬拉雅 xm文件轉m4a_喜馬拉雅電臺、課程語音如何轉成文字?

今天看了一篇文章“AI面前人類一敗涂地”就是說了AI的發展讓所有的事情幾乎都可以實現科技化&#xff0c;無需人工操作&#xff0c;工作效率還比人工要高很多。這樣說來的確是這樣。語音轉換也是其中一門技術&#xff0c;人們現在對于語音的交流很多&#xff0c;比如社交軟件的…

java url特殊字符轉義字符_URL中包含有特殊字符,進行轉義

String temp URLEncoder.encode(json);URL中的特殊字符有些符號在URL中是不能直接傳遞的&#xff0c;如果要在URL中傳遞這些特殊符號&#xff0c;那么就要使用他們的編碼了。編碼的格式為&#xff1a;%加字符的ASCII碼&#xff0c;即一個百分號%&#xff0c;后面跟對應字符的A…

java 多重注解_Java注解-元數據、注解分類、內置注解和自定義注解

大家好&#xff0c;我是樂字節的小樂&#xff0c;上次說過了Java多態的6大特性|樂字節&#xff0c;接下來我們來看看Java編程里的注解。Java注解有以下幾個知識點&#xff1a;元數據注解的分類內置注解自定義注解注解處理器Servlet3.0本文先介紹前面4個知識點&#xff1a;元數據…