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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > PCI總線目標(biāo)控制器的設(shè)計(jì)

          PCI總線目標(biāo)控制器的設(shè)計(jì)

          作者: 時(shí)間:2012-11-07 來源:網(wǎng)絡(luò) 收藏

            共分為10個(gè)狀態(tài),下面對每個(gè)狀態(tài)的意義及狀態(tài)跳轉(zhuǎn)條件的詳細(xì)說明:

            目標(biāo)空閑(idle):當(dāng)總線有新的命令但控制器正忙于未完成的數(shù)據(jù)傳輸或寄存器配置時(shí),跳轉(zhuǎn)到check_abort;控制器空閑但寄存器內(nèi)有記錄的未完成的讀操作,跳轉(zhuǎn)到check_addr;總線上有數(shù)據(jù)傳輸要求而又未出現(xiàn)上面的兩種情況,狀態(tài)機(jī)跳轉(zhuǎn)至cmd_start。

            啟動(dòng)命令解碼(cmd_start):滿足放棄條件如奇偶校驗(yàn)錯(cuò)誤、強(qiáng)制放棄等條件時(shí),狀態(tài)機(jī)跳轉(zhuǎn)至start_abort;不滿足放棄條件,若目標(biāo)設(shè)備沒有突發(fā)傳輸能力,狀態(tài)機(jī)跳轉(zhuǎn)至start_single,若目標(biāo)設(shè)備有突發(fā)傳輸能力且主設(shè)備發(fā)起的是寫命令,狀態(tài)機(jī)跳轉(zhuǎn)至start_multiple,如果目標(biāo)設(shè)備有突發(fā)傳輸能力且主設(shè)備發(fā)起的是延遲讀命令,狀態(tài)機(jī)跳至start_retry;上述情況均未發(fā)生,狀態(tài)機(jī)跳轉(zhuǎn)至start_wait_rd1。

            檢查地址匹配(check_addr):滿足放棄條件如奇偶校驗(yàn)錯(cuò)誤、強(qiáng)制放棄等條件時(shí),狀態(tài)機(jī)跳轉(zhuǎn)至start_abort;如果地址與之前的請求地址一致,對目標(biāo)設(shè)備進(jìn)行延遲讀,狀態(tài)機(jī)跳轉(zhuǎn)至start_multiple;如果地址不一致狀態(tài)機(jī)跳轉(zhuǎn)至start_retry。

            放棄條件檢測(check_abort):滿足放棄條件如奇偶校驗(yàn)錯(cuò)誤、強(qiáng)制放棄等條件時(shí),狀態(tài)機(jī)跳轉(zhuǎn)至start_abort;不滿足條件,狀態(tài)機(jī)轉(zhuǎn)至start_retry。

            讀等待狀態(tài)1(start_wait_rd1):如果FIFO中有了待傳輸?shù)臄?shù)據(jù),狀態(tài)機(jī)跳轉(zhuǎn)至start_wait_rd2;否則一直等待在狀態(tài)start_wait_rd1。

            讀等待狀態(tài)2(start_wait_rd2):FIFO中已經(jīng)有了所要讀取的數(shù)據(jù),狀態(tài)機(jī)跳轉(zhuǎn)至start_multiple。

            目標(biāo)設(shè)備放棄(start_abort):一直維持該狀態(tài)直到主設(shè)備聲明傳輸結(jié)束,狀態(tài)機(jī)轉(zhuǎn)至idle。

            單數(shù)據(jù)傳輸(start_single):如果主設(shè)備聲明最后一個(gè)數(shù)據(jù)傳輸,狀態(tài)機(jī)跳轉(zhuǎn)至idle;如果主設(shè)備繼續(xù)對該目標(biāo)設(shè)備進(jìn)行讀寫操作,狀態(tài)機(jī)跳轉(zhuǎn)至start_retry。

            數(shù)據(jù)突發(fā)傳輸(start_multiple):如果剩下最后一個(gè)字節(jié)傳輸,狀態(tài)機(jī)跳轉(zhuǎn)到idle;如果地址信息無效或地址越界,狀態(tài)機(jī)跳轉(zhuǎn)到start_retry;如果接收FIFO幾乎滿了而主設(shè)備繼續(xù)往其中寫入數(shù)據(jù),狀態(tài)機(jī)跳轉(zhuǎn)到start_retry;其它情況狀態(tài)機(jī)保持start_multiple狀態(tài)不變。

            重試(start_retry):一直維持該狀態(tài)直到主設(shè)備聲明傳輸結(jié)束,狀態(tài)機(jī)轉(zhuǎn)至idle。

          3數(shù)據(jù)通路實(shí)現(xiàn)

            的數(shù)據(jù)通路具體可通過兩種類型的目標(biāo)接口實(shí)現(xiàn):寄存器型目標(biāo)接口和FIFO型目標(biāo)接口。

            3.1寄存器型目標(biāo)接口

            每個(gè)PCI功能擁有64個(gè)配置雙字的單元[1](前16個(gè)雙字的格式和用法由PCI規(guī)范預(yù)定),保留用于實(shí)現(xiàn)配置寄存器。本地可以有一些功能設(shè)備,這些設(shè)備都有相應(yīng)的控制/狀態(tài)寄存器,PCI總線上的主設(shè)備要對這些控制寄存器進(jìn)行編程,進(jìn)而控制相應(yīng)的功能設(shè)備完成特定功能。兩類寄存器可以歸為一個(gè)數(shù)據(jù)通道實(shí)現(xiàn),寄存器型目標(biāo)接口就為本地的功能設(shè)備提供了這樣一種接口,使得PCI總線上的主設(shè)備可以通過它來訪問功能設(shè)備的寄存器。由于PCI總線主設(shè)備的訪問目標(biāo)是一些寄存器,所以該接口無需支持突發(fā)傳輸,主設(shè)備每一次訪問最多只涉及到32位的數(shù)據(jù)傳輸。

            3.2FIFO型目標(biāo)接口

            FIFO型的目標(biāo)通道主要用于大量的數(shù)據(jù)傳輸,可以將本地的存儲(chǔ)器掛接在該接口上,這樣PCI總線主設(shè)備可以通過FIFO型目標(biāo)通道訪問到本地的存儲(chǔ)器,針對PCI主設(shè)備對本地存儲(chǔ)器的讀和寫操作,設(shè)置了兩個(gè)異步FIFO,讀FIFO和寫FIFO。其結(jié)構(gòu)如圖3

            命令解碼器和目標(biāo)狀態(tài)機(jī)組成了該接口的控制單元。FIFO型目標(biāo)接口由地址解碼器、讀寫控制單元和讀/寫異步FIFO四部分組成,在控制部件的協(xié)調(diào)控制下,共同完成PCI總線上的其它主設(shè)備對本地存儲(chǔ)器的數(shù)據(jù)存儲(chǔ)或讀取。

            讀寫控制單元:主要用于目標(biāo)延遲讀的控制,存儲(chǔ)并比照前后數(shù)據(jù)傳輸請求的地址和命令信息,聲明本次傳輸請求是否為有效的延遲讀請求。

            讀/寫FIFO:異步FIFO,用于緩存PCI主設(shè)備到本地存儲(chǔ)器的讀寫數(shù)據(jù)。

            地址解碼器:解碼PCI總線上的地址信息,識(shí)別對FIFO型目標(biāo)接口的訪問。對于地址解碼器的實(shí)現(xiàn),在最初PCI系統(tǒng)分配地址時(shí),F(xiàn)IFO型的目標(biāo)接口被分配到某一段地址區(qū)內(nèi),通過地址翻譯將其映射到本地的系統(tǒng)中[4]。


          圖3FIFO型目標(biāo)接口邏輯結(jié)構(gòu)

            對PCI主設(shè)備發(fā)起的寫操作,數(shù)據(jù)會(huì)先以PCI時(shí)鐘寫入接口內(nèi)的寫FIFO,同時(shí)PCI控制器會(huì)通知本地存儲(chǔ)器控制器有數(shù)據(jù)寫入。本地存儲(chǔ)器控制器待FIFO中達(dá)到一定數(shù)據(jù)量時(shí)以自己的時(shí)鐘讀取FIFO中的數(shù)據(jù)存入本地存儲(chǔ)器,如果FIFO讀空,存儲(chǔ)器會(huì)暫停等待直到FIFO中有新的數(shù)據(jù)寫入,才進(jìn)行讀取。

            對PCI主設(shè)備發(fā)起的讀本地存儲(chǔ)器的操作,為了提高讀數(shù)據(jù)的效率,設(shè)計(jì)中根據(jù)不同數(shù)據(jù)傳輸?shù)奶攸c(diǎn),把讀操作劃分為兩個(gè)類型,即立即讀和延遲讀。

           ?。?)立即讀:在PCI總線主設(shè)備發(fā)起讀操作后,一直占用PCI總線等待,PCI總線控制器向本地存儲(chǔ)器請求對應(yīng)的數(shù)據(jù),直到本地存儲(chǔ)器將數(shù)據(jù)寫入讀FIFO中,PCI控制器讀取FIFO中數(shù)據(jù)開始PCI總線上的數(shù)據(jù)傳輸。這種讀類型一般適用于進(jìn)行數(shù)據(jù)量小的傳輸且本地存儲(chǔ)器可以在較短的時(shí)間內(nèi)將要求的數(shù)據(jù)送到PCI總線。

            (2)延遲讀:PCI總線主設(shè)備的讀請求到達(dá)PCI目標(biāo)總線控制器時(shí),控制器鎖存地址和命令信息,并回應(yīng)主設(shè)備讓它重試。同時(shí)PCI目標(biāo)總線控制器向本地存儲(chǔ)器請求數(shù)據(jù),本地存儲(chǔ)器將數(shù)據(jù)寫入總線控制器中的FIFO中。此時(shí)如果PCI總線上的主設(shè)備重試先前的數(shù)據(jù)傳輸請求,PCI就可以響應(yīng)請求將數(shù)據(jù)發(fā)送到PCI總線上。這個(gè)過程中,PCI總線主設(shè)備在收到重試回應(yīng)后就會(huì)釋放PCI總線,允許其它的主設(shè)備占用總線進(jìn)行數(shù)據(jù)傳輸,這樣從而提高了總線的利用率。圖4給出了PCI主設(shè)備突發(fā)讀時(shí)采用延遲讀的仿真結(jié)果圖


          圖4突發(fā)讀時(shí)仿真波形

          4結(jié)束語

            本文基于PCI2.2總線規(guī)范完成了通用PCI的RTL級(jí)設(shè)計(jì)。經(jīng)驗(yàn)證設(shè)計(jì)完全實(shí)現(xiàn)了目標(biāo)控制器的功能,目前已通過了FPGA原型驗(yàn)證并應(yīng)用到CMOS圖象傳感器的數(shù)據(jù)傳輸中。在后續(xù)的開發(fā)中,可以考慮在控制器內(nèi)部加入電源管理模塊,進(jìn)一步降低PCI目標(biāo)控制器的功耗。

            本文的創(chuàng)新點(diǎn):該設(shè)計(jì)方案將目標(biāo)控制器整體分為控制邏輯和數(shù)據(jù)通道兩部分,并根據(jù)目標(biāo)設(shè)備的不同類型,在數(shù)據(jù)通道內(nèi)實(shí)現(xiàn)不同的目標(biāo)接口,并引入了立即讀和延遲讀機(jī)制實(shí)現(xiàn)數(shù)據(jù)傳輸,使整個(gè)設(shè)計(jì)取得了較高的效率。

          參考文獻(xiàn)

            [1]TomShanley,DonAnderson著.林輝等譯.PCI系統(tǒng)結(jié)構(gòu).電子工業(yè)出版社,2000.

            [2]沈涵飛,甘萌.PCI總線目標(biāo)控制器的設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)工程與設(shè)計(jì).2004,25(11):2101~2104

            [3]施少敏,馬彥恒.基于接口芯片PCI9030的PCI總線接口卡的設(shè)計(jì)[J].微計(jì)算機(jī)信息.2006,11-2:295~297

            [4]TinooshMohsenin.DesignandEvaluationofFPGA-BasedGigabit-Ethernet/PCINetwordInterfaceCard.MasterDegreeDissertationofRice

          University.2004:71~74

            [5]JanickBergeron,WritingTestbenches-FunctionalVerificationofHDLModels.Boston,KluwerAcademicPublisher,2000.


          上一頁 1 2 下一頁

          評論


          相關(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); })();