下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、狀態(tài)機的兩種寫法有限狀態(tài)機 FSM廣泛應用于硬件控制電路設計,也是上常用的一種處理方法(上稱為 FMM-有限消息機)。它把復雜的控制邏輯分解成有限個穩(wěn)定狀態(tài),在每個狀態(tài)上判斷事件,變連續(xù)處理為離散數(shù)字處理,符合計算機的工作特點。同時,因為有限狀態(tài)機具有有限個狀態(tài),所以可以在實際的工程上實現(xiàn)。但這并不意味著其只能進行有限次的處理,相反,有限狀態(tài)機是閉環(huán)系統(tǒng),有限無窮,可以用有限的狀態(tài),處理無窮的事務。有限狀態(tài)機的工作原理如圖 1 所示,發(fā)生事件(event)后,根據(jù)當前狀態(tài)(cur_s定執(zhí)行的動作(action),并設置下一個狀態(tài)號(nxt_s e)。e),決|發(fā)生事件 event| cur_s
2、|執(zhí)行動作 actione |設置下一狀態(tài)號 nxt_se當前狀態(tài)圖 1 有限狀態(tài)機工作原理e0/a0-|e0/a0 |S0|-| e1/a1 V|-| e2/a2|S2|-|S1|-e2/a2-圖 2 一個有限狀態(tài)機實例當前狀態(tài)s0s1s2| 事件a0/s0-a0/s0|e0a1/s1-|e1a2/s2a2/s2-|e2表 1 圖 2 狀態(tài)機實例的二維表格表示(動作/下一狀態(tài))圖 2 為一個狀態(tài)機實例的狀態(tài)轉(zhuǎn)移圖,它的含義是:在 s0 狀態(tài),如果發(fā)生 e0 事件,那么就執(zhí)行 a0 動作,并保持狀態(tài)不變;如果發(fā)生 e1 事件,那么就執(zhí)行 a1 動作,并將狀態(tài)轉(zhuǎn)移到 s1 態(tài);如果發(fā)生 e2 事
3、件,那么就執(zhí)行 a2 動作,并將狀態(tài)轉(zhuǎn)移到 s2 態(tài);在 s1 狀態(tài),如果發(fā)生 e2 事件,那么就執(zhí)行 a2 動作,并將狀態(tài)轉(zhuǎn)移到 s2 態(tài);在 s2 狀態(tài),如果發(fā)生 e0 事件,那么就執(zhí)行 a0 動作,并將狀態(tài)轉(zhuǎn)移到 s0 態(tài);有限狀態(tài)機不僅能夠用狀態(tài)轉(zhuǎn)移圖表示,還可以用二維的表格代表。一般將當前狀態(tài)號寫在橫行上,將事件寫在縱列上,如表 1 所示。其中“-”表示空 (不執(zhí)行動作,也不進行狀態(tài)轉(zhuǎn)移),“an/sn”表示執(zhí)行動作 an,同時將下一狀態(tài)設置為 sn。表 1 和圖 2 表示的含義是完全相同的。觀察表 1 可知,狀態(tài)機可以用兩種方法實現(xiàn):豎著寫(在狀態(tài)中判斷事件)和橫著寫(在事件中判斷
4、狀態(tài))。這兩種實現(xiàn)在本質(zhì)上是完全等效的,但在實際操作中,效果卻截然不同。=豎著寫(在狀態(tài)中判斷事件)C 代碼片段=cur_s e = nxt_s e; switch(cur_s e)case s0:if(e0_event)保持狀態(tài)不變;執(zhí)行 a0 動作;/在當前狀態(tài)中判斷事件/在 s0 狀態(tài)/如果發(fā)生 e0 事件,那么就執(zhí)行 a0 動作,并/nxt_s e = s0;/因為狀態(tài)號是自身,所以可以刪除此句,以提高運行速度。else if(e1_event)狀態(tài)轉(zhuǎn)移到 s1 態(tài);執(zhí)行 a1 動作; nxt_s e = s1;else if(e2_event)狀態(tài)轉(zhuǎn)移到 s2 態(tài);執(zhí)行 a2 動作;
5、 nxt_s e = s2;break; case s1:if(e2_event)將狀態(tài)轉(zhuǎn)移到 s2 態(tài);執(zhí)行 a2 動作; nxt_s e = s2;/如果發(fā)生 e1 事件,那么就執(zhí)行 a1 動作,并將/如果發(fā)生 e2 事件,那么就執(zhí)行 a2 動作,并將/在 s1 狀態(tài)/如果發(fā)生 e2 事件,那么就執(zhí)行 a2 動作,并break; case s2:if(e0_event)將狀態(tài)轉(zhuǎn)移到 s0 態(tài);執(zhí)行 a0 動作; nxt_s e = s0;/在 s2 狀態(tài)/如果發(fā)生 e0 事件,那么就執(zhí)行 a0 動作,并=橫著寫(在事件中判斷狀態(tài))C 代碼片段=/e0 事件發(fā)生時,執(zhí)行的函數(shù)void e0_
6、event_function(cur_s e;* nxt_se)cur_s e = *nxt_s switch(cur_s e) case s0:case s2:e;/觀察表 1,在 e0 事件發(fā)生時,s1 處為空執(zhí)行 a0 動作;*nxt_s e = s0;/e1 事件發(fā)生時,執(zhí)行的函數(shù)void e1_event_function(cur_s e;* nxt_se)cur_s e = *nxt_s switch(cur_s e)case s0:e;/觀察表 1,在 e1 事件發(fā)生時,s1 和 s2 處為空執(zhí)行 a1 動作;*nxt_s e = s1;/e2 事件發(fā)生時,執(zhí)行的函數(shù)void e
7、2_event_function(* nxt_se)cur_s e;cur_s e = *nxt_s e; switch(cur_s e)case s0:case s1:執(zhí)行 a2 動作;*nxt_s e = s2;/觀察表 1,在 e2 事件發(fā)生時,s2 處為空上面橫豎兩種寫法的代碼片段,實現(xiàn)的功能完全相同,但是,橫著寫的效果明顯好于豎著寫的效果。理由如下:1、豎著寫隱含了優(yōu)先級排序(其實各個事件是同優(yōu)先級的),排面的事件判斷將毫無疑問地優(yōu)先于排在后面的事件判斷。這種 if/else if 寫法上的限制將破壞事件間原有的關(guān)系。而橫著寫不存在此問題。2、由于處在每個狀態(tài)時的事件數(shù)目不一致,而且
8、事件發(fā)生的時間是隨機的,無法預先確定,導致豎著寫淪落為順序查詢方式,結(jié)構(gòu)上的缺陷使得大量時間被浪費。對于橫著寫,在某個時間點,狀態(tài)是唯一確定的,在事件里查找狀態(tài)只要使用 switch 語句,就能一步定位到相應的狀態(tài),延遲時間可以預先準確估算。而且在事件發(fā)生時,調(diào)用事件函數(shù),在函數(shù)里查找唯一確定的狀態(tài),并根據(jù)其執(zhí)行動作和狀態(tài)轉(zhuǎn)移的思路清晰簡潔,效率高,富有美感??傊?,我個人認為,在里寫狀態(tài)機,使用橫著寫的方法比較妥帖。豎著寫的方法也不是完全不能使用,在一些小項目里,邏輯不太復雜,功能精簡,同時為了節(jié)約內(nèi)存耗費,豎著寫的方法也不失為一種合適的選擇。在 FPGA 類硬件設計中,以狀態(tài)為中心實現(xiàn)控制電
9、路狀態(tài)機(豎著寫)似乎是唯一的選擇,因為硬件不太可能靠事件驅(qū)動(橫著寫)。不過,在 FPGA 里有一個全局時鐘,在每次上升沿時進行狀態(tài)切換,使得豎著寫的效率并不低。雖然在硬件里豎著寫也要使用 IF/ELSIF這類查詢語句(用 VHDL 開發(fā)),但他們到硬件上是組合邏輯,查詢只會引起門級延遲(ns量級),而且硬件是真正并行工作的,這樣豎著寫在硬件里就沒有影響。因此,在硬件設計里,使用豎著寫的方式成為必然的選擇。這也是為什么很多搞硬件的工程師在設計狀態(tài)機時下意識地只使用豎著寫方式的原因,蓋思維定勢使然也。TCP 和PPP 框架協(xié)議里都使用了有限狀態(tài)機,這類狀態(tài)機最好使用橫著寫的方式實現(xiàn)。以某 TC
10、P 協(xié)議為例,見圖 3,有三種類型的事件:上層下達令事件;下層到達的標志和數(shù)據(jù)的收包事件;超時定時器超件。上層命令(open,close)事件|TCP|超件timeoutRST/SYN/FIN/ACK/DATA 等收包事件圖 3 三大類 TCP 狀態(tài)機事件由圖 3 可知,此 TCP 協(xié)議棧采用橫著寫方式實現(xiàn),有 3 種事件處理函數(shù),上層命令處理函數(shù)(如tcp_close);超件處理函數(shù) (tmr_slow);下層收包事件處理函數(shù)(tcp_pros)。值得一提的是,在收包事件函數(shù)里,在各個狀態(tài)里判斷 RST/SYN/FIN/ACK/DATA 等標志(這些標志類似于事件),看起來象豎著寫方式,其實,如果把包頭和數(shù)據(jù)看成一個整體,那么, RST/SYN/FIN/ACK/DA
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 隴南古建筑雕塑施工方案
- 鋁格柵幕墻施工方案
- 句容別墅地暖施工方案
- 盆式橡膠坐墊施工方案
- 遼寧苗圃立體綠化施工方案
- 石子粉基層施工方案
- 遼寧輕型鋼結(jié)構(gòu)施工方案
- 地鐵指示牌安裝施工方案
- 中國激光晶體材料未來趨勢預測分析及投資規(guī)劃研究建議報告
- 鞋店裝修保修協(xié)議樣本
- 軟件項目應急措施及方案
- 2025河北邯鄲經(jīng)開國控資產(chǎn)運營管理限公司招聘專業(yè)技術(shù)人才5名高頻重點提升(共500題)附帶答案詳解
- 2024年民法典知識競賽考試題庫及答案(共50題)
- 2025老年公寓合同管理制度
- 2024-2025學年人教版數(shù)學六年級上冊 期末綜合卷(含答案)
- 中考英語688高頻詞大綱詞頻表
- 九年級初三中考物理綜合復習測試卷3套(含答案)
- 傳熱學-第一章
- 移民推薦信4篇【精選】
- 管理制度評價表(填寫模板)
- 工地設計代表服務記錄
評論
0/150
提交評論