日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

有限状态机建模

發布時間:2023/12/15 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 有限状态机建模 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

有限狀態機建模

1、使用枚舉類型建立狀態機模型
枚舉類型有固定的數值
枚舉類型提供了一種定義一個具有有限合法數值集合的變量的方法。數值是用標簽而不是數字邏輯值表示的。
枚舉類型支持抽象FSM類型
枚舉類型支持更高抽象層次的建模,并且能描述精確的、可綜合的硬件行為。
使用了枚舉變量后,變量State和Next的值只可能在其枚舉列表中。在狀態邏輯中的case語句前的修飾符unique有助于保證case語句能覆蓋量State和Next所有可能值(unique case)

//使用枚舉類型建模的有限狀態機 module traffic_light(output logic green_light,yellow_light,red_light,input sensor,input[15:0] green_downcnt,yellow_downcnt,input clock,resetN ); enum{RED,GREEN,YELLOW}State,Next;//使用枚舉默認值 always_ff@(posedge clock,negedge resetN)if(!resetN) State <= RED;//復位為紅燈else State<=Next;always_comb begin:set_next_stateNext=State;//下面每個分支的缺省狀態unique case(State)RED: if(sensor) Next=GREEN;GREEN:if(green_downcnt==0) Next = YELLOW;YELLOW:if(yellow_downcnt==0)Next=RED;endcase end:set_next_statealways_comb begin:set_outputs{green_light,yellow_light,red_light} = 3'b000;unique case(State)RED:red_light = 1'b1;GREEN:green_light=1'b1;YELLOW:yellow_light=1'b1;endcase end:set_outputs endmodule

該例使用默認的枚舉基類int和每個枚舉值標簽(分別為0、1、2)的默認值。這些默認值可能不能精確反映仿真的硬件行為。int類型是一個32位兩態類型。上例的實際硬件只有三個狀態,只需一個兩態或三位向量,這取決于這三種狀態如何編碼。實際硬件實現的門級模型將具有四態語義。
1.1、使用枚舉類型表示狀態編碼
枚舉類型可以具有顯式基類
SystemVerilog還允許定義枚舉變量的基類。這就使四態類型如logic可用作基類,這可以在RTL仿真中更精確地描述硬件行為。
枚舉類型可以具有顯示值
SystemVerilog的枚舉類型也支持低抽象建模,那樣可以描述特定的狀態機結構。枚舉類型列表中的每個標簽的邏輯值都可以指定,這就可以顯示表示one-hot、one-cold、格雷碼或其他需要的任意類型的狀態序列編碼。

//指定使用枚舉類型指明用one-hot碼進行建模 module traffic_light(output logic green_light,yellow_light,red_light,input sensor,input[15:0] green_downcnt,yellow_downcnt,input clock,resetN ); enum bit[2:0]{RED=3'b001,//顯示枚舉定義GREEN=3'b010,YELLOW=3'b100}State,Next;//使用枚舉默認值 always_ff@(posedge clock,negedge resetN)if(!resetN) State <= RED;//復位為紅燈else State<=Next;always_comb begin:set_next_stateNext=State;//下面每個分支的缺省狀態unique case(State)RED: if(sensor) Next=GREEN;GREEN:if(green_downcnt==0) Next = YELLOW;YELLOW:if(yellow_downcnt==0)Next=RED;endcase end:set_next_statealways_comb begin:set_outputs{green_light,yellow_light,red_light} = 3'b000;unique case(State)RED:red_light = 1'b1;GREEN:green_light=1'b1;YELLOW:yellow_light=1'b1;endcase end:set_outputs endmodule

本例中,表示狀態序列的枚舉標簽值在RTL模型中被顯示指定。綜合編譯器將門級實現中保持這些值。這有助于比較綜合前/后模型的功能。它也使指定綜合前/后模型都適用的驗證斷言更容易。(綜合編譯器可能為了優化門級實現而提供一種重載顯示枚舉標簽值的方法,這種優化會消除很多指定顯示枚舉值的優點)。
1.2使用枚舉類型的反向case語句
case語句的典型應用是先指定一個變量為條件表達式,然后列出確定值來與條件選項列表匹配。
one-hot狀態機可以使用反向case語句
one-hot狀態機建模的另一種風格是采用反向case語句。在這種建模風格中,條件表達式和條件選項的位置顛倒了。將條件表達式指定為匹配的文本值,對于one-hot狀態機是一個1的1.而條件選項是狀態變量的每一位。對于一些綜合編譯器來說,使用反向case風格的one-hot碼狀態機會得到比標準的case語句更優化的綜合結果。

module traffic_light(output logic green_light,yellow_light,red_light,input sensor,input[15:0] green_downcnt,yellow_downcnt,input clock,resetN ); enum{R_BIT=0,//狀態寄存器中RED狀態的索引G_BIT=1,//狀態寄存器中GREEN狀態的索引Y_BIT=2}state_bit;//使用枚舉默認值//將1移到表示每個狀態的位上 enum bit[2:0]{RED=3'b001<<R_BIT,GREEN=3'b001<<G_BIT,YELLOW=3'b001<<Y_BIT}State,Next;always_ff@(posedge clock,negedge resetN)if(!resetN) State <= RED;//復位為紅燈else State<=Next;always_comb begin:set_next_stateNext=State;//下面每個分支的缺省狀態unique case(State)RED: if(sensor) Next=GREEN;GREEN:if(green_downcnt==0) Next = YELLOW;YELLOW:if(yellow_downcnt==0)Next=RED;endcase end:set_next_statealways_comb begin:set_outputs{green_light,yellow_light,red_light} = 3'b000;unique case(State)RED:red_light = 1'b1;GREEN:green_light=1'b1;YELLOW:yellow_light=1'b1;endcase end:set_outputs endmodule

在one-hot FSM模型中使用枚舉類型的巧妙編碼技巧
使用這一看似復雜的方案來指定oe-hot狀態值有兩個重要目的:

