《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 可編程邏輯 > 業(yè)界動(dòng)態(tài) > 嵌入式系統(tǒng)中PCI總線仲裁器的設(shè)計(jì)與實(shí)現(xiàn)

嵌入式系統(tǒng)中PCI總線仲裁器的設(shè)計(jì)與實(shí)現(xiàn)

2008-04-25
作者:李德升,,羅玉平

  摘 要: 描述了PCI總線仲裁" title="總線仲裁">總線仲裁的原理和仲裁算法,闡述了用可編程器件實(shí)現(xiàn)總線仲裁的具體方法,,并實(shí)現(xiàn)了一個(gè)雙主設(shè)備仲裁器,。
  關(guān)鍵詞: PCI總線 仲裁 CPLD VHDL 嵌入式系統(tǒng)" title="嵌入式系統(tǒng)">嵌入式系統(tǒng)


  PCI(Peripheral Component Interconnect)總線是現(xiàn)今最為流行的工業(yè)控制總線之一,。它廣泛地應(yīng)用在計(jì)算機(jī)中,并且由于眾多廠商對(duì)PCI的良好支持,,使得目前嵌入式設(shè)備中的很多解決方案都包含了PCI總線。在多主設(shè)備的PCI系統(tǒng)應(yīng)用中,,必須為各個(gè)主設(shè)備提供仲裁授權(quán)信號(hào),。很多廠家有針對(duì)性地發(fā)布了PCI仲裁邏輯的專用芯片" title="專用芯片">專用芯片或者集成了PCI仲裁邏輯的專用芯片,,但使用不夠靈活,。為了使PCI設(shè)備能夠更方便地應(yīng)用在嵌入式系統(tǒng)中,本文介紹了一種基于CPLD(復(fù)雜可編程邏輯器件)的PCI總線仲裁器的設(shè)計(jì)方法,。此方法可以為系統(tǒng)量身定制適合于系統(tǒng)本身的PCI總線仲裁器,,而不必局限于特定芯片的要求,在體積,、功能,、成本等諸多方面都有很好的應(yīng)用前景。
1 PCI總線仲裁簡(jiǎn)介
1.1 PCI總線的仲裁原理

  PCI總線是一種共享式的總線,,可以連接多個(gè)主設(shè)備,,但由于數(shù)據(jù)傳輸?shù)莫?dú)占性,每一時(shí)刻只能由一個(gè)主設(shè)備占用總線,。因此,,為了有效地利用PCI總線帶寬,必須設(shè)置一個(gè)總線仲裁器,,按照一定的算法協(xié)調(diào)系統(tǒng)中各個(gè)主設(shè)備的操作,。
  每個(gè)具備主設(shè)備功能的PCI設(shè)備必須提供兩個(gè)與仲裁有關(guān)的信號(hào):REQ#和GNT#。其中REQ#為請(qǐng)求總線信號(hào),,由需要發(fā)起PCI傳輸事務(wù)的設(shè)備發(fā)出,;GNT#為總線授權(quán)信號(hào),由PCI總線仲裁器裁決后給出,。接到GNT#信號(hào)的PCI設(shè)備將在下一次總線空閑后開(kāi)始操作,。
  PCI總線仲裁的裁決過(guò)程可以在PCI傳輸期間完成,并不占用PCI總線的帶寬,,這稱為隱式仲裁,。即需要發(fā)起PCI操作的設(shè)備可以隨時(shí)發(fā)出請(qǐng)求REQ#,PCI仲裁器立即批準(zhǔn)該請(qǐng)求并給出GNT#,。但是真正的傳輸操作一定要等到當(dāng)前傳輸完成,,即總線空閑后才可以開(kāi)始。圖1描述了PCI總線設(shè)備與仲裁器的關(guān)系。


