“本文主要分享了在Verilog設(shè)計過程中狀態(tài)機(jī)的一些設(shè)計方法。
關(guān)于狀態(tài)機(jī)
狀態(tài)機(jī)本質(zhì)是對具有邏輯順序或時序順序事件的一種描述方法,也就是說具有邏輯順序和時序規(guī)律的事情都適用狀態(tài)機(jī)描述。狀態(tài)機(jī)的基本要素有三個:狀態(tài)、輸出和輸入。
根據(jù)狀態(tài)機(jī)的輸出是否與輸入條件有關(guān),可將狀態(tài)機(jī)分為:
摩爾(Moore)型和米里(Mealy)型。
摩爾型狀態(tài)機(jī):輸出僅與當(dāng)前狀態(tài)有關(guān),而與輸入條件無關(guān)。
米里型狀態(tài)機(jī):輸出不僅依賴于當(dāng)前狀態(tài),還取決于輸入條件。
狀態(tài)機(jī)的邏輯通常用“case”語句或者“if-else”語句來描述,枚舉當(dāng)前狀態(tài)和輸入的所有可能組合,并為下一個狀態(tài)和輸出制定適當(dāng)?shù)闹怠?/p>
RTL級狀態(tài)機(jī)描述常用語法:
wire、reg;
parameter,用于描述狀態(tài)名稱,增強(qiáng)代碼可讀性;
always,根據(jù)主時鐘沿,完成同步時序的狀態(tài)遷移;根據(jù)信號敏感表,完成組合邏輯輸出。
case/endcase:其中default是可選的關(guān)鍵字,用于指明當(dāng)所列的所有條件都不匹配時的操作;一般的FSM設(shè)計都會加上default關(guān)鍵字描述FSM所需的補(bǔ)集狀態(tài)。
task/endtask。
幾種狀態(tài)機(jī)的描述方法
一段式FSM描述方法:一個always塊里面,即描述狀態(tài)轉(zhuǎn)移,又描述狀態(tài)的輸入和輸出。
兩段式FSM描述方法:兩個always塊,一個采用同步時序描述狀態(tài)轉(zhuǎn)移;另一個模塊采用組合邏輯判斷狀態(tài)轉(zhuǎn)移條件,描述狀態(tài)轉(zhuǎn)移規(guī)律。
三段式FSM描述方法:第一個always模塊采用同步時序描述狀態(tài)轉(zhuǎn)移;第二個采用組合邏輯判斷狀態(tài)轉(zhuǎn)移條件,描述狀態(tài)轉(zhuǎn)移規(guī)律;第三個always模塊使用同步時序電路,描述每個狀態(tài)的輸出。
一段式:
reg [2:0] Next_State;//下一個狀態(tài) parameter IDLE = 3‘b000; parameter S1 = 3’b001; parameter S2 = 3‘b010; parameter CLEAR = 3’b100;
//--------------------------------------------------------------------------------//------ 在一個always中包含狀態(tài)、輸入和輸出。 always@(posedge clk or posedge rst) begin if(rst) begin Next_State 《= IDLE; out 《= 2‘b00; end else begin case(Next_State) IDLE : begin if(key_in == 1’b1) begin Next_State 《= S1; out 《= 2‘b01;
end else begin Next_State 《= IDLE; out 《= 2’b00; end end S1 : begin if(key_in == 1‘b1) begin Next_State 《= S2; out 《= 2’b10; end else begin Next_State 《= S1; out 《= 2‘b01;
end end S2 : begin if(key_in == 1’b1) begin Next_State 《= CLEAR; out 《= 2‘b11; end else begin Next_State 《= S2; out 《= 2’b10; end end CLEAR : begin if(key_in == 1‘b1) begin Next_State 《= IDLE; out 《= 2’b00;
end else begin Next_State 《= CLEAR; out 《= 2‘b11; end end endcase end end
兩段式:
reg [2:0] Next_State;//下一個狀態(tài) reg [2:0] Current_State;//當(dāng)前狀態(tài)
parameter IDLE = 3’b000; parameter S1 = 3‘b001; parameter S2 = 3’b010; parameter CLEAR = 3‘b100;
//-------------------------------------------------------------------------------- always@(posedge clk or posedge rst) begin if(rst) Current_State 《= IDLE; else Current_State 《= Next_State; end always@(*)
// always@(rst or Current_State or key_in) begin case(Current_State) IDLE : begin idle_out;// out = 2’b00; if(key_in == 1‘b1) Next_State = S1; else Next_State = IDLE; end S1 : begin s1_out;// out = 2’b01; if(key_in == 1‘b1) Next_State = S2; else Next_State = S1; end S2 : begin s2_out;// out = 2’b10; if(key_in == 1‘b1) Next_State = CLEAR; else Next_State = S2; end CLEAR : begin clear_out;
// out = 2’b11; if(key_in == 1‘b1) Next_State = IDLE; else Next_State = CLEAR; end endcase end
//-------------------------------------------------------------------------------- task idle_out; out = 2’b00; endtask task s1_out; out = 2‘b01; endtask
task s2_out; out = 2’b10; endtask
task clear_out; out = 2‘b11; endtask
三段式:
//-------------------------------------------------------------------------------- reg [2:0] Next_State;//下一個狀態(tài) reg [2:0] Current_State;//當(dāng)前狀態(tài) parameter IDLE = 3’b000; parameter S1 = 3‘b001; parameter S2 = 3’b010; parameter CLEAR = 3‘b100;
//-------------------------------------------------------------------------------- always@(posedge clk or posedge rst) begin if(rst) Current_State 《= IDLE; else Current_State 《= Next_State; end
//--------------------------------------------------------------------------------// always@(rst or Current_State or key_in) always@(*) begin case(Current_State) IDLE : begin if(key_in == 1’b1) Next_State = S1; else Next_State = IDLE; end S1 : begin if(key_in == 1‘b1) Next_State = S2; else Next_State = S1; end S2 : begin if(key_in == 1’b1) Next_State = CLEAR; else Next_State = S2; end CLEAR : begin if(key_in == 1‘b1) Next_State = IDLE; else Next_State = CLEAR; end endcase end
//-------------------------------------------------------------------------------- always@(posedge clk or posedge rst) begin if(rst) begin out 《= 2’b00; end else begin case(Next_State) IDLE : begin out 《= 2‘b00; end S1 : begin out 《= 2’b01; end S2 : begin out 《= 2‘b10; end CLEAR : begin out 《= 2’b11; end endcase end end
//--------------------------------------------------------------------------------
結(jié)論:
一段式狀態(tài)機(jī)比較適合在狀態(tài)較少的情況下使用,因為所有的狀態(tài)、輸入和輸出都在一起,可能不是很適合閱讀、理解、維護(hù);
二段式狀態(tài)機(jī)比一段式要容易理解,但是由于輸出是組合邏輯,容易存在不穩(wěn)定與毛刺隱患;
三段式狀態(tài)機(jī)比一段式更容易理解,用時序邏輯代替組合邏輯消除了不穩(wěn)定與毛刺的隱患,但是代碼量會稍微多一點(diǎn);
責(zé)任編輯:haq
-
Verilog
+關(guān)注
關(guān)注
28文章
1352瀏覽量
110443 -
狀態(tài)機(jī)
+關(guān)注
關(guān)注
2文章
492瀏覽量
27674
原文標(biāo)題:Verilog基礎(chǔ)知識學(xué)習(xí)筆記(四)
文章出處:【微信號:zhuyandz,微信公眾號:FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
在測試過程中,如何防止電池擠壓試驗機(jī)的故障率?
![在測試<b class='flag-5'>過程中</b>,如何防止電池擠壓試驗<b class='flag-5'>機(jī)</b>的故障率?](https://file1.elecfans.com/web3/M00/05/80/wKgZO2eAb-qAFGXIAAKF8aZEYOs801.jpg)
錫膏印刷機(jī)印刷過程中有哪些不良及解決方法
![錫膏印刷<b class='flag-5'>機(jī)</b>印刷<b class='flag-5'>過程中</b>有哪些不良及解決<b class='flag-5'>方法</b>](https://file1.elecfans.com/web2/M00/90/13/wKgZomTUtRaAOLbzAACbK_O6CVg937.png)
Verilog 測試平臺設(shè)計方法 Verilog FPGA開發(fā)指南
Simulink中的狀態(tài)機(jī)建模方法 Simulink數(shù)據(jù)可視化與分析功能
Jtti:有哪些工具可以幫助我監(jiān)控自動更新過程中的系統(tǒng)狀態(tài)?
芯片制造過程中的兩種刻蝕方法
![芯片制造<b class='flag-5'>過程中</b>的兩種刻蝕<b class='flag-5'>方法</b>](https://file1.elecfans.com/web3/M00/01/4A/wKgZPGdSbPeAEpHfAABN6etD8AQ974.png)
LM5145在pre-bias啟機(jī)過程中的電壓反灌問題
![LM5145在pre-bias啟<b class='flag-5'>機(jī)</b><b class='flag-5'>過程中</b>的電壓反灌問題](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
觸發(fā)器和狀態(tài)機(jī)的關(guān)系是什么
如何在FPGA中實(shí)現(xiàn)狀態(tài)機(jī)
玩轉(zhuǎn)Spring狀態(tài)機(jī)
![玩轉(zhuǎn)Spring<b class='flag-5'>狀態(tài)機(jī)</b>](https://file1.elecfans.com//web2/M00/F3/2C/wKgaomZ46Y6AHiVCAACxvB4H4AM171.png)
關(guān)于SMU狀態(tài)機(jī)的問題求解
在Verilog中實(shí)現(xiàn)Moore型和Mealy型狀態(tài)機(jī)的方法簡析
如何采用“狀態(tài)機(jī)”解析UART數(shù)據(jù)幀
![如何采用“<b class='flag-5'>狀態(tài)機(jī)</b>”解析UART數(shù)據(jù)幀](https://file1.elecfans.com/web2/M00/C5/A7/wKgZomYBGnqAF6y_AAAPo8JrHYE779.jpg)
什么是有限狀態(tài)機(jī)?如何解決傳統(tǒng)有限狀態(tài)機(jī)「狀態(tài)爆炸」問題?
![什么是有限<b class='flag-5'>狀態(tài)機(jī)</b>?如何解決傳統(tǒng)有限<b class='flag-5'>狀態(tài)機(jī)</b>「<b class='flag-5'>狀態(tài)</b>爆炸」問題?](https://file1.elecfans.com/web2/M00/BC/F9/wKgZomWnit6AWhOqAADHlfDSp-8362.jpg)
Verilog狀態(tài)機(jī)+設(shè)計實(shí)例
![<b class='flag-5'>Verilog</b><b class='flag-5'>狀態(tài)機(jī)</b>+設(shè)計實(shí)例](https://file1.elecfans.com/web2/M00/C0/EA/wKgaomXI1-KAXkFgAAA1Fl4mqhA227.png)
評論