摘 要: 描述了PCI總線仲裁" title="總線仲裁">總線仲裁的原理和仲裁算法,闡述了用可編程器件實現(xiàn)總線仲裁的具體方法,并實現(xiàn)了一個雙主設備仲裁器。
關鍵詞: PCI總線 仲裁 CPLD VHDL 嵌入式系統(tǒng)" title="嵌入式系統(tǒng)">嵌入式系統(tǒng)
PCI(Peripheral Component Interconnect)總線是現(xiàn)今最為流行的工業(yè)控制總線之一。它廣泛地應用在計算機中,并且由于眾多廠商對PCI的良好支持,使得目前嵌入式設備中的很多解決方案都包含了PCI總線。在多主設備的PCI系統(tǒng)應用中,必須為各個主設備提供仲裁授權信號。很多廠家有針對性地發(fā)布了PCI仲裁邏輯的專用芯片" title="專用芯片">專用芯片或者集成了PCI仲裁邏輯的專用芯片,但使用不夠靈活。為了使PCI設備能夠更方便地應用在嵌入式系統(tǒng)中,本文介紹了一種基于CPLD(復雜可編程邏輯器件)的PCI總線仲裁器的設計方法。此方法可以為系統(tǒng)量身定制適合于系統(tǒng)本身的PCI總線仲裁器,而不必局限于特定芯片的要求,在體積、功能、成本等諸多方面都有很好的應用前景。
1 PCI總線仲裁簡介
1.1 PCI總線的仲裁原理
PCI總線是一種共享式的總線,可以連接多個主設備,但由于數(shù)據(jù)傳輸?shù)莫氄夹?,每一時刻只能由一個主設備占用總線。因此,為了有效地利用PCI總線帶寬,必須設置一個總線仲裁器,按照一定的算法協(xié)調(diào)系統(tǒng)中各個主設備的操作。
每個具備主設備功能的PCI設備必須提供兩個與仲裁有關的信號:REQ#和GNT#。其中REQ#為請求總線信號,由需要發(fā)起PCI傳輸事務的設備發(fā)出;GNT#為總線授權信號,由PCI總線仲裁器裁決后給出。接到GNT#信號的PCI設備將在下一次總線空閑后開始操作。
PCI總線仲裁的裁決過程可以在PCI傳輸期間完成,并不占用PCI總線的帶寬,這稱為隱式仲裁。即需要發(fā)起PCI操作的設備可以隨時發(fā)出請求REQ#,PCI仲裁器立即批準該請求并給出GNT#。但是真正的傳輸操作一定要等到當前傳輸完成,即總線空閑后才可以開始。圖1描述了PCI總線設備與仲裁器的關系。
1.2 PCI總線仲裁規(guī)則約定
(1)仲裁器的仲裁算法必須保證所有的設備都能得到授權的機會,否則將會出現(xiàn)某個優(yōu)先級低的設備永遠不能占有總線進行事務操作的情況。
(2)如果FRAME無效,GNT可以在任意時間撤消,以便服務于另一個主設備或者作為對主設備撤銷REQ的響應。
(3)如果GNT信號被撤消但FRAME有信號,當前的總線正在傳輸數(shù)據(jù),則操作合法。
(4)如果總線不處于空閑狀態(tài),則允許一個GNT的撤消和另一個GNT的發(fā)生在同一個周期。如果處在空閑狀態(tài),則要求一個GNT撤消到下一個GNT的發(fā)出之間必須有一個時鐘周期" title="時鐘周期">時鐘周期間隔,否則可能會在AD線和PAR線上出現(xiàn)沖突。
(5)GNT信號的每次發(fā)出,只限于相應的總線主控器可以使用總線進行一次總線操作(一個FRAME發(fā)出到撤銷)。如果該主控器需要多次總線訪問,它可以保持REQ信號一直有效。仲裁器會按照特定的仲裁算法來決定是否仍判給該主設備。
(6)一個主控器可以在任意時刻撤消其REQ信號。REQ信號一旦撤消,仲裁器將認為該設備不再請求使用總線,因而撤消其GNT信號(參考上文(1))。如果一個主控器只希望做一次總線傳輸,則它應當在發(fā)出FRAME的同一時鐘周期撤消REQ。
(7)如果當前的主控器在它的GNT信號發(fā)出后,持續(xù)16個空閑周期還沒有開始總線操作,則仲裁器視其為超時,仲裁器可以在任意時刻撤消GNT信號,以便服務于另一個設備。
1.3 PCI總線仲裁的算法
目前,應用于PCI總線總裁的算法主要有固定優(yōu)先級算法和動態(tài)優(yōu)先級算法兩種。在固定優(yōu)先級算法中,各個設備的優(yōu)先級是事先確定好的,仲裁器針對事先設定好的優(yōu)先級為每個設備分配使用權。這種算法的缺點是:一旦PCI總線事務非常繁忙,優(yōu)先級高的設備會占有總線不放,將導致優(yōu)先級低的設備無法申請到總線。可見這是一種并不公平的算法,只適用于總線利用率非常低的情況。動態(tài)優(yōu)先級算法是在每次仲裁授權后動態(tài)改變各個設備的優(yōu)先級。在保證每個設備都有機會獲得總線的情況下,優(yōu)先級改變的算法可以是各種各樣的。最常用的是循環(huán)優(yōu)先級算法,即每次仲裁授權后將排隊中的設備優(yōu)先級加1。因其算法簡單,且對大部分應用都十分有效,本設計采用循環(huán)優(yōu)先級算法。
1.4 總線???/STRONG>
當PCI總線空閑時,一個設備從申請總線到被授權使用,最少也需要2個時鐘周期,這對于PCI總線是一種浪費。因此仲裁器通常選中一個最經(jīng)常占用總線的設備,在PCI總線空閑時將GNT#賦予它,這叫做總線???。當總線空閑時,該設備需要占用總線時可馬上得到批準。
2 雙主設備PCI總線仲裁器的實現(xiàn)
下面描述了一個具有兩個設備的總線仲裁器的硬件實現(xiàn),其一為TriMedia嵌入式DSPCPU PNX1300,其二為Intel i82559 網(wǎng)絡控制器" title="網(wǎng)絡控制器">網(wǎng)絡控制器。系統(tǒng)結構如圖2所示。
?
該仲裁器的接口信號如表1所示。
為設計方便起見,在程序中設計三類狀態(tài)機:總線狀態(tài)狀態(tài)機、總線主設備查詢狀態(tài)機、仲裁狀態(tài)機。
2.1 總線狀態(tài)狀態(tài)機
總線狀態(tài)狀態(tài)機用于記錄總線事務的狀態(tài),定義如下:
type bus_state is(IDLE,BUSY,LAST_DATA,F(xiàn)INISH)
四種狀態(tài)分別表示總線空閑、忙、最后一個數(shù)據(jù)傳輸期以及傳輸完成。狀態(tài)圖如圖3。
下面是以VHDL代碼形式實現(xiàn)的該狀態(tài)機的狀態(tài)轉(zhuǎn)換關系。
case bus_cur_state is
when IDLE =>
if Frame_n=′0′ then --frame被拉低,表示一個傳輸事務開始
bus_next_state<=BUSY;
else
bus_next_state<=IDLE;--總線空閑
end if;
when BUSY=>
if Frame_n=′1′ then --frame為高,等待傳輸最后一個數(shù)據(jù)
if Irdy_n=′0′ then --主設備準備好,正在傳輸最后一個數(shù)據(jù)
bus_next_state<=FINISH;
else
bus_next_state<=LAST_DATA;--等待最后一個數(shù)據(jù)完成
end if;
else
bus_next_state<=BUSY;--等待frame被拉高
end if;
when LAST_DATA=>
if Irdy_n=′0′ then--主設備準備好
bus_next_state<=FINISH;
else
bus_next_state<=LAST_DATA;--等待最后一個數(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)關系輸出總線空閑指示信號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 總線主設備查詢狀態(tài)機
總線主設備查詢狀態(tài)機用來決定當前是否需要重新指定一個主設備。重新指定一個主設備的條件是:(1)當前被授權的設備已開始傳輸;(2)當前被授權的設備沒有開始傳輸并且超時。將主設備查詢狀態(tài)分為IDLE、GNT1、GNT2、WAIT_NOBUSY和WAIT_BUSY2五個狀態(tài),并設置計數(shù)器count。當總線上某個設備被授權,但16個周期仍然沒有開始操作,count超過16,被視為超時,仲裁器可以撤銷其仲裁授權,并轉(zhuǎn)授其他設備。程序根據(jù)這個狀態(tài)機的輸出結果決定仲裁狀態(tài)機是否改變。
狀態(tài)轉(zhuǎn)換如圖4所示,狀態(tài)機描述的VHDL代碼略。
主設備查詢狀態(tài)機的輸出信號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)機的驅(qū)動條件是由總線狀態(tài)狀態(tài)機的輸出結果(busbusy)、仲裁狀態(tài)機的狀態(tài)(idle,park)和計數(shù)器產(chǎn)生的超時信號(timeout)組成。設置WAIT_BUSY2的目的是為了避免可能會在AD線和PAR線上出現(xiàn)的沖突。該狀態(tài)機的輸出search_master作為仲裁狀態(tài)機狀態(tài)轉(zhuǎn)換使能信號,只有該信號有效時,仲裁狀態(tài)機才進行當前狀態(tài)的改變。
2.3 仲裁狀態(tài)機
仲裁狀態(tài)機表示總線仲裁器的狀態(tài),定義如下:
type arbiter_state is(IDLE,DEV1,DEV2,PARK);
當主設備查詢狀態(tài)機輸出使能信號(search_master)時,導致仲裁狀態(tài)機的狀態(tài)改變。
if(PCI_reset=′0′) then
arbiter_cur_state<=park;--總線在復位期間停靠
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)變過程如圖5所示,狀態(tài)機描述的VHDL代碼略。
仲裁器根據(jù)仲裁狀態(tài)機當前狀態(tài)控制仲裁授權信號(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是事先設置的??繝顟B(tài)。
2.4 仿真波形圖
由圖6可以看出,測試文件模擬了一個設備申請和兩個設備同時申請的情況,并給出了總線授權信號(GNT),驗證了仲裁器邏輯的正確性。
2.5 資源占用情況分析
可編程邏輯器件使用Lattice 公司的ispLSI2064E-135LT100,在ispLever中綜合本例程序,結果如表2。
綜合后的延遲分析顯示,該邏輯的時鐘周期最小為7.5ns,即該邏輯可以運行在133MHz以下的系統(tǒng)中,完全可以勝任33MHz PCI總線的仲裁工作。
本PCI總線仲裁器已成功地應用在基于PNX1300的IP會議電視終端系統(tǒng)中,用于處理嵌入式CPU PNX1300和網(wǎng)絡控制器I82559的總線占用仲裁。該會議電視終端已于2005年1月在國家泰爾實驗室通過測試并取得入網(wǎng)許可證。
參考文獻
1 李貴山,威德虎.PCI局部總線開發(fā)者指南.西安:西安電子科技大學出版社,1997
2 曾繁泰,馮保初.PCI總線與多媒體計算機.北京:電子工業(yè)出版社,1998
3 姜立東.VHDL語言程序設計及應用.北京:北京郵電大學出版社,2001