一種PCI總線仲裁器的設(shè)計與實現(xiàn)
摘要:以自行研制開發(fā)的PCI高速總線背板為背景,系統(tǒng)地論述了PCI總線的仲裁機制、總線的缺省占用、仲裁信號協(xié)定及優(yōu)先級仲裁算法,給出了采用EPLD實現(xiàn)仲裁器功能的編程設(shè)計。
隨著VLSI/ULSI技術(shù)的發(fā)展,可編程邏輯器件EPLD/FPGA越來越受到人們的青睞,由于它具有集成度高、速度快、開發(fā)周期短、費用低、用戶可定義功能及可重復(fù)編程和擦寫等許多優(yōu)點,其應(yīng)用領(lǐng)域不斷擴大。這些器件的靈活性和通用性使得它們已成為研制和開發(fā)復(fù)雜數(shù)字系統(tǒng)的理想選擇。
在PCI總線技術(shù)規(guī)范的基礎(chǔ)上,采用EPLD實現(xiàn)了高速PCI總線背板中多主控設(shè)備的總線仲裁。
1 PCI總線的仲裁機制
PCI總線仲裁是基于訪問而不是基于時間片,也就是說,對于一個PCI總線主設(shè)備,必須為它在總線上進行的每次訪問提出仲裁要求。PCI總線上采用的是并行仲裁(也叫獨立請求仲裁)方案,其仲裁機制如圖1所示。在這種仲裁中,每個主控器各有自己獨立的總線請求線_REQ 和總線允許線_GNT 與總線仲裁器相連,相互間沒有任何控制關(guān)系。PCI總線的仲裁是“隱含的”,就是說一次仲裁可以在前一次總線訪問期間完成,這樣就使得仲裁的具體實現(xiàn)不必占用PCI總線周期。當然在總線空閑時除外。
當PCI總線進行操作時,發(fā)起者(Master)先置REQ#,當?shù)玫街俨闷鳎ˋrbiter)的許可時(GNT#),會將FRAME#置低,并在AD總線上放置Slave地址,同時C/BE#放置命令信號,說明接下來的傳輸類型。所有PCI總線上設(shè)備都需對此地址譯碼,被選中的設(shè)備要置DEVSEL#以聲明自己被選中。然后當IRDY#與TRDY#都置低時,可以傳輸數(shù)據(jù)。當MaSTer數(shù)據(jù)傳輸結(jié)束前,將FRAME#置高以標明只剩最后一組數(shù)據(jù)要傳輸,并在傳完數(shù)據(jù)后放開IRDY#以釋放總線控制權(quán)。
在實際的PCI總線仲裁電路中,與仲裁直接有關(guān)的控制線除_REQ和_GNT外,還有_FRAME、_IRDY。此外,為了保證總線交換的同步,還應(yīng)有一根總線時鐘信號PCIclk和一根總線復(fù)位信號_PCIrst,如圖1虛線所示。
2 總線的缺省占用
總線(Bus)是計算機各種功能部件之間傳送信息的公共通信干線,它是由導(dǎo)線組成的傳輸線束, 按照計算機所傳輸?shù)男畔⒎N類,計算機的總線可以劃分為數(shù)據(jù)總線、地址總線和控制總線,分別用來傳輸數(shù)據(jù)、數(shù)據(jù)地址和控制信號。
當總線空閑(其他器件都以高阻態(tài)形式連接在總線上)且一個器件要與目的器件通信時,發(fā)起通信的器件驅(qū)動總線,發(fā)出地址和數(shù)據(jù)。其他以高阻態(tài)形式連接在總線上的器件如果收到(或能夠收到)與自己相符的地址信息后,即接收總線上的數(shù)據(jù)。發(fā)送器件完成通信,將總線讓出(輸出變?yōu)楦咦钁B(tài))。
所謂總線的缺省占用,就是指在當前沒有設(shè)備使用總線或請求總線的情況下,允許仲裁器根據(jù)一定的方式選定一個設(shè)備作為總線缺省的擁有者,并向它發(fā)出_GNT信號。選擇的方式有多種,如可為某一固定設(shè)備,也可為最后一次使用總線的設(shè)備,當然也可以指定自己(仲裁器本身)為總線缺省的擁有者。
當仲裁器將某一設(shè)備確定為總線的缺省擁有者時?該設(shè)備可以不通過發(fā)_REQ信號就開始一次總線操作(只要總線空閑且_GNT信號有效)。如果該設(shè)備需要做多次的數(shù)據(jù)傳輸,它就應(yīng)當發(fā)出_REQ信號,以便向仲裁器提出多次操作的請求;而如果該設(shè)備只要求做一次總線操作,它就不應(yīng)當發(fā)出_REQ信號,否則仲裁器可能在它不需要使用總線的情況下又給它發(fā)出_GNT信號。
3 仲裁信號協(xié)定
綜上所述, PCI總線的仲裁主要是通過_REQ和_GNT兩個信號來實現(xiàn)的。前者用于某一設(shè)備要求占用總線的請求,后者用于允許某一設(shè)備占用總線的應(yīng)答。只有總線仲裁器才可以指定誰是總線缺省的擁有者。
當仲裁器允許某一設(shè)備使用總線時,就向該設(shè)備發(fā)出_GNT信號;相反,當仲裁器不再允許某一設(shè)備擁有總線控制權(quán)時,可以在任意時鐘撤消該設(shè)備的_GNT信號。如果_GNT信號無效,這次操作就不可以進行。
PCI總線的仲裁信號之間必須遵循一定的協(xié)定,具體描述如下:
· 若總線不是處于空閑狀態(tài),有可能一個_GNT的撤消碰巧是另一個_GNT發(fā)出的同時,但如果是在空閑狀態(tài),則要求一個_GNT撤消到下一個_GNT的發(fā)出之間必須有一個時鐘周期。否則可能會在AD線和PAR線上出現(xiàn)沖突;
· 當_FRAME無信號時,_GNT可以在任意時間撤消,以便服務(wù)于另一個主設(shè)備,或者作為對相應(yīng)的_REQ撤消的響應(yīng);
· _GNT信號的每次發(fā)出,只限于相應(yīng)的總線主控器可以使用總線進行一次總線操作。若該主控器還想做多次總線訪問時,可以保持它的_REQ信號一直有效。此時,如果沒有其它請求,或者當前的主控器具有最高優(yōu)先權(quán),仲裁器就會繼續(xù)批準總線給當前主控器;
·一個主控器可以在任意時刻撤消其_REQ信號,但要注意,_REQ信號一旦撤消,仲裁器將認為該設(shè)備不再請求使用總線,因而撤消其_GNT信號。若一個主控器只希望做一次總線傳輸,它應(yīng)當在發(fā)出_FRAME的同一時鐘周期撤消_REQ;
4 優(yōu)先級仲裁算法
為了合理地控制和管理系統(tǒng)中需要占用總線的數(shù)據(jù)源,PCI仲裁器必須實現(xiàn)一個特別的優(yōu)先級仲裁算法,以便在多個設(shè)備同時提出總線占用請求時,能依據(jù)該仲裁算法判決出哪個設(shè)備應(yīng)獲得對總線的控制權(quán)??偩€仲裁可以確保任何時刻總線上最多只有一個設(shè)備發(fā)送信息,而決不會出現(xiàn)多個主控器同時占用總線的情況。
由于總線仲裁算法從根本上說與PCI總線技術(shù)規(guī)范無關(guān),所以設(shè)計者可以根據(jù)實際需要自由地進行選擇和修改。但要注意,設(shè)計時必須為所選用的I/O控制器及接插卡提供所要求的訪問延遲保證。
總線優(yōu)先級仲裁算法通常有兩種,一種是固定優(yōu)先級算法,一種是循環(huán)優(yōu)先級算法。但不管是哪一種仲裁算法,都必須滿足以下三個基本要求:
· 每一時刻只能有一個設(shè)備作為總線主控器;
· 先請求者先響應(yīng),且在一個總線操作周期之內(nèi)不被打斷;
· 同一時刻有幾個設(shè)備發(fā)出請求時,按優(yōu)先級排序響應(yīng)。
所謂固定優(yōu)先級算法,就是指PCI總線中各主控器的優(yōu)先級是事先確定好的,在仲裁器仲裁過程中固定不變;而循環(huán)優(yōu)先級算法則不同,各主控器的優(yōu)先級在仲裁器的仲裁過程中不是一成不變,而是根據(jù)一定規(guī)律發(fā)生變化的。
表1給出了采用循環(huán)優(yōu)先級算法或固定優(yōu)先級算法時,PCI總線仲裁器中N個主控器的優(yōu)先級變化規(guī)律。
采用固定優(yōu)先級算法,可以對那些有重要數(shù)據(jù)傳輸、或有大量實時數(shù)據(jù)傳輸以及經(jīng)常需要占用總線的主設(shè)備賦予較高的優(yōu)先權(quán),以便有效地利用PCI總線周期。在實際中,常常將這兩種算法結(jié)合起來使用,以便構(gòu)成更為靈活的仲裁機構(gòu)。
5 仲裁器的EPLD編程設(shè)計
下面以支持5個總線主控器的PCI總線仲裁器為例,給出采用Altera公司的EPLD進行功能實現(xiàn)的主要設(shè)計思路,其中,所用編程語言為Altera公司的AHDL語言。該仲裁器采用循環(huán)優(yōu)先級仲裁算法,且總線的缺省擁有者指定為最后一次使用總線的主設(shè)備。
5.1 PCI總線的狀態(tài)機
PCI是Peripheral CompONent Interconnect(外設(shè)部件互連標準)的縮寫,它是目前個人電腦中使用最為廣泛的接口,幾乎所有的主板產(chǎn)品上都帶有這種插槽。PCI插槽也是主板帶有最多數(shù)量的插槽類型,在目前流行的臺式機主板上,ATX結(jié)構(gòu)的主板一般帶有5~6個PCI插槽,而小一點的MATX主板也都帶有2~3個PCI插槽,可見其應(yīng)用的廣泛性。
PCI總線是一種不依附于某個具體處理器的局部總線。從結(jié)構(gòu)上看,PCI是在CPU和原來的系統(tǒng)總線之間插入的一級總線,具體由一個橋接電路實現(xiàn)對這一層的管理,并實現(xiàn)上下之間的接口以協(xié)調(diào)數(shù)據(jù)的傳送。管理器提供了信號緩沖,使之能支持10種外設(shè),并能在高時鐘頻率下保持高性能。PCI總線也支持總線主控技術(shù),允許智能設(shè)備在需要時取得總線控制權(quán),以加速數(shù)據(jù)傳送。
PCI總線的狀態(tài)機包括三種基本狀態(tài):無任何總線請求(NO_REQ)、等待周期(WAIT_CYCLE)和幀信號_FRAME的撤消(FRAMED)。其中,_FRAME信號的撤消,意味著當前的總線操作將進入最后一個數(shù)據(jù)傳輸周期,此時,_IRDY有效,一旦 _TRDY也有效?最后一個數(shù)據(jù)傳輸周期就可完成。而判斷_FRAME是否撤消的具體方法就是判斷_FRAME是否出現(xiàn)從低到高的上跳變。圖2所示即為PCI總線的狀態(tài)機。圖中,TIME_OUT為從_GNT發(fā)出到_FRAME變?yōu)橛行试S的PCI總線周期數(shù)。
5.2 PCI總線仲裁器的狀態(tài)機
由于此仲裁器最大支持5個PCI總線主控器,至于仲裁器的仲裁狀態(tài)什么時候應(yīng)該發(fā)生變化則由總線狀態(tài)機的狀態(tài)決定,具體如下:當總線狀態(tài)機處于FRAMED狀態(tài),表明在最后一個數(shù)據(jù)傳輸周期結(jié)束后,它將釋放PCI總線,此時,仲裁器便可撤消對它的_GNT信號,以便去服務(wù)于另一個主控器;所以,若用EnChange來代表允許仲裁器仲裁狀態(tài)發(fā)生變化的條件,則采用AHKL語言的具體編程如下:EnChange=(EnCHstate ==FRAMED)#(eNchSTATE == no_req)#(TimeOut[]==TIME_OUT)
該仲裁器中,由于采用循環(huán)優(yōu)先級算法,仲裁器從每一種仲裁狀態(tài)轉(zhuǎn)換到其它仲裁狀態(tài)的方法都是一樣的,所以,下面只給出了仲裁器的仲裁狀態(tài)為主控器1時向其它仲裁狀態(tài)的轉(zhuǎn)換機理(如圖3所示)。另外,若仲裁器在剛啟動時處于無效狀態(tài),則強制狀態(tài)機在下一個時鐘轉(zhuǎn)換到Master0態(tài)。
5.3 總線允許信號_GNTi(低電平有效)的建立
在PCI對話中,由于_FRAME 和 _IRDY決定著總線的忙/閑狀態(tài)。兩者之中只要有一個信號成立,總線就處于忙碌狀態(tài);當兩個信號都無效時,總線才處于空閑狀態(tài)。所以建立_GNTi的具體編程如下:?。逩NTi=(GNTstate==Masteri)&GLOBAL(_PCIrst)&!MaskGNT;%式中,MaskGNT=_FRAME&_IRDY%
總之,本文介紹的PCI總線仲裁器,由于采用單片EPLD即可實現(xiàn),所以它具有系統(tǒng)結(jié)構(gòu)簡單、成本低、可靠性高、在線修改方便及升級容易等特點。目前,采用該仲裁器的PCI高速總線背板已應(yīng)用在我們研發(fā)的總線型高性能網(wǎng)絡(luò)交換機系列中。經(jīng)過近兩年的實際運行表明,仲裁器工作正常,性能穩(wěn)定可靠。