三、PCI總線協議

PCI上的基本總線傳輸機制時突發成組傳輸。一個突發分組由一個地址期和一個(多個)數據期組成。PCI支持存儲器空間和I/O空間的突發傳輸。這裏的突發傳輸是指主橋(位於主處理及和PCI總線之間)可以將多個存儲器訪問在不產生副作用的前提下合併爲一次傳輸。一個設備通過將基址寄存器的預取位置1,來表示允許預讀數據和合並寫數據。一個橋可利用初始化時配置軟件所提供的地址範圍,來區分哪些地址空間可以合併,哪些不能合併。當遇到要寫的後續數據不可預取或者一個對任何範圍的讀操作時,在緩衝器的數據合併操作必須停止並將以前的合併結果清洗。但其後的寫操作,如果時在預取範圍內,便可與更後面的寫操作合併,但無論如何不能與前面合併過的數據合併。

只要處理及發出的一系列寫數據(雙字)所隱含的地址順序相同,主橋路總是可以將它們組合成突發數據。例如,若處理機的寫順序時DWORD0、DWORD2、DWORD3,那麼主橋路即可將它們組合成一次突發。PCI的突發順序可以是DWORD0、DWORD1、DWORD2到DWORD3結束,中間可插入未訪問的DWORD(雙字),只要對應該雙字的字節使能信號不發即可。合併的原則是隻要後面的DWORD地址比前面的高就行。當讀操作不會再被尋址的從設備上引起副作用時,橋路便可將單個的處理機讀請求轉變爲一次突發讀(前述的預取)。

對於I/O空間的訪問不能合併,因此它們一般只有一個數據期。目前,是否由處理機或總線主設備可以發出指向I/O空間的突發傳輸,還無法得知,但不能排除將來有着這種設備的可能性。不能處理多個I/O數據期的PCI設備必須再第一個數據期之後斷開訪問,爲此,橋路絕對不能把順序的I/O訪問合併成一個 突發的訪問或單個的PCI訪問。也就是說,對於所有的I/O訪問,再處理機產生它們的同時,該訪問也必須出現再PCI總線上。如果一個從設備被I/O訪問選中,在字節使能信號所代表的傳輸長度大於該設備能支持的長度時,從設備要用目標終止方式結束本次訪問。

在PCI總線中,除了RST#、INTA#~INTD#之外,其它所有信號都在時鐘上升沿被採樣,每個信號都有相對於時鐘前沿的建立和保持時間,在此期間不允許有信號跳動,該時間一過,信號的變化就無關緊要了。這種建立和保持時間對於不同的信號,其情形時不同的。對於AD[31..0]、AD[63..32]、PAR、PAR64和IDESL來說,只有在一定的時鐘邊沿上纔有上述時間的要求;對於LOCK#、IRDY#、TRDY#、FRAME#、DEVSEL#、STOP#、REQ#、GNT#、REQ64#、ACK64#、SBO#、SDONE#、SERR#和PERR#這些信號,在每個時鐘前沿都有建立和保持時間;對於C/BE[3..0]、C/BE[7..4]這兩組信號,在傳輸總線命令時,要在FRAME#第一次建立時對應的時鐘邊沿上遵守建立和保持時間關係;若傳輸字節使能信號時,要在完成一個地址期或數據期之後的每個時鐘沿保證相應的建立和保持時間。

3.1、PCI總線的傳輸控制

PCI總線上所有的數據傳輸基本上都是由一下三條信號線控制的:

FRAME#:由主設備驅動,指明一個數據傳輸的起始和結束。

IRDY#:由主設備驅動,允許插入等待週期。

TRDY:由從設備驅動,允許插入等待週期。

當數據有效時,數據資源需要無條件設置XRDY#信號(寫操作爲IRDY#,讀操作爲TRDY#)。接收方可以在適當的時間發出它的XRDY#信號。FRAME#信號有效後的第一個時鐘前沿時地址期的開始,此時傳送地址信息和總線命令。下一個時鐘前沿開始一個(多個)數據期,每逢IRDY#和TRDY#同時有效時,所對應的時鐘前沿就使數據在主、從設備之間傳送,在此期間,可由主設備或從設備分別利用IRDY#和TRDY#的無效而插入等待週期。