  • 在兩個枚舉類型定義中定義不同的one-hot位,不可能產生編碼錯誤。
  • 如果設計規范改變了one-hot定義,只需改變指定位的位置的枚舉類型。定義狀態名的枚舉類型將自動反映這一變化。

1.3枚舉類型與unique case語句
unique case語句減少了case語句的不確定性
在上面的例子里為case語句增加修飾符unique是十分重要的。由于one-hot碼狀態機的狀態寄存器在某一時刻只有一位是1,也只有一個條件選項與值為1的條件表達式匹配。case語句中的unique修飾符說明了三件事情。
第一,unique case指定所有條件選項必須并行求值,而不采用帶優先級的編碼方式。像綜合編譯器這樣的軟件工具可以優化這些條件選項的譯碼邏輯,從而得到更小、更有效的實現結果。在這一點上unique case與綜合的parallel case附注是一樣的。
第二,unique case指定條件選項中不應該有重疊項。例如在仿真過程中,如果條件表達式的值滿足兩個或更多條件選項,則會產生運行期警告。這種語法上的檢查可以幫組在設計過程早期發現設計錯誤。而綜合的parallel_case附注不提供這一重要的語法的檢查功能。
第三,unique case指定條件選項必須涵蓋在仿真中會產生條件表達式是所有值。對unique case,如果一個條件表達式的值不會引起一條case語句分支的執行,則會產生運行期警告。這種語法檢查也可以幫組在設計過程中更早地發現設計錯誤。這與綜合的full_case附注的功能類似,但是綜合附注不要求其他工具進行任何檢查。
1.4指定未使用的狀態值
表明條件表達式中有一些未使用的值有兩種常用的建模風格;一是使用邏輯X賦值指定默認的條件選項,另一種是使用專用的綜合full_case附注。
使用X作缺省賦值可以覆蓋未使用的狀態
將枚舉類型和unique case語句結合起來可以消除對于Verilog的case語句常用的編碼風格的要求。

//帶x默認值的verilog風格的條件語句 reg[2:0] State,Next;//3位變量 case(State)3'b001:Next=3'b010;3'b010:Next=3'b100;3'b100:Next=3'b001;default:Next=3'bxxx; endcase

若在default選項賦X值,綜合編譯器將認為所有落在默認條件內的條件表達式值都是未使用值。
枚舉類型不能直接賦X值
當使用枚舉類型時,邏輯X賦值就不是合法賦值了。枚舉類型只能從它的枚舉列表中賦值。如果需要X賦值,枚舉類型的基類必須定義為四態類型,如logic并且枚舉標簽必須用顯示X值定義。

//帶枚舉X默認值的條件語句 enum logic[2:0] {RED =3'b001,GREEN = 3'B010,YELLOW = 3'B100,BAD_STATE = 3'bxxx;}State,Next;case(State)RED:Next=GREEN;GREEN:Next=YELLOW;YELLOW:Next=RED;default:Next=BAD_STATE'endcase

枚舉類型不能直接賦X值
SystemVerilog不再需要BAD_STATE 枚舉值和default條件選項。將枚舉類型和unique case語句結合起來消除了需要使用邏輯X賦值以表明存在未使用的條件表達式值的情況。因為枚舉類型將其變量的值限制為只能是其枚舉值集中的數值,而在case語句中也只需要列出這些數值。對枚舉類型可以具有的值的定義,再加上unique case的語法檢查功能,有助于確保綜合前的RTL模型和綜合后的門級模型在仿真和等價檢查時都是相同的。
1.5將狀態值賦給枚舉類型變量
枚舉類型變量只能被賦其類型集合中的值
枚舉類型時比其他Verilog和SystemVerilog變量更強的類型,只能賦值為該枚舉類型列表里成員的數值。枚舉類型可以賦其他枚舉類型的值,但只有這兩個枚舉類型來自同一定義時才行。
使用one-hot碼狀態序列時,另一種Verilog編碼風格是首先將次態變量清零,然后再將次態變量中對應下一個狀態的位置位,這種風格不能用于枚舉類型變量

盡量使用枚舉列表中的標簽而不是具體數值對枚舉變量賦值

1.6對枚舉類型變量的操作
使用類型強制轉換就能將不同類型的是賦給枚舉類型。SystemVerilog即支持靜態強制轉換操作符又支持動態強制轉換系統函數。

typedef enum{RED,GREEN,YELLOW}states_t; states_t State,Next; Next=states_t'(State+1);//靜態強制轉換 $cast(Next,State+1);//動態強制轉換

靜態強制轉換操作會強制將一個表達式變為新的類型,而對轉換后的值是否是新的類型所規定的的有效值不作任何檢查。SystemVerilog標準允許軟件工具以不確定方式處理越界賦值。也就是說前面的靜態強制轉換賦值操作中變量Next的新值可能,或者說很可能在不同軟件工具中是不同的。
動態強制轉換對正要轉換的值執行運行期檢測。如果值越界,會報告出錯誤信息,而且目標變量的值不會變化。因此使用動態強制轉換可以發現這種無意中造成的設計錯誤,并可以修改設計以避免值的越界。
SystemVerilog還提供了許多針對枚舉類型變量的方法,可以完成枚舉類型變量的基本操作。這些方法可以對枚舉類型合法值列表中的值作遞增和遞減操作。

Next=State.next;//枚舉方法

總結

以上是生活随笔為你收集整理的有限状态机建模的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。