當(dāng)前位置:首頁 > > ZYNQ
	


一、有限狀態(tài)機(jī)定義

有限狀態(tài)機(jī)(Finite-State Machine,F(xiàn)SM),又成為有限狀態(tài)自動(dòng)機(jī),簡稱狀態(tài)機(jī),是表示有限個(gè)狀態(tài)以及在這些狀態(tài)之間的轉(zhuǎn)移和動(dòng)作等行為的數(shù)學(xué)模型。本文所講的是基于硬件描述語言Verilog HDL的有限狀態(tài)機(jī)的編寫技巧及規(guī)范。眾所周知FPGA以其并行性和可重構(gòu)性為世人所知,而在當(dāng)今的電子世界,基本所有的器件都是串行的,所以作為控制單元或者是可編程單元的FPGA需要進(jìn)行并行轉(zhuǎn)串行與外界進(jìn)行通信、控制等,而有限狀態(tài)機(jī)以其簡單實(shí)用、結(jié)構(gòu)清晰而恰如其分的充當(dāng)著這個(gè)角色。

有限狀態(tài)機(jī)是由寄存器組和組合邏輯構(gòu)成的硬件時(shí)序電路,其狀態(tài)(即由寄存器組的1和0的組合狀態(tài)所構(gòu)成的有限個(gè)狀態(tài))只可能在同一時(shí)鐘跳變沿的情況下才能從一個(gè)狀態(tài)轉(zhuǎn)向另一個(gè)狀態(tài),究竟轉(zhuǎn)向哪一狀態(tài)還是留在原狀態(tài)不但取決于各個(gè)輸入值,還取決于當(dāng)前所在狀態(tài)。

二、設(shè)計(jì)思想:

狀態(tài)機(jī)的本質(zhì)是對具有邏輯順序或時(shí)序規(guī)律事件的一種描述方法。這個(gè)論斷的最重要的兩個(gè)詞就是“邏輯順序”和“時(shí)序邏輯”,這兩點(diǎn)就是狀態(tài)機(jī)所要描述的核心和強(qiáng)項(xiàng),換言之,所有具有邏輯順序和時(shí)序規(guī)律的事情都適合用狀態(tài)機(jī)描述。

狀態(tài)機(jī)的兩種應(yīng)用思路。第一種思路,從狀態(tài)變量入手。如果一個(gè)電路具有時(shí)序邏輯或者邏輯順序,我們就可以自然而然地規(guī)劃出狀態(tài),從這些狀態(tài)入手,分析每個(gè)狀態(tài)的輸入,狀態(tài)轉(zhuǎn)移和輸出,從而完成電路功能;第二種思路,需要首先明確電路的輸出關(guān)系,這些輸出相當(dāng)于狀態(tài)的輸出,回溯規(guī)劃每個(gè)狀態(tài),和狀態(tài)轉(zhuǎn)移條件與狀態(tài)輸入。兩種思路殊途同歸,都要通過使用狀態(tài)機(jī)的目的來達(dá)到控制某部分電路的目的,完成某種具有邏輯順序或時(shí)序規(guī)律的電路設(shè)計(jì)。

在設(shè)計(jì)狀態(tài)機(jī)之前首先應(yīng)該畫出問題的狀態(tài)轉(zhuǎn)移圖,狀態(tài)轉(zhuǎn)移圖的例子如下所示:

三、狀態(tài)機(jī)分類:

(1):mealy型和moore型

狀態(tài)機(jī)有兩大類:Mealy型和Moore型。Moore型狀態(tài)機(jī)的輸出只與當(dāng)前狀態(tài)有關(guān),而Mealy型狀態(tài)機(jī)的輸出不僅取決于當(dāng)前狀態(tài),還受到輸入的直接控制,并且可能與狀態(tài)無關(guān),其狀態(tài)機(jī)結(jié)構(gòu)請看下圖:

Mealy型狀態(tài)機(jī)結(jié)構(gòu)圖
Moore型狀態(tài)機(jī)結(jié)構(gòu)圖

(2):按照狀態(tài)編碼來分類:

