沈陽(yáng)網(wǎng)站seo排名優(yōu)化愛(ài)網(wǎng)站關(guān)鍵詞查詢工具
FPGA_狀態(tài)機(jī)介紹和工作原理
- 狀態(tài)機(jī)工作原理
- Mealy 狀態(tài)機(jī)模型
- Moore 狀態(tài)機(jī)模型
- 狀態(tài)機(jī)描述方式
- 代碼格式
- 總結(jié)
狀態(tài)機(jī)工作原理
狀態(tài)機(jī)全稱是有限狀態(tài)機(jī)(Finite State Machine、FSM),是表示有限個(gè)狀態(tài)以及在這些狀態(tài)之間的轉(zhuǎn)移和動(dòng)作等行為的數(shù)學(xué)模型。
狀態(tài)機(jī)分為摩爾(Moore)型有限狀態(tài)機(jī)與米利(Mealy)型有限狀態(tài)機(jī)。摩爾狀態(tài)機(jī)輸出是只由輸入確定的有限狀態(tài)機(jī)(不直接依賴于當(dāng)前狀態(tài))。米利有限狀態(tài)機(jī)的輸出不止與其輸入有關(guān)還于它的當(dāng)前狀態(tài)相關(guān),這也是與摩爾有限狀態(tài)機(jī)的不同之處。
? Mealy 狀態(tài)機(jī):組合邏輯的輸出不僅取決于當(dāng)前狀態(tài),還取決于輸入狀態(tài)。
? Moore 狀態(tài)機(jī):組合邏輯的輸出只取決于當(dāng)前狀態(tài)。
Mealy 狀態(tài)機(jī)模型
Moore 狀態(tài)機(jī)模型
狀態(tài)機(jī)描述方式
可分為一段式、兩段式以及三段式。
一段式,整個(gè)狀態(tài)機(jī)寫到一個(gè) always 模塊里面。在該模塊中既描述狀態(tài)轉(zhuǎn)移,又描述狀態(tài)的輸入和輸出。
兩段式,用兩個(gè) always 模塊來(lái)描述狀態(tài)機(jī)。其中一個(gè) always 模塊采用同步時(shí)序描述狀態(tài)轉(zhuǎn)移,另一個(gè)模塊采用組合邏輯判斷狀態(tài)轉(zhuǎn)移條件,描述狀態(tài)轉(zhuǎn)移規(guī)律及其輸出。
三段式,在兩個(gè) always 模塊描述方法基礎(chǔ)上,使用三個(gè) always 模塊,一個(gè) always 模塊采用同步時(shí)序描述狀態(tài)轉(zhuǎn)移,一個(gè) always 采用組合邏輯判斷狀態(tài)轉(zhuǎn)移條件,描述狀態(tài)轉(zhuǎn)移規(guī)律,另一個(gè) always 模塊描述狀態(tài)輸出(可以用組合電路輸出,也可以時(shí)序電路輸出)。實(shí)際應(yīng)用中三段式狀態(tài)機(jī)使用最多,因?yàn)槿问綘顟B(tài)機(jī)將組合邏輯和時(shí)序分開(kāi),有利于綜合器分析優(yōu)化以及程序的維護(hù);并且三段式狀態(tài)機(jī)將狀態(tài)轉(zhuǎn)移與狀態(tài)輸出分開(kāi),使代碼看上去更加清晰易懂,提高了代碼的可讀性,推薦大家使用三段式狀態(tài)機(jī),本文也著重講解三段式。
三段式狀態(tài)機(jī)的基本格式是:
第一個(gè) always 語(yǔ)句實(shí)現(xiàn)同步狀態(tài)跳轉(zhuǎn);
第二個(gè) always 語(yǔ)句采用組合邏輯判斷狀態(tài)轉(zhuǎn)移條件;
第三個(gè) always 語(yǔ)句描述狀態(tài)輸出(可以用組合電路輸出,也可以時(shí)序電路輸出)。在開(kāi)始編寫狀態(tài)機(jī)代碼之前,一般先畫出狀態(tài)跳轉(zhuǎn)圖,這樣在編寫代碼時(shí)思路會(huì)比較清晰,下面以一個(gè) 7 分頻為例(對(duì)于分頻等較簡(jiǎn)單的功能,可以不使用狀態(tài)機(jī),這里只是演示狀態(tài)機(jī)編寫的方法),狀態(tài)跳轉(zhuǎn)圖如下圖所示:
代碼格式
狀態(tài)跳轉(zhuǎn)圖畫完之后,接下來(lái)通過(guò) parameter 來(lái)定義各個(gè)不同狀態(tài)的參數(shù),如下
parameter S0 = 7'b0000001; //獨(dú)熱碼定義方式
parameter S1 = 7'b0000010;
parameter S2 = 7'b0000100;
parameter S3 = 7'b0001000;
parameter S4 = 7'b0010000;
parameter S5 = 7'b0100000;
parameter S6 = 7'b1000000;
這里是使用獨(dú)熱碼的方式來(lái)定義狀態(tài)機(jī)
接下來(lái)還需要定義兩個(gè) 7 位的寄存器,一個(gè)用來(lái)表示當(dāng)前狀態(tài),另一個(gè)用來(lái)表示下一個(gè)狀態(tài),如下所示:
reg [6:0] curr_st ; //當(dāng)前狀態(tài)
reg [6:0] next_st ; //下一個(gè)狀態(tài)
接下來(lái)就可以使用三個(gè) always 語(yǔ)句來(lái)開(kāi)始編寫狀態(tài)機(jī)的代碼,第一個(gè) always 采用同步時(shí)序描述狀態(tài)
轉(zhuǎn)移,第二個(gè) always 采用組合邏輯判斷狀態(tài)轉(zhuǎn)移條件,第三個(gè) always 是描述狀態(tài)輸出,一個(gè)完整的三段
式狀態(tài)機(jī)的例子如下代碼所示:
module divider7_fsm (
//系統(tǒng)時(shí)鐘與復(fù)位
input sys_clk ,
input sys_rst_n ,//輸出時(shí)鐘
output reg clk_divide_7
);//parameter define parameter S0 = 7'b0000001; //獨(dú)熱碼定義方式parameter S1 = 7'b0000010;parameter S2 = 7'b0000100;parameter S3 = 7'b0001000;parameter S4 = 7'b0010000;parameter S5 = 7'b0100000;parameter S6 = 7'b1000000; //reg define reg [6:0] curr_st ; //當(dāng)前狀態(tài)reg [6:0] next_st ; //下一個(gè)狀態(tài)//*****************************************************//** main code//***************************************************** //狀態(tài)機(jī)的第一段采用同步時(shí)序描述狀態(tài)轉(zhuǎn)移always @(posedge sys_clk or negedge sys_rst_n) beginif (!sys_rst_n)curr_st <= S0;elsecurr_st <= next_st;end//狀態(tài)機(jī)的第二段采用組合邏輯判斷狀態(tài)轉(zhuǎn)移條件always @(*) begincase (curr_st)S0: next_st = S1;S1: next_st = S2;S2: next_st = S3;S3: next_st = S4;S4: next_st = S5;S5: next_st = S6;S6: next_st = S0;default: next_st = S0;endcaseend//狀態(tài)機(jī)的第三段描述狀態(tài)輸出(這里采用時(shí)序電路輸出)always @(posedge sys_clk or negedge sys_rst_n) beginif (!sys_rst_n)clk_divide_7 <= 1'b0;else if ((curr_st == S0) | (curr_st == S1) | (curr_st == S2) | (curr_st == S3))clk_divide_7 <= 1'b0;else if ((curr_st == S4) | (curr_st == S5) | (curr_st == S6))clk_divide_7 <= 1'b1; else;endendmodule
總結(jié)
從代碼中可以看出,輸出的分頻時(shí)鐘 clk_divide_7 只與當(dāng)前狀態(tài)(curr_st)有關(guān),而與輸入狀態(tài)無(wú)關(guān),所以屬于摩爾型狀態(tài)機(jī)。狀態(tài)機(jī)的第一段對(duì)應(yīng)摩爾狀態(tài)機(jī)模型的狀態(tài)寄存器,用來(lái)記憶狀態(tài)機(jī)當(dāng)前所處的狀態(tài);狀態(tài)機(jī)的第二段對(duì)應(yīng)摩爾狀態(tài)機(jī)模型產(chǎn)生下一狀態(tài)的組合邏輯 F;狀態(tài)機(jī)的第三段對(duì)應(yīng)摩爾狀態(tài)機(jī)產(chǎn)生輸出的組合邏輯 G,因?yàn)椴捎脮r(shí)序電路輸出有很大的優(yōu)勢(shì),所以這里第三段狀態(tài)機(jī)是由時(shí)序電路
輸出的。
狀態(tài)機(jī)時(shí)序電路輸出模型
采用這種描述方法雖然代碼結(jié)構(gòu)復(fù)雜了一些,但是這樣做的好處是可以有效地濾去組合邏輯輸出的毛刺,同時(shí)也可以更好的進(jìn)行時(shí)序計(jì)算與約束,另外對(duì)于總線形式的輸出信號(hào)來(lái)說(shuō),容易使總線數(shù)據(jù)對(duì)齊,減小總線數(shù)據(jù)間的偏移,從而降低接收端數(shù)據(jù)采樣出錯(cuò)的頻率。