一旦主設備設置了IRDY#信號,將不能改變IRDY#和FRAME#,直到當前的數據期完成爲止。而一個從設備一旦設置了TRDY#信號或STOP#信號,就不能改變DEVSEL#、TRDY#或STOP#,知道當前的數據期完成。也就是說,不管時主設備還是從設備,只要承諾了的數據傳輸,就必須進行到底。

當到最後一次數據傳輸時(有時緊接地址期之後)主設備應撤銷FRAME#信號,而建立IRDy#信號,表明主設備已經做好了最後一次數據傳輸的準備,待到從設備發出TRDY#信號後,就說明最後一次數據傳輸完成,FRAME#和IRDY#信號均撤銷,接口回到了空閒裝填。總之,PCI總線的傳輸一般遵循如下管理規則:

1)FRAME#和IRDY#定義了總線忙/閒狀態。當其中一個有效時,總線是忙的;兩個都無效時,總線處於空閒狀態。

2)一旦FRAME#信號被置爲無效,在同一傳輸期間不能重新設置。

3)除非設置IRDY#信號,一般情況下不能設置FRAME#信號無效。

4)一旦主設備設置了IRDY#信號,知道當前數據期結束爲止,主設備不能改變IRDY#信號和FRAME#信號的狀態。

3.2、PCI的編址

PCI總線定義了三個物理地址空間:內存地址空間、I/O地址空間和配置地址空間。前兩個是通常都有的,第三個用以支持PCI的硬件配置,將在後續章節中進一步說明。

PCI總線的編址是分佈式的,每個設備都有自己的譯碼,從而省去了中央譯碼邏輯。PCI支持正向和負向兩種風格的地址譯碼,所謂正向譯碼就是每個設備都監視地址總線上的訪問地址是否落在它的地址範圍,因此速度較快;而負向譯碼是指該設備要接受未被其它設備在正向譯碼中接受的所有訪問,因此,此種譯碼方式只能由總線上的一個設備來實現,由於它要等到總線上其它所有設備都拒絕之後才能行動,所以速度較慢。然後,負向譯碼對於像標準擴展總線這類設備卻是很有用的,這是因爲這類設備必須響應一個很零散的地址空間。但無論是正向譯碼的設備還是負向譯碼的設備都不對保留的總線命令發出DEVSEL#響應信號。

1.I/O地址空間