1.2 PCI總線仲裁規(guī)則約定
  (1)仲裁器的仲裁算法必須保證所有的設(shè)備都能得到授權(quán)的機(jī)會(huì),,否則將會(huì)出現(xiàn)某個(gè)優(yōu)先級(jí)低的設(shè)備永遠(yuǎn)不能占有總線進(jìn)行事務(wù)操作的情況,。
  (2)如果FRAME無(wú)效,GNT可以在任意時(shí)間撤消,,以便服務(wù)于另一個(gè)主設(shè)備或者作為對(duì)主設(shè)備撤銷REQ的響應(yīng),。
  (3)如果GNT信號(hào)被撤消但FRAME有信號(hào),,當(dāng)前的總線正在傳輸數(shù)據(jù),,則操作合法。
  (4)如果總線不處于空閑狀態(tài),,則允許一個(gè)GNT的撤消和另一個(gè)GNT的發(fā)生在同一個(gè)周期,。如果處在空閑狀態(tài),則要求一個(gè)GNT撤消到下一個(gè)GNT的發(fā)出之間必須有一個(gè)時(shí)鐘周期" title="時(shí)鐘周期">時(shí)鐘周期間隔,,否則可能會(huì)在AD線和PAR線上出現(xiàn)沖突。
  (5)GNT信號(hào)的每次發(fā)出,,只限于相應(yīng)的總線主控器可以使用總線進(jìn)行一次總線操作(一個(gè)FRAME發(fā)出到撤銷)。如果該主控器需要多次總線訪問(wèn),,它可以保持REQ信號(hào)一直有效,。仲裁器會(huì)按照特定的仲裁算法來(lái)決定是否仍判給該主設(shè)備,。
  (6)一個(gè)主控器可以在任意時(shí)刻撤消其REQ信號(hào)。REQ信號(hào)一旦撤消,,仲裁器將認(rèn)為該設(shè)備不再請(qǐng)求使用總線,,因而撤消其GNT信號(hào)(參考上文(1))。如果一個(gè)主控器只希望做一次總線傳輸,,則它應(yīng)當(dāng)在發(fā)出FRAME的同一時(shí)鐘周期撤消REQ,。
  (7)如果當(dāng)前的主控器在它的GNT信號(hào)發(fā)出后,持續(xù)16個(gè)空閑周期還沒(méi)有開(kāi)始總線操作,,則仲裁器視其為超時(shí),,仲裁器可以在任意時(shí)刻撤消GNT信號(hào),以便服務(wù)于另一個(gè)設(shè)備,。
1.3 PCI總線仲裁的算法
  目前,,應(yīng)用于PCI總線總裁的算法主要有固定優(yōu)先級(jí)算法和動(dòng)態(tài)優(yōu)先級(jí)算法兩種。在固定優(yōu)先級(jí)算法中,,各個(gè)設(shè)備的優(yōu)先級(jí)是事先確定好的,,仲裁器針對(duì)事先設(shè)定好的優(yōu)先級(jí)為每個(gè)設(shè)備分配使用權(quán)。這種算法的缺點(diǎn)是:一旦PCI總線事務(wù)非常繁忙,優(yōu)先級(jí)高的設(shè)備會(huì)占有總線不放,,將導(dǎo)致優(yōu)先級(jí)低的設(shè)備無(wú)法申請(qǐng)到總線,。可見(jiàn)這是一種并不公平的算法,,只適用于總線利用率非常低的情況,。動(dòng)態(tài)優(yōu)先級(jí)算法是在每次仲裁授權(quán)后動(dòng)態(tài)改變各個(gè)設(shè)備的優(yōu)先級(jí)。在保證每個(gè)設(shè)備都有機(jī)會(huì)獲得總線的情況下,,優(yōu)先級(jí)改變的算法可以是各種各樣的,。最常用的是循環(huán)優(yōu)先級(jí)算法,即每次仲裁授權(quán)后將排隊(duì)中的設(shè)備優(yōu)先級(jí)加1,。因其算法簡(jiǎn)單,,且對(duì)大部分應(yīng)用都十分有效,本設(shè)計(jì)采用循環(huán)優(yōu)先級(jí)算法,。
1.4 總線???/STRONG>
  當(dāng)PCI總線空閑時(shí),一個(gè)設(shè)備從申請(qǐng)總線到被授權(quán)使用,,最少也需要2個(gè)時(shí)鐘周期,,這對(duì)于PCI總線是一種浪費(fèi)。因此仲裁器通常選中一個(gè)最經(jīng)常占用總線的設(shè)備,,在PCI總線空閑時(shí)將GNT#賦予它,,這叫做總線停靠,。當(dāng)總線空閑時(shí),,該設(shè)備需要占用總線時(shí)可馬上得到批準(zhǔn)。
2 雙主設(shè)備PCI總線仲裁器的實(shí)現(xiàn)
  下面描述了一個(gè)具有兩個(gè)設(shè)備的總線仲裁器的硬件實(shí)現(xiàn),,其一為TriMedia嵌入式DSPCPU PNX1300,,其二為Intel i82559 網(wǎng)絡(luò)控制器" title="網(wǎng)絡(luò)控制器">網(wǎng)絡(luò)控制器。系統(tǒng)結(jié)構(gòu)如圖2所示,。

