高速環(huán)境下的狀態(tài)機設計和優(yōu)化方法
對于分發(fā)模塊設計,關(guān)鍵參考信號是EOP及快滿(mǎn)信號AF1、AF2,參考EOP可以實(shí)現每次處理一個(gè)包,參考AF1、AF2信號可以決定相應的包該往哪個(gè) FIFO中寫(xiě)入。分發(fā)算法為:FIFO1未滿(mǎn)(AF1=0),數據包將寫(xiě)入FIFO1;如果FIFO1將滿(mǎn)且FIFO2未滿(mǎn)(AF1=1,且 AF2=0),則下一數據包將寫(xiě)入FIFO2;如果FIFO1、FIFO2都將滿(mǎn)(AF1=1且AF2=1),則進(jìn)入丟包狀態(tài)。UseFifo1狀態(tài)下數據包將寫(xiě)入FIFO1,UseFifo2狀態(tài)下數據包將寫(xiě)入FIFO2,丟包狀態(tài)下數據包被丟棄,提供丟包計數
使能 DropCountEnable。
狀態(tài)機的進(jìn)一步優(yōu)化
1. 利用一位有效編碼方式
如前所述,狀態(tài)機的工作頻率跟狀態(tài)機中各個(gè)狀態(tài)對應的不同轉移條件的入線(xiàn)數目有關(guān)。如果到一個(gè)狀態(tài)的轉移條件相同但入線(xiàn)數非常多,其邏輯實(shí)現很可能并不復雜。在一位有效編碼方式下,對于某個(gè)狀態(tài),如果其他所有狀態(tài)經(jīng)相同的轉移條件到該狀態(tài),那么其邏輯實(shí)現可以很好地化簡(jiǎn)。
例4:一位有效編碼方式下?tīng)顟B(tài)位s_State[n:0]中,
s_State[1] | s_State[2] | ... | s_State[n]=1與 s_State[0]=1等價(jià),那么
next_State[0]=(s_State[0]S) | (s_State[1]T) | (s_State[2]T) | ... | (s_State[n]) 可以化簡(jiǎn)為:
next_State[0]=(s_State[0]S) | ((~s_State[0])T),右端輸入信號數目大大減少。
2. 利用寄存器的使能信號
多數FPGA或CPLD寄存器提供使能端,如果所有的狀態(tài)機轉移必須至少滿(mǎn)足某個(gè)條件,那么這個(gè)條件可以通過(guò)使能信號連接實(shí)現,從而可以降低寄存器輸入端的邏輯復雜度。如上例中不同狀態(tài)間轉移必須以EOP為1作為前提,因而可以將該信號作為使能信號來(lái)設計。
3. 結合所選FPGA或CPLD內部邏輯單元結構編寫(xiě)代碼
以Xilinx FPGA為例,一個(gè)單元內2個(gè)4輸入查找表及相關(guān)配置邏輯可以實(shí)現5個(gè)信號輸入的最復雜的邏輯,或8~9個(gè)信號的簡(jiǎn)單邏輯(例如全與或者全或),延時(shí)為一級查找表及配置邏輯延時(shí);如果將相鄰單元的4個(gè)4輸入查找表輸出連接到一個(gè)4輸入查找表,那么可以實(shí)現最復雜的6輸入邏輯,此時(shí)需要兩級查找表延時(shí)及相關(guān)配置邏輯延時(shí)。更復雜的邏輯需要更多的級連來(lái)實(shí)現。針對高速狀態(tài)機的情況,可以盡量將狀態(tài)寄存器輸入端的邏輯來(lái)源控制在7個(gè)信號以?xún)?,從而自主控制查找表的級連級數,提高設計的工作頻率。
4. 通過(guò)修改狀態(tài)機
如果一個(gè)狀態(tài)機達不到工作頻率要求,則必須根據延時(shí)最大路徑修改設計,通常的辦法有:改變狀態(tài)設置,添加新?tīng)顟B(tài)或刪除某些狀態(tài),簡(jiǎn)化轉移條件及單個(gè)狀態(tài)連接的轉移數目;修改轉移條件設置,包括改變轉移條件的組合,以及將復雜的邏輯改為分級經(jīng)寄存器輸出由寄存器信號再形成的邏輯,后者將會(huì )改變信號時(shí)序,因而可能需要改變狀態(tài)設置。
5. 使用并行邏輯
很多情況下要參考的關(guān)鍵信號可能非常多,如果參考這些關(guān)鍵信號直接設計狀態(tài)機所得到的結果可能很復雜,個(gè)別狀態(tài)的出線(xiàn)或入線(xiàn)將會(huì )非常多,因而將降低工作頻率??梢钥紤]通過(guò)設計并行邏輯來(lái)提供狀態(tài)機的關(guān)鍵信號以及所需的中間結果,狀態(tài)機負責維護并行邏輯以及產(chǎn)生數據處理的流程。并行邏輯應分級設計,級間為寄存器,從而減少寄存器到寄存器的延時(shí)。
該設計用于使用單一數據總線(xiàn)將FIFO1~4中的數據發(fā)送到4個(gè)數據通路上去,該設計中并行邏輯產(chǎn)生每次操作時(shí)的通路及 FIFO選擇結果,狀態(tài)機負責控制每次操作的流程:在“Idle”狀態(tài)下,如果FIFO1~4中有數據包供讀取,則進(jìn)入“Schedule”狀態(tài);獲得調度結果后“Schedule”經(jīng)過(guò)一個(gè)“Wait”狀態(tài),然后進(jìn)入“ReadData”狀態(tài)讀取數據,同時(shí)開(kāi)始計數,計數到達所指定數值或者讀到數據包尾時(shí)進(jìn)入空閑狀態(tài)“Idle”,依次循環(huán)下去。
流水線(xiàn)設計
流水線(xiàn)(Pipelining)設計是將一個(gè)時(shí)鐘周期內執行的邏輯操作分成幾步較小的操作,并在較高速時(shí)鐘下完成。如果它的Tpd為T(mén),則該電路最高時(shí)鐘頻率為1/T,而假設每部分的Tpd為T(mén)/3,則其時(shí)鐘頻率可提高到原來(lái)的3倍,因而單位時(shí)間內的數據流量可以達到原來(lái)的三倍。代價(jià)是輸出信號相對于輸入滯后3個(gè)周期,時(shí)序有所改變(輸出信號的總延時(shí)一樣,但數據吞吐量提高了),同時(shí)增加了寄存器資源,而FPGA具有豐富的寄存器資源。
本文所強調的通過(guò)減少寄存器間的邏輯延時(shí)來(lái)提高狀態(tài)機的工作頻率,與流水線(xiàn)設計的出發(fā)點(diǎn)一樣,不同的是流水線(xiàn)所強調的是數據處理時(shí)的數據通路優(yōu)化,而本文所強調的是狀態(tài)機中控制邏輯的優(yōu)化。
評論