




已閱讀5頁,還剩2頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
狀態(tài)機(jī)設(shè)計(jì) FSM簡介: FSM 分兩大類:米里型和摩爾型,組成要素有輸入(包括復(fù)位),狀態(tài)(包括當(dāng)前狀態(tài)的操作),狀態(tài)轉(zhuǎn)移條件,狀態(tài)的輸出條件,圖1為狀態(tài)機(jī)結(jié)構(gòu)圖。設(shè)計(jì)FSM 的方法和技巧多種多樣,但是總結(jié)起來有兩大類:第一種,將狀態(tài)轉(zhuǎn)移和狀態(tài)的操作和判斷等寫到一個模塊(process、block)中。另一種是將狀態(tài)轉(zhuǎn)移單獨(dú)寫成一個模塊,將狀態(tài)的操作和判斷等寫到另一個模塊中(在Verilog代碼中,相當(dāng)于使用兩個“always” block)。其中較好的方式是后者。其原因如下: 首先FSM 和其他設(shè)計(jì)一樣,最好使用同步時(shí)序方式設(shè)計(jì),好處不再贅述。而狀態(tài)機(jī)實(shí)現(xiàn)后,狀態(tài)轉(zhuǎn)移是用寄存器實(shí)現(xiàn)的,是同步時(shí)序部分。狀態(tài)的轉(zhuǎn)移條件的判斷是通過組合邏輯判斷實(shí)現(xiàn)的,之所以第二種比第一種編碼方式合理,就在于第二種編碼將同步時(shí)序和組合邏輯分別放到不同的程序塊(process,block)中實(shí)現(xiàn)。這樣做的好處不僅僅是便于閱讀、理解、維護(hù),更重要的是利于綜合器優(yōu)化代碼,利于用戶添加合適的時(shí)序約束條件,利于布局布線器實(shí)現(xiàn)設(shè)計(jì)。圖1為狀態(tài)機(jī)結(jié)構(gòu)圖 顯式的FSM 描述方法可以描述任意的FSM(參考Verilog 第四版P181 有限狀態(tài)機(jī)的說明)。兩個always 模塊。其中一個是時(shí)序模塊,一個為組合邏輯。時(shí)序模塊設(shè)計(jì)與書上完全一致,表示狀態(tài)轉(zhuǎn)移,可分為同步與異步復(fù)位。 同步: always (posedge clk) if (!reset) 異步: always (posedge clk or negedge reset) if (!reset) 組合邏輯用case 語句,sensitive list 包括當(dāng)然狀態(tài)(current state)和輸入(a,b,c)。 編者注:以下是編者從“State Machine Coding Styles for Synthesis”一文中摘取的程序代碼,是一個簡單狀態(tài)機(jī)的示例,采用兩個always塊的方法: module bm1_s (err, n_o1, o2, o3, o4,i1, i2, i3, i4, clk, rst); output err, n_o1, o2, o3, o4; input i1, i2, i3, i4, clk, rst; reg err, n_o1, o2, o3, o4; parameter 2:0 /可以在此處添加綜合約束屬性來限定狀態(tài)機(jī)的編碼:binary,one-hot,gray,etc IDLE = 3d0, S1 = 3d1, S2 = 3d2, S3 = 3d3, ERROR = 3d4; reg 2:0 state, next; always (posedge clk or posedge rst)/異步復(fù)位,時(shí)序邏輯 if (rst) state = IDLE; else state = next; always (state or i1 or i2 or i3 or i4) begin /組合邏輯,敏感列表包含當(dāng)前狀態(tài)以及所有的狀態(tài)機(jī)輸入 next = 3bx;/設(shè)置默認(rèn)值,以便防止因?yàn)閕f或者case語句不完整綜合生成鎖存器 err = 0; n_o1 = 1; o2 = 0; o3 = 0; o4 = 0; case (state) IDLE: begin next = ERROR;/如果下面所有的if條件都不符合,則對next賦該默認(rèn)值 if (!i1) next = IDLE; if (i1 & i2) next = S1; if (i1 & !i2 & i3) next = S2; end S1: begin next = ERROR; if (!i2) next = S1; if (i2 & i3) next = S2; if (i2 & !i3 & i4) next = S3; n_o1 = 0; o2 = 1; end S2: begin next = ERROR; if (i3) next = S2; if (!i3 & i4) next = S3; o2 = 1; o3 = 1; end S3: begin next = S3; if (!i1) next = IDLE; if (i1 & i2) next = ERROR; o4 = 1; end endmodule 對于狀態(tài)機(jī)的輸出可以通過寄存器寄存一下,消除毛刺,這將另外需要一個always塊,也就是狀態(tài)機(jī)三個always塊的寫法。 編碼風(fēng)格: 1. 避免生成鎖存器 一個完備的狀態(tài)機(jī)(健壯性強(qiáng))應(yīng)該具備初始化(reset)狀態(tài)和默認(rèn)(default)狀態(tài)。當(dāng)芯片加電或者復(fù)位后,狀態(tài)機(jī)應(yīng)該能夠自動將所有判斷條件復(fù)位,并進(jìn)入初始化狀態(tài)。需要注 明的一點(diǎn)是,大多數(shù)FPGA 有GSR(Global Set/Reset)信號,當(dāng)FPGA 加電后,GSR 信號拉高,對所有的寄存器,RAM 等單元復(fù)位/置位,這時(shí)配置于FPGA 的邏輯并未生效,所以不能保證正確的進(jìn)入初始化狀態(tài)。所以使用GSR 進(jìn)入FPGA 的初始化狀態(tài),常常會產(chǎn)生種種不必一定的麻煩。一般簡單方便的方法是采用異步復(fù)位信號,當(dāng)然也可以使用同步復(fù)位,但是要注意同步復(fù)位的邏輯設(shè)計(jì)。狀態(tài)機(jī)也應(yīng)該有一個默認(rèn)(default)狀態(tài),當(dāng)轉(zhuǎn)移條件不滿足,或者狀態(tài)發(fā)生了突變時(shí),要能保證邏輯不會陷入“死循環(huán)”。這是對狀態(tài)機(jī)健壯性的一個重要要求,也就是常說的要具備“自恢復(fù)”功能。對應(yīng)于編碼就是對case,ifelse 語句要特別注意,要寫完備的條件判斷語句。VHDL 中,當(dāng)使用CASE 語句的時(shí)候,要使用“When Others”建立默認(rèn)狀態(tài)。使用“IF.THEN.ELSE”語句的時(shí)候,要在“ELSE”指定默認(rèn)狀態(tài)。Verilog 中,使用“case”語句的時(shí)候要用“default”建立默認(rèn)狀態(tài),使用“if.else”語句的注意事項(xiàng)相似。 另外有一個技巧:大多數(shù)綜合器都支持Verilog 編碼狀態(tài)機(jī)的完備狀態(tài)屬性“full case”。這個屬性用于指定將狀態(tài)機(jī)綜合成完備的狀態(tài),如Synplicity 的綜合工具(Synplify/Synplify Pro)支持的命令格式如下: case (current_state) / synthesis full_case 2b00 : next_state = 2b01; 2b01 : next_state = 2b11; 2b11 : next_state = 2b00; /這兩段代碼等效 case (current_state) 2b00 : next_state = 2b01; 2b01 : next_state = 2b11; 2b11 : next_state = 2b00; default : next_state = 2bx; Synplicity 還有一個關(guān)于狀態(tài)機(jī)的綜合屬性,叫“/ synthesis parallel_case”其功能是檢查所有的狀態(tài)是“并行的”(parallel),也就是說在同一時(shí)間只有一個狀態(tài)能夠成立。 編者注:使用上述兩個綜合約束屬性會造成綜合前后仿真結(jié)果的不一致,請慎重使用。 2. 參數(shù)定義用parameter 狀態(tài)的定義用parameter 定義,不推薦使用define 宏定義的方式,因?yàn)閐efine 宏定義在編譯時(shí)自動替換整個設(shè)計(jì)中所定義的宏,而parameter 僅僅定義模塊內(nèi)部的參數(shù),定義的參數(shù)不會與模塊外的其他狀態(tài)機(jī)混淆。 3. 時(shí)序電路中一定要使用”=”非阻塞賦值方式 Verilog的非阻塞行賦值模擬的是實(shí)際硬件中串行寄存器的行為,排除了很多潛在的競爭冒險(xiǎn)。在使用非阻塞賦值的時(shí)候,很多設(shè)計(jì)者采用intra-assignment timing delay(在非阻塞賦值前人為加入一個很小單位的延時(shí))。如下例: always (posedge clk or posedge rst) if (rst) state = #1 IDLE; else state = #1 nextstate; 關(guān)于這種寫法的闡釋有下面幾點(diǎn): I. 首先,這種描述是行為級描述方式,僅僅在仿真時(shí)起作用,在綜合時(shí)會自動被綜合器忽略。也就是通常所說的延時(shí)描述是不可綜合的。 II. 這種描述的好處之一是:它簡單模擬了賦值過程寄存器內(nèi)部的clock-to-output 的延時(shí),在做行為級功能仿真的時(shí)候,也可以發(fā)現(xiàn)一些由于寄存器固有延遲造成的時(shí)序和功能問題。 III. 避免了由RTL 級代碼向門級描述轉(zhuǎn)變過程中的一些潛在錯誤,如保持時(shí)間帶來的問題。 4 不論是二進(jìn)制編碼的FSM,還是獨(dú)熱碼FSM,復(fù)位時(shí)狀態(tài)寄存器應(yīng)該賦值為IDLE狀態(tài),如下: always( posedge clk or posedge rst ) if( rst ) state = #1 IDLE; else state = #1 next; 如果實(shí)現(xiàn)簡化的獨(dú)熱碼FSM,復(fù)位時(shí)狀態(tài)寄存器首先賦值為全零,然后再立即置位狀態(tài)寄存器的IDLE位。注意:兩個非阻塞性賦值作用在同一位上。這完全符合Verilog標(biāo)準(zhǔn) 規(guī)定,在此情況下,最后的非阻塞性賦值會代替前面所有的非阻塞性賦值,即更新狀態(tài)機(jī)的IDLE位,如下所示: always( posedge clk or posedge rst ) if( rst ) begin state = 5b0; stateIDLE = 1b1; end else state = next; 5 狀態(tài)機(jī)中組合邏輯塊的賦值 在組合always塊中只能使用阻塞性賦值。來自同步always塊的狀態(tài)寄存器和狀態(tài)機(jī)的所有輸入觸發(fā)組合always塊,該塊更新下一狀態(tài)。應(yīng)該在組合always塊的最前面為下一狀態(tài)賦一個默認(rèn)值,塊內(nèi)的case語句會更新該默認(rèn)值。通常下一狀態(tài)有三種默認(rèn)值:全x;預(yù)定的恢復(fù)狀態(tài),如IDLE;狀態(tài)寄存器的當(dāng)前值。如果默認(rèn)值為全x,那么前仿真模型會使?fàn)顟B(tài)機(jī)在沒有任何明確的狀態(tài)轉(zhuǎn)移時(shí),輸出未知。這不僅有利于狀態(tài)機(jī)的調(diào)試,還有利于綜合,因?yàn)榫C合工具將x作為無關(guān)。一些設(shè)計(jì)(如衛(wèi)星應(yīng)用,媒體應(yīng)用,需要使用FSM觸發(fā)器作為檢測掃描鏈的設(shè)計(jì)和使用正規(guī)驗(yàn)證工具做等價(jià)檢測的設(shè)計(jì))要求下一狀態(tài)是已知的,而不是全x。通常這些設(shè)計(jì)下一狀態(tài)的默認(rèn)值應(yīng)該是IDLE或全零,才能滿足設(shè)計(jì)的要求。將下一狀態(tài)初始化為默認(rèn)值,可能比在每個case語句中指定明確的狀態(tài)轉(zhuǎn)移更簡單。 6 Synplify中狀態(tài)機(jī)設(shè)計(jì): 可以在Synplify中添加在state定義時(shí)添加如下約束屬性來限定狀態(tài)機(jī)的編碼: reg 2:0 state /* synthesis syn_encoding = onehot */; Synplify中包含一個強(qiáng)大的FSM編輯器,可以產(chǎn)生在時(shí)間和面積上均得到優(yōu)化的狀態(tài)機(jī)設(shè)計(jì),但這將忽略一些狀態(tài)機(jī)中未定義的狀態(tài)(invalid state),如果必須在狀態(tài)機(jī)進(jìn)入了未定義的狀態(tài)后能自動回到有效狀態(tài),可以在狀態(tài)機(jī)生成時(shí)添加一個安全屬性(safe),使得到達(dá)無效狀態(tài)時(shí)能回到初始狀態(tài),這對電路的時(shí)間和面積產(chǎn)生很小的影響:reg 2:0 state /* synthesis syn_encoding = safe,onehot */; 這種方法可能與源代碼中實(shí)際描述的不一致,對于大多數(shù)設(shè)計(jì)來說這不會產(chǎn)生問題,但如果必須與源代碼中描述的狀態(tài)機(jī)流程圖相吻合,可以通過約束屬性關(guān)掉FSM編輯器:reg 4:0 state /* synthesis syn_preserve=1 */;但這將嚴(yán)重影響電路的時(shí)間和面積特性,下表是將三種方法應(yīng)用在Altera Flex10k 和 Xilinx Virtex上的比較:編者注:對第5條和第6條在Synplicity公司的Application Note ”Designing Safe Verilog State Machines with Synplify”中有更詳細(xì)的說明。 7 幾種狀態(tài)機(jī)編碼比較: 狀態(tài)機(jī)編碼有g(shù)ray、binary、onehot 等,其中Binary、gray-code 編碼使用最少的觸發(fā)器,較多的組合邏輯。而one-hot 編碼反之。由于CPLD 更多的提供組合邏輯資源,而FPGA 更多的提供觸發(fā)器資源,所以CPLD 多使用gray-code,而FPGA 多使用one-hot 編碼。另一方面,對于小型設(shè)計(jì)使用gray-code 和binary 編碼更有效,而大型狀態(tài)機(jī)使用one-hot更高效??磗ynplicity 的文檔,推薦在24 個狀態(tài)以上會用格雷碼,在524 個狀態(tài)會用獨(dú)熱碼,在4 個狀態(tài)以內(nèi)用二進(jìn)制碼,肯定獨(dú)熱碼比二進(jìn)制碼在實(shí)現(xiàn)FSM 部分會占更多資源,但是譯碼輸出控制簡單,所以如果狀態(tài)不是太多,獨(dú)熱碼較好。狀態(tài)太少譯碼不會太復(fù)雜,二進(jìn)制就可以了。狀態(tài)太多,前面獨(dú)熱碼所占資源太多,綜合考慮就用格雷碼了。在代碼中添加綜合器的綜合約束屬性或者在圖形界面下設(shè)置綜合約束屬性可以比較方便的改變狀態(tài)的編碼。在synplify 綜合時(shí),把FSM compile 勾上,就算用binary 表示,綜合器會自動綜合成one-hot 模式。 也可在coding 時(shí)直接添加描述:VHDL attribute TYPE_ENCODING_style of : type is ONEHOT; Verilog Reg2:0 state; / synthesis syn_encoding = value(onehot) 其中onehot編碼又分為幾種:verbose one-hot 、simplified one-hot、one-hot with zero-idle,關(guān)于其具體區(qū)別請參考“State Machine Coding Styles for Synthesis“一文。 8 同步狀態(tài)機(jī)輸入變量的處理 所有的輸入變量都必須與狀態(tài)機(jī)時(shí)鐘同步,否則,狀態(tài)機(jī)的實(shí)際運(yùn)行可能出現(xiàn)奇怪的現(xiàn) 象,會莫名其妙地出現(xiàn)非法狀態(tài)。所有的狀態(tài)機(jī)都不可避免地可能死鎖,在運(yùn)行中間歇地中止。為什么呢?這是因?yàn)椋瑢?shí)際上所有的物理狀態(tài)機(jī)是用物理門實(shí)現(xiàn)的,而物理門的傳播延時(shí)不為0。輸入信號經(jīng)過不同的物理門組合到不同的狀態(tài)觸發(fā)器輸入端D的傳播延時(shí)有細(xì)微的差別。如果輸入信號正好在錯誤的時(shí)間改變,那么較快的通路會探測到變化,而較慢的通路則不會。時(shí)鐘是不變的,所以必定有一個觸發(fā)器會出現(xiàn)錯誤的電平。這樣就導(dǎo)致狀態(tài)轉(zhuǎn)移錯 誤,整個狀態(tài)機(jī)電路就會誤動作。這種設(shè)計(jì)錯誤通常不被人注意,因?yàn)檎`動作的幾率很小。所以,一定要注意異步輸入。解決異步輸入的辦法是同步器,通常二級同步器能夠預(yù)防錯誤的狀態(tài)入口。雖然可能性很小,還是必須注意一個統(tǒng)計(jì)問題,即異步輸入還是有可能傳播通過同步器。因?yàn)閮蓚€同步階段的出現(xiàn),這種可能性被大大地減小了。一些空間或軍事設(shè)計(jì)需要使用三級同步器,但是對于商業(yè)和工業(yè)級設(shè)計(jì),二級同步器已經(jīng)足夠了。為了最大的減小延遲,第一級使用下降沿觸發(fā),第二級使用上升沿觸發(fā)。 9 FSM輸出產(chǎn)生 FSM的輸出邏輯可以編碼為一個獨(dú)立的連續(xù)賦值塊,也可以編碼為一個組合邏輯always塊。如果輸出賦值編碼到組合always塊中,那么輸出賦值就可以放到Verilog的task中,每 個case語句調(diào)用task。將輸出賦值與組合always塊分開,不僅有利于在需要更改時(shí)改變輸出邏輯,還可以避免綜合工具產(chǎn)生意外的鎖存
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030中國對甲苯磺酸腺苷蛋氨酸在寵物上應(yīng)用行業(yè)產(chǎn)銷需求與投資可行性分析研究報(bào)告
- 2025-2030中國家電濕巾行業(yè)銷售渠道前景與經(jīng)營效益調(diào)研研究報(bào)告
- 2025-2030中國家政機(jī)器人行業(yè)市場運(yùn)行分析及競爭格局與投資發(fā)展研究報(bào)告
- 五金管件行業(yè)直播電商戰(zhàn)略研究報(bào)告
- 2025-2030中國定制鞋行業(yè)市場發(fā)展趨勢與前景展望戰(zhàn)略研究報(bào)告
- 2025-2030中國學(xué)生營養(yǎng)奶粉行業(yè)市場深度調(diào)研及市場供需與投資價(jià)值研究報(bào)告
- 體育場地設(shè)施建設(shè)行業(yè)跨境出海戰(zhàn)略研究報(bào)告
- 2025-2030中國婦女衛(wèi)生巾制造行業(yè)消費(fèi)規(guī)模與未來供求趨勢研究報(bào)告
- 互聯(lián)網(wǎng)廣播企業(yè)制定與實(shí)施新質(zhì)生產(chǎn)力戰(zhàn)略研究報(bào)告
- 2025-2030中國天然腸衣行業(yè)市場現(xiàn)狀供需分析及投資評估規(guī)劃分析研究報(bào)告
- 鍵盤顯示器接口課件
- 良性前列腺增生診療指南
- 預(yù)防校園欺凌-共創(chuàng)和諧校園-模擬法庭劇本
- 中國火車發(fā)展歷程課件
- 執(zhí)行力、心態(tài)管理培訓(xùn)課件
- 河北省廊坊市各縣區(qū)鄉(xiāng)鎮(zhèn)行政村村莊村名居民村民委員會明細(xì)及行政區(qū)劃代碼
- (最新)信貸資產(chǎn)風(fēng)險(xiǎn)分類管理辦法
- 不甘屈辱奮勇抗?fàn)幍谌n時(shí)甲午風(fēng)云課件五年級道德與法治
- 家具廠安全生產(chǎn)臺帳
- ESC700培訓(xùn)(PPT35頁)(PPT 36頁)
- 精神科應(yīng)急預(yù)案PPT課件
評論
0/150
提交評論