?


  該仲裁器的接口信號(hào)如表1所示,。
  為設(shè)計(jì)方便起見(jiàn),在程序中設(shè)計(jì)三類狀態(tài)機(jī):總線狀態(tài)狀態(tài)機(jī),、總線主設(shè)備查詢狀態(tài)機(jī),、仲裁狀態(tài)機(jī)。
2.1 總線狀態(tài)狀態(tài)機(jī)
  總線狀態(tài)狀態(tài)機(jī)用于記錄總線事務(wù)的狀態(tài),,定義如下:
  type bus_state is(IDLE,,BUSY,LAST_DATA,,F(xiàn)INISH)
  四種狀態(tài)分別表示總線空閑,、忙、最后一個(gè)數(shù)據(jù)傳輸期以及傳輸完成。狀態(tài)圖如圖3,。


  下面是以VHDL代碼形式實(shí)現(xiàn)的該狀態(tài)機(jī)的狀態(tài)轉(zhuǎn)換關(guān)系,。
case bus_cur_state is
  when IDLE =>
    if Frame_n=′0′ then --frame被拉低,表示一個(gè)傳輸事務(wù)開(kāi)始
      bus_next_state<=BUSY,;
    else
      bus_next_state<=IDLE,;--總線空閑
    end if;
  when BUSY=>
    if Frame_n=′1′ then --frame為高,,等待傳輸最后一個(gè)數(shù)據(jù)
      if Irdy_n=′0′ then --主設(shè)備準(zhǔn)備好,,正在傳輸最后一個(gè)數(shù)據(jù)
        bus_next_state<=FINISH;
      else
        bus_next_state<=LAST_DATA,;--等待最后一個(gè)數(shù)據(jù)完成
      end if,;
    else
      bus_next_state<=BUSY;--等待frame被拉高
    end if,;
  when LAST_DATA=>
    if Irdy_n=′0′ then--主設(shè)備準(zhǔn)備好
      bus_next_state<=FINISH;
    else
      bus_next_state<=LAST_DATA,;--等待最后一個(gè)數(shù)據(jù)傳輸完成
    end if,;
  when FINISH=>
    if Irdy_n=′1′ then
      bus_next_state<=IDLE;
    else
      bus_next_state<=FINISH,;
    end if,;
  when others=>
    bus_next_state<=IDLE;
end case,;
  根據(jù)上述狀態(tài)關(guān)系輸出總線空閑指示信號(hào)busbusy,。
case bus_cur_state is
  when IDLE=>
    busbusy<=′0′;
  when BUSY=>
    busbusy<=′1′,;
  when LAST_DATA=>
    busbusy<=′1′,;
  when FINISH=>
    busbusy<=′1′;
  when others=>
    busbusy<=′0′,;
end case,;
2.2 總線主設(shè)備查詢狀態(tài)機(jī)
  總線主設(shè)備查詢狀態(tài)機(jī)用來(lái)決定當(dāng)前是否需要重新指定一個(gè)主設(shè)備。重新指定一個(gè)主設(shè)備的條件是:(1)當(dāng)前被授權(quán)的設(shè)備已開(kāi)始傳輸,;(2)當(dāng)前被授權(quán)的設(shè)備沒(méi)有開(kāi)始傳輸并且超時(shí),。將主設(shè)備查詢狀態(tài)分為IDLE、GNT1,、GNT2,、WAIT_NOBUSY和WAIT_BUSY2五個(gè)狀態(tài),并設(shè)置計(jì)數(shù)器count,。當(dāng)總線上某個(gè)設(shè)備被授權(quán),,但16個(gè)周期仍然沒(méi)有開(kāi)始操作,count超過(guò)16,被視為超時(shí),,仲裁器可以撤銷其仲裁授權(quán),,并轉(zhuǎn)授其他設(shè)備。程序根據(jù)這個(gè)狀態(tài)機(jī)的輸出結(jié)果決定仲裁狀態(tài)機(jī)是否改變,。


  狀態(tài)轉(zhuǎn)換如圖4所示,,狀態(tài)機(jī)描述的VHDL代碼略。
  主設(shè)備查詢狀態(tài)機(jī)的輸出信號(hào)search_master:
case search_cur_state is
  when NO_GNT =>
    search_master <= ′1′;
  when GNT1 =>
    search_master <= ′0′;
  when GNT2 =>
    search_master <= ′1′;
  when WAIT_NOBUSY =>
    search_master <= ′0′;
  when WAIT_BUSY2 =>
    search_master <= ′0′;
  when others =>
    search_master <= ′0′;