1、Gray(格雷碼)碼狀態(tài)機(jī)

            2、one-ho碼(獨(dú)熱碼)狀態(tài)機(jī)

            3、二進(jìn)制碼狀態(tài)機(jī)

    詳解:

            有限狀態(tài)機(jī)編碼時(shí)采用格雷碼和采用獨(dú)熱碼的選擇

             格雷碼:相鄰之間只變1bit,編碼密度高。

            獨(dú)熱碼:任何狀態(tài)只有1bit為1,其余皆為0,編碼密度低。

             比如說,表示4個(gè)狀態(tài),那么狀態(tài)機(jī)寄存器采用格雷碼編碼只需要2bit:00(S0),01(S1),11(S2),10(S3);

             采用獨(dú)熱碼需要4bit:0001(S0),0010(S1),0100(S2),1000(S3)。所以很明顯采用格雷碼可以省2bit寄存器。

             難理解的是,為什么獨(dú)熱碼更節(jié)省組合邏輯:

             其實(shí)很簡單,

             例一:

               假如我們要在代碼中判斷狀態(tài)機(jī)是否處于某狀態(tài)S1,

               對于格雷碼的狀態(tài)機(jī)來說,代碼是這樣的:assign S1 = (STATUS==2'b01);

               對于獨(dú)熱碼來說,代碼是這樣的就行:assign S1=STATUS[1];

              所以獨(dú)熱碼的譯碼非常簡單。

               例二:

               考慮最簡單的跳變,當(dāng)A為1時(shí),狀態(tài)機(jī)會從S0跳到S1:。

              采用格雷碼寫:

               STATUS[1:0] <= (STATUS==2'h00) & A ? 2'h01 : 2'h00; 采用獨(dú)熱碼寫: STATUS[1] <= STATUS[0] & A; 有人懷疑這里的邏輯,認(rèn)為只check獨(dú)熱碼的一個(gè)bit有問題。當(dāng)然是沒問題的,0110,0011等編碼屬于不care的編碼,在卡諾圖化簡中,不care的編碼可以與其余的有效編碼合并化簡。實(shí)際上綜合器也會這么做,所以獨(dú)熱碼非常容易化簡。假如說S0跳到S1條件為A;S1跳到S2條件為B;S2跳到S3條件為C;S3跳到S0條件為D;那么整個(gè)狀態(tài)機(jī) 化簡之后代碼就是: STATUS[0] <= STATUS[3] & D; STATUS[1] <= STATUS[0] & A; STATUS[2] <= STATUS[1] & B; STATUS[3] <= STATUS[2] & C;

總結(jié)一下:

獨(dú)熱碼適合寫條件復(fù)雜但是狀態(tài)少的狀態(tài)機(jī);

格雷碼適合寫條件不復(fù)雜但是狀態(tài)多的狀態(tài)機(jī)。

獨(dú)熱碼 使用的觸發(fā)器較多,但可減少實(shí)現(xiàn)狀態(tài)機(jī)的組合邏輯數(shù)目,減少復(fù)雜性,提高系統(tǒng)的速度,即工作時(shí)鐘頻率可以做到最高。格雷碼是使用最小數(shù)目的觸發(fā)器來編碼狀態(tài)機(jī),但形成的組合邏輯比較復(fù)雜。

使用獨(dú)熱碼編碼時(shí),會出現(xiàn)很多未使用的狀態(tài),而使用二進(jìn)制編碼和格雷碼編碼時(shí),如果狀態(tài)機(jī)的狀態(tài)數(shù)不是2的指 數(shù) 次方時(shí),也會出現(xiàn)未使用狀態(tài)。

格雷碼每個(gè)相鄰的狀態(tài)切換只有一個(gè)bit的信號跳變,適用于異步握手的情況,比如異步FIFO的指針計(jì)數(shù)。

(3):在Verilog中描述有限狀態(tài)機(jī),可以有三種形式,可分為一段式、二段式和三段式。這三種描述主要根據(jù)其輸入、輸出和狀態(tài)來分類。

一段式狀態(tài)機(jī):一段式狀態(tài)機(jī)只選擇一個(gè)狀態(tài)標(biāo)志位,這個(gè)狀態(tài)標(biāo)志位會在輸入的決定下選擇跳轉(zhuǎn)到下一個(gè)狀態(tài)還是維持原有狀態(tài),在每一個(gè)狀態(tài)下檢測狀態(tài)標(biāo)志位及輸入來決定其狀態(tài)的跳轉(zhuǎn)及輸出。其輸出和狀態(tài)的切換在一個(gè)always循環(huán)塊中執(zhí)行。

eg:

always()begin  S0:begin state = (in)?S0:s1;out =  ;end  S1:begin state = (in)?S1:s2;out =  ;end S2:.....................................end


二段式狀態(tài)機(jī):二段式狀態(tài)機(jī)將狀態(tài)分為當(dāng)前狀態(tài)和此狀態(tài),其系統(tǒng)會自動(dòng)將次狀態(tài)更新到當(dāng)前狀態(tài),其輸入更新在次狀態(tài)上,其決定系統(tǒng)的狀態(tài)切換和輸出。其輸出和狀態(tài)的切換在兩個(gè)個(gè)always循環(huán)塊中執(zhí)行,第一個(gè)always塊決定系統(tǒng)狀態(tài)標(biāo)志的自動(dòng)跳轉(zhuǎn),第二個(gè)always塊決定系統(tǒng)根據(jù)不同狀態(tài)下的輸入進(jìn)行狀態(tài)的跳轉(zhuǎn)及輸出。

eg:always() begin  state=next_state  end  always()  begin  S0:begin next_state = (in)?S0:s1;out =  ;end  S1:begin next_state = (in)?S1:s2;out =  ;end  S2:.....................................  end


三段式狀態(tài)機(jī):二段式狀態(tài)機(jī)將狀態(tài)分為當(dāng)前狀態(tài)和此狀態(tài),其系統(tǒng)會自動(dòng)將次狀態(tài)更新到當(dāng)前狀態(tài),系統(tǒng)的輸入更新在次狀態(tài)上,其決定系統(tǒng)的狀態(tài)切換,系統(tǒng)會根據(jù)其當(dāng)前狀態(tài)決定輸出的值。其輸出和狀態(tài)更新和狀態(tài)切換在三個(gè)always塊中,第一個(gè)always塊決定系統(tǒng)狀態(tài)標(biāo)志的自動(dòng)跳轉(zhuǎn),第二個(gè)always塊決定系統(tǒng)根據(jù)不同狀態(tài)下的輸入進(jìn)行狀態(tài)的切換,第三個(gè)always塊根據(jù)系統(tǒng)的當(dāng)前狀態(tài)決定輸出的值。

eg:always() begin  state=next_state  end  always()  begin  S0:next_state = (in)?S0:s1;  S1:next_state = (in)?S1:s2;  S2:.....................................  end always()  begin  S0:out =  ; S1:out = ; S2:..................................... end


(4),三段式狀態(tài)機(jī)子詳細(xì)解釋:

摩爾狀態(tài)機(jī)的架構(gòu)

狀態(tài)轉(zhuǎn)換圖

module finite_fsm(

z_o,

clk,

Rst_n,

w_i

);

//輸出端口

output z_o;

 

//輸入端口

input clk;

input Rst_n;

input w_i;

 

//輸出端口類型聲明

reg z_o;

 

//參數(shù)聲明

parameter IDLE = 2'b00;

parameter S0 = 2'b01;

parameter S1 = 2'b10;

//內(nèi)部信號聲明

reg[1:0] current_state;

reg[1:0] next_state;

//狀態(tài)寄存器

always @ (posedge clk or negedge Rst_n) begin

    if(!Rst_n)

            current_state <= IDLE; else current_state <= next_state; end //次態(tài)的組合邏輯 always @ (w_i or current_state) begin case(current_state) IDLE:begin if(w_i) next_state = S0; else next_state = IDLE; end S0: begin if(w_i) next_state = S1; else next_state = IDLE; end S1: begin if(w_i) next_state = S1; else next_state = IDLE; end default : next_state = 2'bxx;

   endcase

end

//輸出邏輯

always @ (*) beign case(current)

        IDLE:  z_o = 1'b0;

        S0:    z_o = 1'b0;

        S1:    z_o = 1'b1;

        default:  z_0 = 1'b0;

    endcase

end

endmodule

關(guān)于三段式狀態(tài)機(jī)的一點(diǎn)總結(jié)

1確定輸入輸出信號,及其類型(是wire還是reg);

2聲明內(nèi)部信號,一般需要定義current_state和next_state;

3用3個(gè)always語句描述狀態(tài)機(jī);第一個(gè)用來次態(tài)和現(xiàn)態(tài)的轉(zhuǎn)換,第二個(gè)always用于現(xiàn)態(tài)在輸入情況下轉(zhuǎn)換為次態(tài)的組合邏輯;第三個(gè)語句用于現(xiàn)態(tài)到輸出的組合邏輯輸出。


本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時(shí)聯(lián)系本站刪除。
關(guān)閉