<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > EDA/PCB > 設(shè)計(jì)應(yīng)用 > 高速環(huán)境下的狀態(tài)機(jī)設(shè)計(jì)和優(yōu)化方法

          高速環(huán)境下的狀態(tài)機(jī)設(shè)計(jì)和優(yōu)化方法

          作者: 時(shí)間:2009-05-12 來源:網(wǎng)絡(luò) 收藏

            通過減少寄存器間的邏輯延時(shí)來提高工作頻率,或通過流水線設(shè)計(jì)來優(yōu)化數(shù)據(jù)處理時(shí)的數(shù)據(jù)通路來滿足高速下FPGA或CPLD中的狀態(tài)機(jī)設(shè)計(jì)要求。本文給出了采用這些技術(shù)的高速狀態(tài)機(jī)設(shè)計(jì)的規(guī)范及分析和優(yōu)化,并給出了相應(yīng)的示例。

          本文引用地址:http://www.ex-cimer.com/article/192055.htm

            為了使FPGA或CPLD中的狀態(tài)機(jī)設(shè)計(jì)滿足高速要求,設(shè)計(jì)工程師需要認(rèn)識(shí)到以下幾點(diǎn):寄存器資源和邏輯資源已經(jīng)不是問題的所在,狀態(tài)機(jī)本身所占用的 FPGA或CPLD邏輯資源或寄存器資源非常小;狀態(tài)機(jī)對(duì)整體數(shù)據(jù)流的是串行操作,如果希望數(shù)據(jù)處理的延時(shí)非常小,就必須提高操作的并行程度,壓縮狀態(tài)機(jī)中狀態(tài)轉(zhuǎn)移的路徑長(zhǎng)度;高速環(huán)境下應(yīng)合理分配狀態(tài)機(jī)的狀態(tài)及轉(zhuǎn)移條件。本文將結(jié)合實(shí)際應(yīng)用案例來說明。

            狀態(tài)機(jī)設(shè)計(jì)規(guī)范

            1. 使用一位有效的方式進(jìn)行狀態(tài)編碼

            狀態(tài)機(jī)中狀態(tài)編碼主要有三種:連續(xù)編碼(sequential encoding)、一位有效(one-hot encoding)方式編碼以及不屬于這兩種的編碼。例如,對(duì)于一個(gè)5個(gè)狀態(tài)(State0~State4)的狀態(tài)機(jī),連續(xù)編碼方式狀態(tài)編碼為:State0-000、State1-001、State2-010、State3-011、State4-100。一位有效方式為下為:State0-00001、State1-00010、State2-00100、State3-01000、State4-10000。對(duì)于自行定義的編碼則差別很大,例如試圖將狀態(tài)機(jī)的狀態(tài)位直接作為輸出所需信號(hào),這可能會(huì)增加設(shè)計(jì)難度。

            使用一位有效編碼方式使邏輯實(shí)現(xiàn)更簡(jiǎn)潔,因?yàn)橐粋€(gè)狀態(tài)只需要用一位來指示,而為此增加的狀態(tài)寄存器數(shù)目相對(duì)于整個(gè)設(shè)計(jì)來說可以忽略。一位有效至少有兩個(gè)含義:對(duì)每個(gè)狀態(tài)位,該位為1對(duì)應(yīng)唯一的狀態(tài),判斷當(dāng)前狀態(tài)是否為該狀態(tài),只需判斷該狀態(tài)位是否為1;如果狀態(tài)寄存器輸入端該位為1,則下一狀態(tài)將轉(zhuǎn)移為該狀態(tài),判斷下一狀態(tài)是否為該狀態(tài),只需判斷表示下一狀態(tài)的信號(hào)中該位是否為1。

            2. 合理分配狀態(tài)轉(zhuǎn)移條件

            在狀態(tài)轉(zhuǎn)移圖中,每個(gè)狀態(tài)都有對(duì)應(yīng)的出線和入線,從不同狀態(tài)經(jīng)不同的轉(zhuǎn)移條件到該狀態(tài)的入線數(shù)目不能太多。以采用與或邏輯的CPLD設(shè)計(jì)來分析,如果這樣的入線太多則將會(huì)需要較多的乘積項(xiàng)及或邏輯,這就需要更多級(jí)的邏輯級(jí)聯(lián)來完成,從而增加了寄存器間的延遲;對(duì)于FPGA則需要多級(jí)查找表來實(shí)現(xiàn)相應(yīng)的邏輯,同樣會(huì)增加延遲。狀態(tài)機(jī)的應(yīng)用模型如圖1所示。

          狀態(tài)機(jī)的應(yīng)用模型

            狀態(tài)機(jī)設(shè)計(jì)的分析

            狀態(tài)機(jī)設(shè)計(jì)的分析方法可以分為兩種:一種是流程處理分析,即分析數(shù)據(jù)如何分步處理,將相應(yīng)處理的步驟依次定為不同狀態(tài),該方法能夠分析非常復(fù)雜的狀態(tài)機(jī),類似于編寫一個(gè)軟件程序的分析,典型設(shè)計(jì)如讀寫操作和數(shù)據(jù)包字節(jié)分析;另一種方法是關(guān)鍵條件分析,即根據(jù)參考信號(hào)的邏輯條件來確定相應(yīng)的狀態(tài),這樣的參考信號(hào)如空或滿指示、起始或結(jié)束、握手應(yīng)答信號(hào)等。這兩種分析方法并沒有嚴(yán)格的界限,在實(shí)際的狀態(tài)機(jī)設(shè)計(jì)分析時(shí)往往是這兩種方法結(jié)合使用。下面分別說明這兩種分析方法。

            1. 流程處理分析

            例如,在一個(gè)讀取ZBT SRAM中數(shù)據(jù)包的設(shè)計(jì)中,要根據(jù)讀出的數(shù)據(jù)中EOP(End of Packet)信號(hào)是否為1來決定一個(gè)包的讀操作是否結(jié)束,由于讀取數(shù)據(jù)的延后,這樣就會(huì)從ZBT SRAM中多讀取數(shù)據(jù),為此可以設(shè)計(jì)一個(gè)信號(hào)VAL_out來過濾掉多讀的數(shù)據(jù)。

            根據(jù)數(shù)據(jù)到達(dá)的先后及占用的時(shí)鐘周期數(shù),可以設(shè)計(jì)如圖2所示的狀態(tài)機(jī)(本文設(shè)定:文字說明及插圖中當(dāng)前狀態(tài)表示為s_State[n:0],為狀態(tài)寄存器的輸出;下一狀態(tài)next_State[n:0],為狀態(tài)寄存器的輸入;信號(hào)之間的邏輯關(guān)系采用Verilog語(yǔ)言(或C語(yǔ)言)中的符號(hào)表示;#R表示需要經(jīng)過一級(jí)寄存器,輸出信號(hào)對(duì)應(yīng)寄存器的輸出端)。該狀態(tài)機(jī)首先判斷是否已經(jīng)到達(dá)包尾,如果是,則依次進(jìn)入6個(gè)等待狀態(tài),等待狀態(tài)下的數(shù)據(jù)無效,6個(gè)等待狀態(tài)結(jié)束后將正常處理數(shù)據(jù)。

          狀態(tài)機(jī)

            2. 關(guān)鍵條件分析

            一個(gè)路由器線卡高速數(shù)據(jù)包分發(fā)處理的框圖,較高速率的數(shù)據(jù)包經(jīng)過分發(fā)模塊以包為單位送往兩個(gè)較低速率數(shù)據(jù)通路(即寫入FIFO1或FIFO2)。


          上一頁(yè) 1 2 下一頁(yè)

          關(guān)鍵詞: 環(huán)境 方法

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();