在I/O地址空間,全部32位AD線都被用來提供一個完整的地址編碼(字節地址),這使得要求地址精確到字節水平的設備不需要多等一個週期就可完成地址譯碼(產生DEVSEL#信號)、也使負的地址譯碼節省了一個時鐘週期。

在I/O訪問中,AD[1..0]兩位很重要,它一方面用來產生DEVSEL#信號,更值得注意的是它也表示傳輸涉及的最低有效字節,並且要與C/BE[3..0]#相配合。例如,當C/BE0#有效時,那麼AD[1..0]必須爲“00”;如果C/BE3#有效時,AD[1..0]就應當爲“11”.在具體訪問中,每當一個從設備被地址譯碼選中後,便要檢查字節使能信號是否與AD[1..0]相符 ,如果二者矛盾,則整個訪問就無法完成,此時,從設備不傳送任何數據,而是以一個“目標終止”操作來結束訪問,下表給出了AD[1..0]和C/BE[3..0]#的對應關係。

AD1 AD0 C/BE3# C/BE2# C/BE1# C/BE0#
0 0 X X X 0
0 1 X X 0 1
1 0 0 1 1
1 1 0 1 1 1

其中,1表示高電平,0表示低電平,X表示0或1.對於任何不同於上表的組合狀態都是非法的。

2.內存地址空間

在存儲器訪問中,所有的目標設備都要檢查AD[1..0],要麼提供所要求的突發傳輸順序,或者執行一目標設備斷開操作。對於所有支持突發傳輸的設備都應能實現線性突發傳輸順序。而Cache的行切換不一定必須實現,在存儲器地址空間,要用AD[31..2]譯碼得到一個雙字地址的訪問。在線性增長方式下,每個數據週期過後地址按一個DWORD(4個字)增長,直到對話結束。在存儲器訪問期間,AD[1..0]的含義如下:

當AD[1..0] = 00時,突發傳輸順序爲線性增長方式;AD[1..0] = 01時,爲Cache行切換方式;AD[1..0] = 1X時,爲保留。

3.配置地址空間

在配置的地址空間中,要用AD[7..2]將訪問落實到一個DWORD地址。當一個設備收到配置命令時,若IDSEL信號成立且AD[1..0] = 00,則該設備即被選爲訪問目標。否則就不參與當前的對話。如果譯碼出的命令,符合某橋路的編號,且AD[1..0] = 01,則說明配置訪問時對着該橋後面的設備。

3.3、字節校正

字節使能信號僅被用來指出哪些字節帶了有意義的數據,在每個數據期內,可以自由改變字節使能,使之對傳輸數據的實際含義和有效部分進行界定,這一功能被稱作“字節校正”。

由於PCI設備的地址譯碼需要32位地址/數據線的全部,所以在PCI總線上不能進行字節的交換。但是具有64位數據通路的主設備可以進行DWORD(雙字)的交換,這就是說,字節總是按字節地址所規定的自然字節位置上出現。主設備可以在每個新數據期改變字節使能信號,但一定要使其在每個數據期開始的時鐘前沿變爲有效,且在整個數據期中保持不變。一個主設備若要在讀操作中改變字節使能信號,那麼在寫操作中也應採用同樣的時序關係。如果目標設備在讀操作中特別要求字節使能信號配合的話,則在響應的數據期必須等到字節使能信號有效,方可完成傳輸,否則該設備必須會送全部字節。

如果當前要讀取的數據來自於可緩存的存儲器,則無論字節使能信號是否有效,所有的字節都必須傳送。這就要求主控一方能夠保證使得目標設備回送全部字節。也就是說,假如可緩存性是由數據讀取發起者判斷而知,則該設備要能保證使C/BE[3..0]的各位均有效,以使被選中的設備送回全部字節;反之,要是目標一方判斷而知,那麼目標放就必須回送全部字節,可不必考慮字節使能信號的狀態。

對於一個不支持高速緩存但支持預取的從設備(目標設備),只要不會引起數據破壞或狀態改變,也可回送全部字節而不受字節使能信號的控制。

PCI總線允許字節使能信號以相鄰或不相鄰的形式進行組合。對於目標設備,即使沒有字節使能信號,也必須通過發出TRDY#使數據傳輸完成,倘若使讀操作還要提供奇偶位。

3.4、總線的驅動和過渡

爲了避免多個設備同時i驅動一個信號到PCI總線上而產生競爭,在一個設備驅動到另一個設備驅動之間設置了一個過渡期,又稱交換週期,在後續章節的時序圖中,用互相指着對方尾部的雙箭頭符號來表示。此週期在不同的信號上所出現的時刻使不同的。對於IRDY#、TRDY#、STOP#、DEVSEL#和ACK64#這些信號都利用地址期作爲交換週期;而FRAME#、C/BE[3..0]#、AD[31..0]、C/BE[7..4]#、AD[64..32]及REQ64#這些信號,則是利用數據傳輸之間的空閒期作爲交換週期;LOCK#信號的交換週期出現於當前的控制着釋放它之後的一個時鐘週期;PERR#的交換週期開始於前一個數據期過後的第四個時鐘週期,相當於比AD線的交換週期推遲了三個時鐘週期。

在每個地址期和數據期中,所有的AD線,都必須被驅動到穩定的狀態(數據),即便是在當前數據傳輸中未涉及的字節所對應的AD線,也不例外。這樣做的目的有三:①爲了奇偶計算;②使傳送中未被包含的字節所對應的緩衝區不至於處在臨界狀態;③便於快速而相對穩定地鎖定數據。在實際應用中,如果對功耗要求較大時,未盡量減少由於總線上信號開關所造成的功耗,對當前總線週期中不用的字節最後利用與前一週期相同的數據驅動它們,否則,沒有具體要求。但奇偶位的計算包括所有的字節在內,與字節使能信號的有效與否無關。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章