www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

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


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

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

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

二、設(shè)計思想:

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

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

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

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

(1):mealy型和moore型

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

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

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

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

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

            3、二進制碼狀態(tài)機

    詳解:

            有限狀態(tài)機編碼時采用格雷碼和采用獨熱碼的選擇

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

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

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

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

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

             其實很簡單,

             例一:

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

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

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

              所以獨熱碼的譯碼非常簡單。

               例二:

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

              采用格雷碼寫:

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

總結(jié)一下:

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

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

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

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

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

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

一段式狀態(tài)機:一段式狀態(tài)機只選擇一個狀態(tài)標(biāo)志位,這個狀態(tài)標(biāo)志位會在輸入的決定下選擇跳轉(zhuǎn)到下一個狀態(tài)還是維持原有狀態(tài),在每一個狀態(tài)下檢測狀態(tài)標(biāo)志位及輸入來決定其狀態(tài)的跳轉(zhuǎn)及輸出。其輸出和狀態(tài)的切換在一個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)機:二段式狀態(tài)機將狀態(tài)分為當(dāng)前狀態(tài)和此狀態(tài),其系統(tǒng)會自動將次狀態(tài)更新到當(dāng)前狀態(tài),其輸入更新在次狀態(tài)上,其決定系統(tǒng)的狀態(tài)切換和輸出。其輸出和狀態(tài)的切換在兩個個always循環(huán)塊中執(zhí)行,第一個always塊決定系統(tǒng)狀態(tài)標(biāo)志的自動跳轉(zhuǎn),第二個always塊決定系統(tǒng)根據(jù)不同狀態(tài)下的輸入進行狀態(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)機:二段式狀態(tài)機將狀態(tài)分為當(dāng)前狀態(tài)和此狀態(tài),其系統(tǒ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)切換在三個always塊中,第一個always塊決定系統(tǒng)狀態(tài)標(biāo)志的自動跳轉(zhuǎn),第二個always塊決定系統(tǒng)根據(jù)不同狀態(tài)下的輸入進行狀態(tài)的切換,第三個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)機子詳細解釋:

摩爾狀態(tài)機的架構(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)機的一點總結(jié)

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

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

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


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