end case;
  該狀態(tài)機(jī)的驅(qū)動(dòng)條件是由總線狀態(tài)狀態(tài)機(jī)的輸出結(jié)果(busbusy),、仲裁狀態(tài)機(jī)的狀態(tài)(idle,,park)和計(jì)數(shù)器產(chǎn)生的超時(shí)信號(hào)(timeout)組成。設(shè)置WAIT_BUSY2的目的是為了避免可能會(huì)在AD線和PAR線上出現(xiàn)的沖突,。該狀態(tài)機(jī)的輸出search_master作為仲裁狀態(tài)機(jī)狀態(tài)轉(zhuǎn)換使能信號(hào),,只有該信號(hào)有效時(shí),仲裁狀態(tài)機(jī)才進(jìn)行當(dāng)前狀態(tài)的改變,。
2.3 仲裁狀態(tài)機(jī)
  仲裁狀態(tài)機(jī)表示總線仲裁器的狀態(tài),,定義如下:
  type arbiter_state is(IDLE,DEV1,,DEV2,,PARK);
  當(dāng)主設(shè)備查詢狀態(tài)機(jī)輸出使能信號(hào)(search_master)時(shí),,導(dǎo)致仲裁狀態(tài)機(jī)的狀態(tài)改變,。
  if(PCI_reset=′0′) then
    arbiter_cur_state<=park;--總線在復(fù)位期間???BR>  elsif rising_edge(PCI_clock) then
    if(search_master=′1′) then
    arbiter_cur_state<=arbiter_next_state,;
    end if,;
  end if,;
  狀態(tài)轉(zhuǎn)變過(guò)程如圖5所示,,狀態(tài)機(jī)描述的VHDL代碼略。


  仲裁器根據(jù)仲裁狀態(tài)機(jī)當(dāng)前狀態(tài)控制仲裁授權(quán)信號(hào)(GNT)的給出,。
  when idle=>
    gnt_out_n<=(others=>′1′),;
  when dev1=>
    gnt_out_n<=″10″;
  when dev2=>
    gnt_out_n<=″01″,;
  when park=>
    gnt_out_n<=(PARKMASTER),;
  when others=>
    gnt_out_n<=(others =>′1′),;
  end case;
  注:PARKMASTER是事先設(shè)置的??繝顟B(tài),。
2.4 仿真波形圖
  由圖6可以看出,測(cè)試文件模擬了一個(gè)設(shè)備申請(qǐng)和兩個(gè)設(shè)備同時(shí)申請(qǐng)的情況,,并給出了總線授權(quán)信號(hào)(GNT),,驗(yàn)證了仲裁器邏輯的正確性。


2.5 資源占用情況分析
  可編程邏輯器件使用Lattice 公司的ispLSI2064E-135LT100,,在ispLever中綜合本例程序,,結(jié)果如表2。


  綜合后的延遲分析顯示,,該邏輯的時(shí)鐘周期最小為7.5ns,,即該邏輯可以運(yùn)行在133MHz以下的系統(tǒng)中,完全可以勝任33MHz PCI總線的仲裁工作,。
  本PCI總線仲裁器已成功地應(yīng)用在基于PNX1300的IP會(huì)議電視終端系統(tǒng)中,,用于處理嵌入式CPU PNX1300和網(wǎng)絡(luò)控制器I82559的總線占用仲裁。該會(huì)議電視終端已于2005年1月在國(guó)家泰爾實(shí)驗(yàn)室通過(guò)測(cè)試并取得入網(wǎng)許可證,。
參考文獻(xiàn)
1 李貴山,,威德虎.PCI局部總線開(kāi)發(fā)者指南.西安:西安電子科技大學(xué)出版社,1997
2 曾繁泰,,馮保初.PCI總線與多媒體計(jì)算機(jī).北京:電子工業(yè)出版社,1998
3 姜立東.VHDL語(yǔ)言程序設(shè)計(jì)及應(yīng)用.北京:北京郵電大學(xué)出版社,,2001

本站內(nèi)容除特別聲明的原創(chuàng)文章之外,,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點(diǎn),。轉(zhuǎn)載的所有的文章,、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有,。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無(wú)法一一聯(lián)系確認(rèn)版權(quán)者,。如涉及作品內(nèi)容、版權(quán)和其它問(wèn)題,,請(qǐng)及時(shí)通過(guò)電子郵件或電話通知我們,,以便迅速采取適當(dāng)措施,避免給雙方造成不必要的經(jīng)濟(jì)損失,。聯(lián)系電話:010-82306118,;郵箱:[email protected]