




已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
狀態(tài)機設(shè)計 FSM簡介: FSM 分兩大類:米里型和摩爾型,組成要素有輸入(包括復(fù)位),狀態(tài)(包括當(dāng)前狀態(tài)的操作),狀態(tài)轉(zhuǎn)移條件,狀態(tài)的輸出條件,圖1為狀態(tài)機結(jié)構(gòu)圖。設(shè)計FSM 的方法和技巧多種多樣,但是總結(jié)起來有兩大類:第一種,將狀態(tài)轉(zhuǎn)移和狀態(tài)的操作和判斷等寫到一個模塊(process、block)中。另一種是將狀態(tài)轉(zhuǎn)移單獨寫成一個模塊,將狀態(tài)的操作和判斷等寫到另一個模塊中(在Verilog代碼中,相當(dāng)于使用兩個“always” block)。其中較好的方式是后者。其原因如下: 首先FSM 和其他設(shè)計一樣,最好使用同步時序方式設(shè)計,好處不再贅述。而狀態(tài)機實現(xiàn)后,狀態(tài)轉(zhuǎn)移是用寄存器實現(xiàn)的,是同步時序部分。狀態(tài)的轉(zhuǎn)移條件的判斷是通過組合邏輯判斷實現(xiàn)的,之所以第二種比第一種編碼方式合理,就在于第二種編碼將同步時序和組合邏輯分別放到不同的程序塊(process,block)中實現(xiàn)。這樣做的好處不僅僅是便于閱讀、理解、維護,更重要的是利于綜合器優(yōu)化代碼,利于用戶添加合適的時序約束條件,利于布局布線器實現(xiàn)設(shè)計。圖1為狀態(tài)機結(jié)構(gòu)圖 顯式的FSM 描述方法可以描述任意的FSM(參考Verilog 第四版P181 有限狀態(tài)機的說明)。兩個always 模塊。其中一個是時序模塊,一個為組合邏輯。時序模塊設(shè)計與書上完全一致,表示狀態(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)機的示例,采用兩個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)機的編碼: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ù)位,時序邏輯 if (rst) state = IDLE; else state = next; always (state or i1 or i2 or i3 or i4) begin /組合邏輯,敏感列表包含當(dāng)前狀態(tài)以及所有的狀態(tài)機輸入 next = 3bx;/設(shè)置默認值,以便防止因為if或者case語句不完整綜合生成鎖存器 err = 0; n_o1 = 1; o2 = 0; o3 = 0; o4 = 0; case (state) IDLE: begin next = ERROR;/如果下面所有的if條件都不符合,則對next賦該默認值 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)機的輸出可以通過寄存器寄存一下,消除毛刺,這將另外需要一個always塊,也就是狀態(tài)機三個always塊的寫法。 編碼風(fēng)格: 1. 避免生成鎖存器 一個完備的狀態(tài)機(健壯性強)應(yīng)該具備初始化(reset)狀態(tài)和默認(default)狀態(tài)。當(dāng)芯片加電或者復(fù)位后,狀態(tài)機應(yīng)該能夠自動將所有判斷條件復(fù)位,并進入初始化狀態(tài)。需要注 明的一點是,大多數(shù)FPGA 有GSR(Global Set/Reset)信號,當(dāng)FPGA 加電后,GSR 信號拉高,對所有的寄存器,RAM 等單元復(fù)位/置位,這時配置于FPGA 的邏輯并未生效,所以不能保證正確的進入初始化狀態(tài)。所以使用GSR 進入FPGA 的初始化狀態(tài),常常會產(chǎn)生種種不必一定的麻煩。一般簡單方便的方法是采用異步復(fù)位信號,當(dāng)然也可以使用同步復(fù)位,但是要注意同步復(fù)位的邏輯設(shè)計。狀態(tài)機也應(yīng)該有一個默認(default)狀態(tài),當(dāng)轉(zhuǎn)移條件不滿足,或者狀態(tài)發(fā)生了突變時,要能保證邏輯不會陷入“死循環(huán)”。這是對狀態(tài)機健壯性的一個重要要求,也就是常說的要具備“自恢復(fù)”功能。對應(yīng)于編碼就是對case,ifelse 語句要特別注意,要寫完備的條件判斷語句。VHDL 中,當(dāng)使用CASE 語句的時候,要使用“When Others”建立默認狀態(tài)。使用“IF.THEN.ELSE”語句的時候,要在“ELSE”指定默認狀態(tài)。Verilog 中,使用“case”語句的時候要用“default”建立默認狀態(tài),使用“if.else”語句的注意事項相似。 另外有一個技巧:大多數(shù)綜合器都支持Verilog 編碼狀態(tài)機的完備狀態(tài)屬性“full case”。這個屬性用于指定將狀態(tài)機綜合成完備的狀態(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)機的綜合屬性,叫“/ synthesis parallel_case”其功能是檢查所有的狀態(tài)是“并行的”(parallel),也就是說在同一時間只有一個狀態(tài)能夠成立。 編者注:使用上述兩個綜合約束屬性會造成綜合前后仿真結(jié)果的不一致,請慎重使用。 2. 參數(shù)定義用parameter 狀態(tài)的定義用parameter 定義,不推薦使用define 宏定義的方式,因為define 宏定義在編譯時自動替換整個設(shè)計中所定義的宏,而parameter 僅僅定義模塊內(nèi)部的參數(shù),定義的參數(shù)不會與模塊外的其他狀態(tài)機混淆。 3. 時序電路中一定要使用”=”非阻塞賦值方式 Verilog的非阻塞行賦值模擬的是實際硬件中串行寄存器的行為,排除了很多潛在的競爭冒險。在使用非阻塞賦值的時候,很多設(shè)計者采用intra-assignment timing delay(在非阻塞賦值前人為加入一個很小單位的延時)。如下例: always (posedge clk or posedge rst) if (rst) state = #1 IDLE; else state = #1 nextstate; 關(guān)于這種寫法的闡釋有下面幾點: I. 首先,這種描述是行為級描述方式,僅僅在仿真時起作用,在綜合時會自動被綜合器忽略。也就是通常所說的延時描述是不可綜合的。 II. 這種描述的好處之一是:它簡單模擬了賦值過程寄存器內(nèi)部的clock-to-output 的延時,在做行為級功能仿真的時候,也可以發(fā)現(xiàn)一些由于寄存器固有延遲造成的時序和功能問題。 III. 避免了由RTL 級代碼向門級描述轉(zhuǎn)變過程中的一些潛在錯誤,如保持時間帶來的問題。 4 不論是二進制編碼的FSM,還是獨熱碼FSM,復(fù)位時狀態(tài)寄存器應(yīng)該賦值為IDLE狀態(tài),如下: always( posedge clk or posedge rst ) if( rst ) state = #1 IDLE; else state = #1 next; 如果實現(xiàn)簡化的獨熱碼FSM,復(fù)位時狀態(tài)寄存器首先賦值為全零,然后再立即置位狀態(tài)寄存器的IDLE位。注意:兩個非阻塞性賦值作用在同一位上。這完全符合Verilog標(biāo)準(zhǔn) 規(guī)定,在此情況下,最后的非阻塞性賦值會代替前面所有的非阻塞性賦值,即更新狀態(tài)機的IDLE位,如下所示: always( posedge clk or posedge rst ) if( rst ) begin state = 5b0; stateIDLE = 1b1; end else state = next; 5 狀態(tài)機中組合邏輯塊的賦值 在組合always塊中只能使用阻塞性賦值。來自同步always塊的狀態(tài)寄存器和狀態(tài)機的所有輸入觸發(fā)組合always塊,該塊更新下一狀態(tài)。應(yīng)該在組合always塊的最前面為下一狀態(tài)賦一個默認值,塊內(nèi)的case語句會更新該默認值。通常下一狀態(tài)有三種默認值:全x;預(yù)定的恢復(fù)狀態(tài),如IDLE;狀態(tài)寄存器的當(dāng)前值。如果默認值為全x,那么前仿真模型會使?fàn)顟B(tài)機在沒有任何明確的狀態(tài)轉(zhuǎn)移時,輸出未知。這不僅有利于狀態(tài)機的調(diào)試,還有利于綜合,因為綜合工具將x作為無關(guān)。一些設(shè)計(如衛(wèi)星應(yīng)用,媒體應(yīng)用,需要使用FSM觸發(fā)器作為檢測掃描鏈的設(shè)計和使用正規(guī)驗證工具做等價檢測的設(shè)計)要求下一狀態(tài)是已知的,而不是全x。通常這些設(shè)計下一狀態(tài)的默認值應(yīng)該是IDLE或全零,才能滿足設(shè)計的要求。將下一狀態(tài)初始化為默認值,可能比在每個case語句中指定明確的狀態(tài)轉(zhuǎn)移更簡單。 6 Synplify中狀態(tài)機設(shè)計: 可以在Synplify中添加在state定義時添加如下約束屬性來限定狀態(tài)機的編碼: reg 2:0 state /* synthesis syn_encoding = onehot */; Synplify中包含一個強大的FSM編輯器,可以產(chǎn)生在時間和面積上均得到優(yōu)化的狀態(tài)機設(shè)計,但這將忽略一些狀態(tài)機中未定義的狀態(tài)(invalid state),如果必須在狀態(tài)機進入了未定義的狀態(tài)后能自動回到有效狀態(tài),可以在狀態(tài)機生成時添加一個安全屬性(safe),使得到達無效狀態(tài)時能回到初始狀態(tài),這對電路的時間和面積產(chǎn)生很小的影響:reg 2:0 state /* synthesis syn_encoding = safe,onehot */; 這種方法可能與源代碼中實際描述的不一致,對于大多數(shù)設(shè)計來說這不會產(chǎn)生問題,但如果必須與源代碼中描述的狀態(tài)機流程圖相吻合,可以通過約束屬性關(guān)掉FSM編輯器:reg 4:0 state /* synthesis syn_preserve=1 */;但這將嚴(yán)重影響電路的時間和面積特性,下表是將三種方法應(yīng)用在Altera Flex10k 和 Xilinx Virtex上的比較:編者注:對第5條和第6條在Synplicity公司的Application Note ”Designing Safe Verilog State Machines with Synplify”中有更詳細的說明。 7 幾種狀態(tài)機編碼比較: 狀態(tài)機編碼有g(shù)ray、binary、onehot 等,其中Binary、gray-code 編碼使用最少的觸發(fā)器,較多的組合邏輯。而one-hot 編碼反之。由于CPLD 更多的提供組合邏輯資源,而FPGA 更多的提供觸發(fā)器資源,所以CPLD 多使用gray-code,而FPGA 多使用one-hot 編碼。另一方面,對于小型設(shè)計使用gray-code 和binary 編碼更有效,而大型狀態(tài)機使用one-hot更高效??磗ynplicity 的文檔,推薦在24 個狀態(tài)以上會用格雷碼,在524 個狀態(tài)會用獨熱碼,在4 個狀態(tài)以內(nèi)用二進制碼,肯定獨熱碼比二進制碼在實現(xiàn)FSM 部分會占更多資源,但是譯碼輸出控制簡單,所以如果狀態(tài)不是太多,獨熱碼較好。狀態(tài)太少譯碼不會太復(fù)雜,二進制就可以了。狀態(tài)太多,前面獨熱碼所占資源太多,綜合考慮就用格雷碼了。在代碼中添加綜合器的綜合約束屬性或者在圖形界面下設(shè)置綜合約束屬性可以比較方便的改變狀態(tài)的編碼。在synplify 綜合時,把FSM compile 勾上,就算用binary 表示,綜合器會自動綜合成one-hot 模式。 也可在coding 時直接添加描述: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)機輸入變量的處理 所有的輸入變量都必須與狀態(tài)機時鐘同步,否則,狀態(tài)機的實際運行可能出現(xiàn)奇怪的現(xiàn) 象,會莫名其妙地出現(xiàn)非法狀態(tài)。所有的狀態(tài)機都不可避免地可能死鎖,在運行中間歇地中止。為什么呢?這是因為,實際上所有的物理狀態(tài)機是用物理門實現(xiàn)的,而物理門的傳播延時不為0。輸入信號經(jīng)過不同的物理門組合到不同的狀態(tài)觸發(fā)器輸入端D的傳播延時有細微的差別。如果輸入信號正好在錯誤的時間改變,那么較快的通路會探測到變化,而較慢的通路則不會。時鐘是不變的,所以必定有一個觸發(fā)器會出現(xiàn)錯誤的電平。這樣就導(dǎo)致狀態(tài)轉(zhuǎn)移錯 誤,整個狀態(tài)機電路就會誤動作。這種設(shè)計錯誤通常不被人注意,因為誤動作的幾率很小。所以,一定要注意異步輸入。解決異步輸入的辦法是同步器,通常二級同步器能夠預(yù)防錯誤的狀態(tài)入口。雖然可能性很小,還是必須注意一個統(tǒng)計問題,即異步輸入還是有可能傳播通過同步器。因為兩個同步階段的出現(xiàn),這種可能性被大大地減小了。一些空間或軍事設(shè)計需要使用三級同步器,但是對于商業(yè)和工業(yè)級設(shè)計,二級同步器已經(jīng)足夠了。為了最大的減小延遲,第一級使用下降沿觸發(fā),第二級使用上升沿觸發(fā)。 9 FSM輸出產(chǎn)生 FSM的輸出邏輯可以編碼為一個獨立的連續(xù)賦值塊,也可以編碼為一個組合邏輯always塊。如果輸出賦值編碼到組合always塊中,那么輸出賦值就可以放到Verilog的task中,每 個case語句調(diào)用task。將輸出賦值與組合always塊分開,不僅有利于在需要更改時改變輸出邏輯,還可以避免綜合工具產(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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 9《短詩三首》第1課時 教學(xué)設(shè)計-2023-2024學(xué)年語文四年級下冊統(tǒng)編版
- 學(xué)生實驗5燃燒條件的探究教學(xué)設(shè)計-2024-2025學(xué)年九年級化學(xué)魯教版(2024)上冊
- Unit 4 My home Part A Let's talk(教學(xué)設(shè)計)-2024-2025學(xué)年人教PEP版英語四年級上冊
- 2024-2025學(xué)年高中語文13張衡傳習(xí)題含解析新人教版必修4
- 七年級上冊教學(xué)設(shè)計2-3世界大家庭1
- 2024-2025學(xué)年新教材高中地理單元素養(yǎng)評價一新人教版必修1
- 2024-2025學(xué)年高一歷史寒假作業(yè)第13課辛亥革命新人教版
- 川教版信息技術(shù)(2019)四年級下冊《第二單元 多彩的游記 3 圖文并茂》教學(xué)設(shè)計
- 第15課《青春之光》教學(xué)設(shè)計 2024-2025學(xué)年統(tǒng)編版語文七年級下冊標(biāo)簽標(biāo)題
- 第1課 中華文明的起源與早期國家教學(xué)設(shè)計 -2023-2024學(xué)年高中歷史統(tǒng)編版(2019)必修中外歷史綱要上冊
- 個人投資收款收據(jù)
- 建材行業(yè)較大風(fēng)險識別與防范手冊
- 2024年01月2023年上海證券交易所社會招考聘用筆試歷年高頻難、易錯考點帶答案解析
- 工藝能力分析報告
- 淋巴瘤的治療及護理
- 健身房眾籌方案
- 護理帶教匯報課件
- 基于學(xué)生主體的整本書閱讀-《鋼鐵是怎樣煉成的》(一等獎創(chuàng)新教學(xué)設(shè)計)
- 蘇教版五年級數(shù)學(xué)下冊100道口算題大全(全冊)
- (完整word版)高中英語3500詞匯表
- 社會政策概論課件
評論
0/150
提交評論