PCI总线协议(一)
? ? 剛開始接觸BIOS開發(fā),目前正在學(xué)習(xí)關(guān)于PCI總線方面的知識(shí),以下是本人根據(jù)網(wǎng)上的資料所整理的PCI學(xué)習(xí)筆記,如果有什么不對(duì)的地方,感謝大神的斧正。
? ? 眾所周知,PCI總線是計(jì)算機(jī)主板上不可或缺的部分,它連接著大部分的硬件設(shè)備,可以連接擴(kuò)展到Super I/O上連接鍵盤和鼠標(biāo)等低速設(shè)備,也可以連接聲卡、網(wǎng)卡等中高速設(shè)備,甚至可以擴(kuò)展PCIe總線連接顯卡這類高速設(shè)備。
一、 PCI總線
1、PCI總線簡(jiǎn)介
PCI是PeripheralComponent Interconnect(外設(shè)部件互連標(biāo)準(zhǔn))的縮寫,它是一種局部并行總線標(biāo)準(zhǔn)。它的工作頻率是33MHz,PCI總線是一種樹型結(jié)構(gòu),并且獨(dú)立于CPU總線,可以和CPU總線并行操作。PCI總線上可以掛接PCI設(shè)備和PCI橋片,PCI總線上只允許有一個(gè)PCI主設(shè)備,其他的均為PCI 從設(shè)備,而且讀寫操作只能在主從設(shè)備之間進(jìn)行,從設(shè)備之間的數(shù)據(jù)交換需要通過主設(shè)備中轉(zhuǎn)。
2、PCI總線主要性能
? ? ? (1)傳輸速率高。在32bit操作系統(tǒng)中最大傳輸為132MB/s,在64bit操作系統(tǒng)中傳輸速率可達(dá)到264MB/s。
? ? ? (2)能夠多總線共存。在一個(gè)系統(tǒng)中可容納多種總線設(shè)備共同工作,允許不同速度的設(shè)備一同工作。
? ? ? (3)獨(dú)立于CPU。PCI總線不依賴于某一具體的CPU。
? ? ? (4)自動(dòng)識(shí)別與配置外設(shè)。用戶使用方便。
? ? ? (5)并行操作能力。一種并行的數(shù)據(jù)傳輸方式,傳輸效率高。
? ? ? (6)適應(yīng)不同的電壓環(huán)境。可以在5V和3.3V電壓下工作。
3、PCI總線特點(diǎn)
? ? ?(1)高速性。PCI總線的主設(shè)備(Master)可與微機(jī)內(nèi)存直接交換數(shù)據(jù),而不必經(jīng)過微機(jī)CPU中轉(zhuǎn),也提高了數(shù)據(jù)傳送的效率。
? ? ?(2)即插即用性。而PCI板卡的硬件資源則是由微機(jī)根據(jù)其各自的要求統(tǒng)一分配,決不會(huì)有任何的沖突問題。
? ? ?(3)可靠性。PCI總線增加了奇偶校驗(yàn)錯(cuò)(PERR)、系統(tǒng)錯(cuò)(SERR)、從設(shè)備結(jié)束(STOP)等控制信號(hào)及超時(shí)處理等可靠性措施,使數(shù)據(jù)傳輸?shù)目煽啃源鬄樵黾印?/span>
? ? ?(4)復(fù)雜性。硬件設(shè)計(jì)和軟件開發(fā)上的難度增加。
? ? ?(5)自動(dòng)配置。PCI中有256字節(jié)的空間存放配置信息(中斷、存儲(chǔ)地址和某些定時(shí)信息)。
? ? ?(6)中斷共享。低電平觸發(fā)方式,多個(gè)中斷可使用同一中斷。
? ? ?(7)擴(kuò)展性好。可以多級(jí)采用PCI總線進(jìn)行擴(kuò)展,都是并發(fā)工作。
? ? ?(8)多路復(fù)用。采用了地址線和數(shù)據(jù)線共用一組物理線路
? ? ?(9)嚴(yán)格規(guī)范。PCI總線對(duì)協(xié)議、時(shí)序、電氣性能、機(jī)械性能等指標(biāo)都有嚴(yán)格的規(guī)定,保證其可靠性和兼容性。
?
二、 PCI協(xié)議基礎(chǔ)
1、 PCI設(shè)備引腳介紹
圖1 PCI總線引腳圖
? 按照類型將上述引腳分類,逐個(gè)進(jìn)行介紹。
(1)、系統(tǒng)信號(hào)線
CLK:時(shí)鐘信號(hào)線,系統(tǒng)在時(shí)鐘信號(hào)上升沿是有效,才能進(jìn)行傳輸。
RST:復(fù)位信號(hào)線,在低電平時(shí)信號(hào)才能進(jìn)行傳輸。
?
(2)、地址及數(shù)據(jù)線
? AD0-AD31:地址和數(shù)據(jù)多路復(fù)用的輸入輸出信號(hào)。在FRAME有效時(shí)是地址周期,在IRDY和TRDY同時(shí)有效時(shí)是數(shù)據(jù)周期。在執(zhí)行地址周期時(shí),地址周期為一個(gè)時(shí)鐘周期,在該周期中AD0~AD31線上含有一個(gè)32位的物理地址,對(duì)于I/O操作,它是一個(gè)字節(jié)地址;若是存儲(chǔ)器操作和配置操作,則是雙字地址。在執(zhí)行數(shù)據(jù)周期時(shí),IRDY有效表示寫數(shù)據(jù)穩(wěn)定,TRDY有效表示讀數(shù)據(jù)有效。
C/BE0~3:總線命令和字節(jié)使能多路復(fù)用信號(hào)線。在地址周期內(nèi),這四條線上傳輸?shù)氖强偩€命令;在數(shù)據(jù)周期內(nèi),傳輸?shù)氖亲止?jié)使能信號(hào),用來表示在整個(gè)數(shù)據(jù)期中,?AD0~AD31上哪些字節(jié)為有效數(shù)據(jù)。
? ?PAR:奇偶校驗(yàn)信號(hào)。它通過AD[31::00]和C/BE[3::0]進(jìn)行奇偶校驗(yàn)。主設(shè)備為地址周期和寫數(shù)據(jù)周期驅(qū)動(dòng)PAR,從設(shè)備為讀數(shù)據(jù)周期驅(qū)動(dòng)PAR。
(3)、接口控制信號(hào)線
? ?FRAME:幀周期信號(hào)。由當(dāng)前主設(shè)備驅(qū)動(dòng),表示一次訪問的開始和持續(xù)時(shí)間。當(dāng)其?無效時(shí),表示傳輸?shù)淖詈笠粋€(gè)數(shù)據(jù)周期。
? ?IRDY:主設(shè)備準(zhǔn)備好信號(hào)。該信號(hào)有效表明發(fā)起本次傳輸?shù)脑O(shè)備(主設(shè)備)能夠完成一個(gè)數(shù)據(jù)期。它要與TRDY配合使用,當(dāng)這兩者同時(shí)有效時(shí),才能進(jìn)行完整的數(shù)據(jù)傳輸,否則即為等待周期。在寫周期,該信號(hào)有效時(shí),表示有效的數(shù)據(jù)信號(hào)已在AD0~AD31中建立;在讀周期,該信號(hào)有效時(shí),表示主設(shè)備已做好接收數(shù)據(jù)的準(zhǔn)備。
? ?TDRY:從設(shè)備準(zhǔn)備好信號(hào)。該信號(hào)有效表示從設(shè)備已做好完成當(dāng)前數(shù)據(jù)傳輸?shù)臏?zhǔn)備工作,此時(shí)可進(jìn)行相應(yīng)的數(shù)據(jù)傳輸。同樣,該信號(hào)要與IRDY配合使用,這兩者同時(shí)有效數(shù)據(jù)才能進(jìn)行完整傳輸。在寫周期內(nèi)該信號(hào)有效表示從設(shè)備已做好了接收數(shù)據(jù)的準(zhǔn)備。在讀周期內(nèi),該信號(hào)有效表示有效數(shù)據(jù)已被送入AD0~AD31中,同理,?TRDY和IRDY中的任何一個(gè)無效時(shí)都為等待周期,此時(shí)不能進(jìn)行數(shù)據(jù)的傳輸。
? ?STOP:停止數(shù)據(jù)傳輸信號(hào)。從設(shè)備發(fā)出的信號(hào),表示請(qǐng)求主設(shè)備停止發(fā)送數(shù)據(jù)的信號(hào)。
? ?LOCK:鎖定信號(hào)。有PCI總線上發(fā)起數(shù)據(jù)傳輸?shù)脑O(shè)備控制發(fā)出的信號(hào),多個(gè)設(shè)備在使用PCI總線,但是LOCK指令的控制者只有一個(gè)主設(shè)備(由GNT信號(hào)標(biāo)識(shí))。當(dāng)LOCK信號(hào)有效時(shí),表示驅(qū)動(dòng)它的設(shè)備所進(jìn)行的操作可能需要多個(gè)傳輸才能完成,如果對(duì)某一設(shè)備具有可執(zhí)行的存儲(chǔ)器,那么它必須能實(shí)現(xiàn)鎖定,以便實(shí)現(xiàn)主設(shè)備對(duì)該存儲(chǔ)器的完全獨(dú)占性訪問。對(duì)于支持鎖定的目標(biāo)設(shè)備,必須能提供一個(gè)互斥訪問塊,且該塊不能小于16?個(gè)字節(jié)。連接系統(tǒng)存儲(chǔ)器的主橋路也必須使用LOCK信號(hào)。
? ?IDSEL:初始化設(shè)備選擇信號(hào)。在參數(shù)配置讀寫傳輸期間,用作片選信號(hào)。
? ?DEVSEL:設(shè)備選擇信號(hào)。由從設(shè)備驅(qū)動(dòng),該信號(hào)有效時(shí),表示驅(qū)動(dòng)它的設(shè)備已成為當(dāng)前訪問的從設(shè)備。它有效表明總線上的某一設(shè)備已被選中。
?
(4)、仲裁信號(hào)線
? ?REQ:總線請(qǐng)求信號(hào)。該信號(hào)一旦有效即表示驅(qū)動(dòng)它的設(shè)備要求使用總線。它是一個(gè)點(diǎn)到點(diǎn)的信號(hào)線,任何主設(shè)備都應(yīng)有自己的REQ信號(hào)。
? ?GNT:總線允許信號(hào)。用來向申請(qǐng)占用總線的設(shè)備表示其請(qǐng)求已獲批準(zhǔn)。這也是一?個(gè)點(diǎn)到點(diǎn)的信號(hào)線,任何主設(shè)備都應(yīng)有自己的GNT信號(hào)。
?
(5)、錯(cuò)誤報(bào)告信號(hào)線
? ?PERR:數(shù)據(jù)奇偶校驗(yàn)錯(cuò)誤報(bào)告信號(hào)。但是該信號(hào)不報(bào)告特殊周期中的數(shù)據(jù)奇偶錯(cuò)誤。一個(gè)設(shè)備只有在響應(yīng)設(shè)備選擇信號(hào)DEVSEL和完成數(shù)據(jù)期之后,才能報(bào)告一個(gè)PERR。對(duì)于每個(gè)數(shù)據(jù)接收設(shè)備,如果發(fā)現(xiàn)數(shù)據(jù)有錯(cuò)誤,就應(yīng)在數(shù)據(jù)收到后的兩個(gè)時(shí)鐘周期將PERR激活。該信號(hào)的持續(xù)時(shí)間與數(shù)據(jù)期的多少有關(guān),如果是一個(gè)數(shù)據(jù)期,則最小持續(xù)時(shí)間為一?個(gè)時(shí)鐘周期;若是一連串的數(shù)據(jù)期并且每個(gè)數(shù)據(jù)期都有錯(cuò),那么PERR的持續(xù)時(shí)間將多于一個(gè)時(shí)鐘周期。由于該信號(hào)是持續(xù)的三態(tài)信號(hào),所以該信號(hào)在釋放前必須先驅(qū)動(dòng)為高電平。另外,對(duì)數(shù)據(jù)奇偶錯(cuò)的報(bào)告不能丟失也不能推遲,需要實(shí)時(shí)進(jìn)行響應(yīng)。
? ?SERR:系統(tǒng)錯(cuò)誤報(bào)告信號(hào)。該信號(hào)用于報(bào)告地址奇偶錯(cuò),特殊命令序列中的數(shù)據(jù)奇偶錯(cuò),以及其他可能引起災(zāi)難性后果的系統(tǒng)錯(cuò)誤。?SERR是漏極開路信號(hào),由返遣錯(cuò)誤的單元驅(qū)動(dòng),在一個(gè)PCI時(shí)鐘內(nèi)有效。SERR信號(hào)的發(fā)出和時(shí)鐘同步,因而滿足總線上所有其他信號(hào)的建立時(shí)間和保持時(shí)間的要求。
?
(6)、中斷信號(hào)線
? ?中斷在PCI總線上是可選用的,低電平有效,用漏極開路方式驅(qū)動(dòng)。同時(shí),此類信號(hào)的建立和撤銷是與時(shí)鐘不同步的。PCI為每一個(gè)單功能設(shè)備定義一根中斷線。對(duì)于多功能設(shè)備或連接器,最多可有4條中斷線。對(duì)于單功能設(shè)備,只能使用INTA,其余3條中斷線無意義。PCI局部總線有四條中斷線,定義如下:
? ?INTA?o/d:中斷A,用于請(qǐng)求一次中斷。??
? ?INTB o/d:中斷B,用于請(qǐng)求一次中斷并只在多功能設(shè)備上有意義。?????
? ?INTC o/d:中斷C,功能同中斷B。???
? ?INTD o/d:中斷D,功能同中斷B。?????
多功能設(shè)備上的任何一種功能都能連到任何一條中斷線上。中斷寄存器決定該功能用哪一條中斷線去請(qǐng)求中斷。如果一個(gè)設(shè)備只用一條中斷線,則這條中斷線就稱為INTA,如果該設(shè)備用了兩條中斷線,那么它們就稱為INTA和INTB,依此類推。對(duì)于多功能設(shè)備,可以是所有功能用一條中斷線,也可以是每種功能有自己的一條中斷線,還可以是上兩種情況的綜合。??
???系統(tǒng)供應(yīng)商在對(duì)PCI連接器的各個(gè)中斷信號(hào)和中斷控制器進(jìn)行連接時(shí),其方法是隨意的,可以是線或方式、程控電子開關(guān)方式,或者是二者的組合,這就是說,設(shè)備驅(qū)動(dòng)程序?qū)τ谥袛喙蚕硎孪葻o法作出任何假定,即它必須能夠給任何邏輯設(shè)備提供中斷。
?
(7)、高速緩存(Cache)支持信號(hào)線
? ?為了使具有可緩存功能的PCI存儲(chǔ)器能夠和貫穿寫(Write-Through)或回寫(Write-?Back)的Cache相配合工作,可緩存的PCI存儲(chǔ)器應(yīng)該能實(shí)現(xiàn)兩條高速緩存支持信號(hào)作為輸入。如果可緩存的存儲(chǔ)器位于PCI總線上,那么連接回寫式Cache和PCI的橋路必須要利用兩條引腳,且作為輸出,而連接貫穿寫式Cache的橋只需要實(shí)現(xiàn)一個(gè)信號(hào)。上述兩個(gè)信號(hào)的定義如下:
? ?SBO in/out:雙向試探返回信號(hào)(Snoop?Backoff)。當(dāng)其有效時(shí),說明對(duì)某修改行的一次命中,所訪問的數(shù)據(jù)為無效數(shù)據(jù)。當(dāng)SBO無效而SDONE有效時(shí),說明PCI發(fā)起方正在訪問存儲(chǔ)器的有效性并可進(jìn)行高速緩存的操作。??
? ?SDONE?in/out:監(jiān)聽完成信號(hào)(Snoop?Done),表明對(duì)處理器Cache對(duì)主存的監(jiān)聽狀態(tài)。當(dāng)其無效時(shí),說明監(jiān)聽仍在進(jìn)行,否則表示監(jiān)聽已經(jīng)完成。
?
(8)、64位總線擴(kuò)展信號(hào)線
? ?AD32~AD63?t/s:擴(kuò)展的32位地址和數(shù)據(jù)多路復(fù)用線。在地址周期(如果使用了雙地址周期DAC命令且REQ64信號(hào)有效時(shí))這32條線上含有64位地址的高32位,否則它們是保留的;在數(shù)據(jù)周期,當(dāng)REQ64和ACK64同時(shí)有效時(shí),這32條線上含有高32位數(shù)據(jù)。
C/BE 4~7 t/s:總線命令和字節(jié)使能多路復(fù)用信號(hào)線。在數(shù)據(jù)周期,若REQ64和ACK64同時(shí)有效時(shí),該4條線上傳輸?shù)氖潜硎緮?shù)據(jù)線上哪些字節(jié)是有意義的字節(jié)使能信號(hào)。如C/BE4對(duì)應(yīng)第4個(gè)字節(jié),C/BE5對(duì)應(yīng)第5個(gè)字節(jié)。在地址周期內(nèi),如果使用了DAC命令且REQ64信號(hào)有效,則表明C/BE 4~7上傳輸?shù)氖强偩€命令,否則這些位是保留的且不確定。
? ?REQ64:64位傳輸請(qǐng)求。該信號(hào)由當(dāng)前主設(shè)備驅(qū)動(dòng),表示本設(shè)備要求采用64位通路傳輸數(shù)據(jù)。它FRAME與有相同的時(shí)序。
? ?ACK64:64位傳輸認(rèn)可。表明從設(shè)備將用64位傳輸。此信號(hào)由從設(shè)備驅(qū)動(dòng),并且和DEVSEL具有相同的時(shí)序。
? ?PAR64?t/s:奇偶雙字節(jié)校驗(yàn)。是AD32~AD63和C/BE 4~7的校驗(yàn)位。當(dāng)REQ64有效且C/BE 0~3上是DAC命令時(shí),PAR64將在初始地址周期之后一個(gè)時(shí)鐘周期有效,并在DAC命令的第二個(gè)地址周期后的一個(gè)時(shí)鐘周期失效。當(dāng)REQ64和ACK64同時(shí)有效時(shí),PAR64在備數(shù)據(jù)期內(nèi)穩(wěn)定有效,并且在IRDY或TRDY發(fā)出后的第一個(gè)時(shí)鐘處失效。PAR64信號(hào)一旦有效,將保持到數(shù)據(jù)周期完成之后的一個(gè)時(shí)鐘周期。該信號(hào)與AD32~AD63的時(shí)序相同,但延遲一個(gè)時(shí)鐘周期。該信號(hào)線在任何給定的總線周期內(nèi)應(yīng)保證連同AD32~AD63和C/BE 4~7在內(nèi)的所有信號(hào)線上的“1”的個(gè)數(shù)為偶數(shù)(偶校驗(yàn))或者為奇數(shù)(奇校驗(yàn))。在發(fā)送時(shí)產(chǎn)生而在接收時(shí)進(jìn)行校驗(yàn)。
?
2、PCI總線的傳輸控制
? ?采用猝發(fā)成組數(shù)據(jù)傳輸?shù)膫鬏敺绞?#xff0c;一個(gè)分組有一個(gè)地址相位和一個(gè)或多個(gè)數(shù)據(jù)相位組成。數(shù)據(jù)傳輸?shù)目刂凭€:
? ?FRAME#:由主設(shè)備驅(qū)動(dòng),說明一次數(shù)據(jù)傳輸周期的開始和結(jié)束。?????
? ?IRDY#:由主設(shè)備驅(qū)動(dòng),表示主設(shè)備已經(jīng)作好傳送數(shù)據(jù)的準(zhǔn)備。?????
? ?TRDY#:由從設(shè)備驅(qū)動(dòng),表示從設(shè)備已經(jīng)作好傳送數(shù)據(jù)的準(zhǔn)備。
? ?當(dāng)數(shù)據(jù)有效時(shí),數(shù)據(jù)源設(shè)備需要無條件設(shè)置xRDY#(IRDY/TRDY),接收方可以在適當(dāng)?shù)臅r(shí)間發(fā)出xRDY#(TRDY/IRDY)信號(hào)。FRAME#信號(hào)有效后的第一個(gè)時(shí)鐘前沿是地址相位的開始,此時(shí),開始傳送地址信息和總線命令,下一個(gè)時(shí)鐘前沿進(jìn)入一個(gè)或多個(gè)數(shù)據(jù)相位。每當(dāng)IRDY#和TRDY#同時(shí)有效時(shí),所對(duì)應(yīng)的時(shí)鐘前沿就使數(shù)據(jù)在主從設(shè)備之間傳送。在此期間,可由主設(shè)備或從設(shè)備分別利用IRDY#和TRDY#的無效而插入等待周期。
? ?只要數(shù)據(jù)傳輸已經(jīng)開始,那么在當(dāng)前數(shù)據(jù)相位結(jié)束之前,不管是主設(shè)備還是從設(shè)備都不能撤消命令,必須完成數(shù)據(jù)傳輸。最后一次數(shù)據(jù)傳輸時(shí)(可能緊接地址相位之后),主設(shè)備應(yīng)撤消FRAME#信號(hào)而建立IRDY#,表明主設(shè)備已作好了最后一次數(shù)據(jù)傳輸?shù)臏?zhǔn)備。當(dāng)從設(shè)備發(fā)出TRDY#信號(hào),表明最后一次數(shù)據(jù)傳輸已經(jīng)完成,接口轉(zhuǎn)入空閑狀態(tài),此時(shí)FRAME#和IRDY#均被撤消。
對(duì)于PCI總線的傳輸,可總結(jié)出以下幾條規(guī)則:????
? ?①FRAME#和IRDY#決定總線的忙/閑狀態(tài)。當(dāng)其中一個(gè)有效時(shí),表示總線忙;兩個(gè)都無效時(shí),總線進(jìn)入空閑狀態(tài)。?
? ?②一旦FRAME#被置為無效,在同一傳輸期間不能重新置為有效。?
? ?③除非設(shè)置IRDY#,一般情況下不能設(shè)置FRAME#無效(在FRAME#無效后的第一個(gè)時(shí)鐘沿IRDY#必須保持有效)。?
④一旦主設(shè)備已使IRDY#有效,在當(dāng)前數(shù)據(jù)相位完成前,不能改變IRDY#或FRAME#的狀態(tài)。?
⑤在完成最后一個(gè)數(shù)據(jù)相位之后的時(shí)鐘周期主設(shè)備必須使IRDY#無效。
?
3、PCI總線的尋址
? ?PCI總線定義了三種物理地址空間:內(nèi)存地址空間、I/O地址空間及配置地址空間,前兩種為通常意義的地址空間,第三種配置地址空間用以支持PCI的硬件配置。?
? ?PCI總線的地址譯碼是分散的,每個(gè)設(shè)備都有自己的地址譯碼邏輯,從而省去了中央譯碼邏輯。PCI支持對(duì)地址的正向譯碼和負(fù)向譯碼,所謂正向譯碼,是指總線上每個(gè)設(shè)備都監(jiān)視地址總線上的訪問地址,判斷是否落在自己的地址范圍內(nèi),譯碼速度較快。所謂負(fù)向譯碼,是指要接受未被其他設(shè)備在正向譯碼中接受的所有訪問,因此,此種譯碼方式只能由總線上的一個(gè)設(shè)備來實(shí)現(xiàn)(一般是連接標(biāo)準(zhǔn)擴(kuò)展總線的橋)。由于它要等到總線上其他所有設(shè)備都拒絕之后才能動(dòng)作,所以速度較慢。負(fù)向譯碼對(duì)于標(biāo)準(zhǔn)擴(kuò)展總線上地址空間零散的設(shè)備是很有用的。正向和反向譯碼設(shè)備都不對(duì)保留的總線命令發(fā)出DEVSEL響應(yīng)信號(hào)。
?
(1)、I/O地址空間
? ?在I/O地址空間,全部32位AD線都被用來提供一個(gè)完整的地址編碼(字節(jié)地址),使得要求地址精確一級(jí)的設(shè)備不需多等一個(gè)周期就可完成地址譯碼(產(chǎn)生信號(hào)),也使負(fù)向地址譯碼節(jié)省了一個(gè)時(shí)鐘在I/O訪問中,?AD0~AD1這兩位很重要,并要與C/BE0~3配合,才能進(jìn)行一次有效的訪問。下表表示了AD[1~0]和初始數(shù)據(jù)相位中字節(jié)允許的有效組合。
表1 字節(jié)允許和AD[1~0]的編碼
| AD[1~0] | 起始字節(jié) | 有效的C/BE0~3的組合 |
| 00 | 字節(jié)0 | XXX0或1111 |
| 01 | 字節(jié)1 | XX01或1111 |
| 10 | 字節(jié)2 | X011或1111 |
| 11 | 字節(jié)3 | 0111或1111 |
?
(2)、內(nèi)存地址空間
? 在存儲(chǔ)器訪問中,所有的目標(biāo)設(shè)備都要檢查AD0~AD1,要么提供所要求的突發(fā)傳輸順序,或者執(zhí)行預(yù)備斷開操作。對(duì)于所有支持突發(fā)傳輸?shù)脑O(shè)備都應(yīng)能實(shí)現(xiàn)線性突發(fā)性傳輸順序,而高速緩存的行切換不一定是存儲(chǔ)器地址空間,用AD2~AD31譯碼得到一個(gè)雙字地址的訪問,而AD[1—0]不參與地址譯碼,用來指明主設(shè)備要求的數(shù)據(jù)傳輸順序。
表2 猝發(fā)順序編碼
| AD1 | AD0 | 猝發(fā)順序 |
| 0 | 0 | 線性增加方式 |
| 0 | 1 | 保留(在第一個(gè)數(shù)據(jù)相位后解除連接) |
| 1 | 0 | Cache行回卷(wrap)模式 |
| 1 | 1 | 保留(在第一個(gè)數(shù)據(jù)相位后解除連接) |
?
? ?如上表所示,在線性增加模式下,每個(gè)數(shù)據(jù)相位后,地址增加一個(gè)雙字(即加4,對(duì)32位傳輸)或增加兩個(gè)雙字(即加8,對(duì)64位傳輸),直到傳輸結(jié)束。對(duì)于Cache行回卷(warp)模式,傳輸可從Cache中任意地址偏移處開始,Cache塊的長(zhǎng)度是由配置空間中的Cache塊大小寄存器定義的。訪問過程中每次地址增加一個(gè)雙字(64位傳輸中地址增加兩個(gè)雙字),一直到Cache塊的末尾,然后回卷到同一Cache塊的開始處,再進(jìn)行到Cache塊的剩余部分被傳送完為止。
(3)、配置地址空間
? ?在配置的地址空間中,要用AD2~AD7將訪問落實(shí)到一個(gè)DWORD地址,尋址64個(gè)雙字寄存器。當(dāng)一個(gè)設(shè)備收到配置命令,這條配置命令地址被譯碼,IDSEL信號(hào)成立且AD0AD1為00,設(shè)備判斷是否尋址自己的配置寄存器,如果是則該設(shè)備即被選為訪問的目標(biāo),若不是就不參與當(dāng)前的對(duì)話。如果譯碼出來符合某橋路的編號(hào),且AD0AD1為01,則說明配置訪問是對(duì)該橋后面的設(shè)備,即不與橋直接連接的設(shè)備。
(4)、字節(jié)校正??
? ?用字節(jié)使能信號(hào)C/BE0~3來指出哪些字節(jié)帶了有意義的數(shù)據(jù),在每個(gè)數(shù)據(jù)周期內(nèi),可以自由改變字節(jié)使能,使之對(duì)傳輸數(shù)據(jù)的實(shí)際含義和有效部分進(jìn)行界定,這一功能稱作字節(jié)校正或字節(jié)對(duì)齊。????
?
(5)、總線的驅(qū)動(dòng)與過渡??
? ?為了避免多個(gè)設(shè)備同時(shí)驅(qū)動(dòng)一個(gè)信號(hào)到PCI總線上而產(chǎn)生競(jìng)爭(zhēng),在一個(gè)設(shè)備驅(qū)動(dòng)到另?一個(gè)設(shè)備之間設(shè)一個(gè)過渡期,又稱為交換周期。在時(shí)序圖上,交換期用"→←"來表示。
在每個(gè)地址周期和數(shù)據(jù)周期,所有的AD線都必須被驅(qū)動(dòng)到穩(wěn)定的狀態(tài)(數(shù)據(jù)),即使是在當(dāng)前數(shù)據(jù)傳涉及到的字節(jié)所對(duì)應(yīng)的AD線也不例外。在實(shí)際應(yīng)用中,如果對(duì)功耗要求較高時(shí),為盡量減少由于總線上信息所造成的功耗,對(duì)當(dāng)前總線周期中不用的字節(jié)與前一周期相同的數(shù)據(jù)去驅(qū)動(dòng)它們。
?
4、PCI總線的數(shù)據(jù)傳輸過程
? ?PCI采用地址/數(shù)據(jù)復(fù)用技術(shù),每一個(gè)PCI總線傳送由一個(gè)地址相位和一個(gè)或多個(gè)數(shù)據(jù)相位組成。地址相位由FRAME#變?yōu)橛行У臅r(shí)鐘周期開始。在地址相位,總線主設(shè)備通過C/BE[3~0]#發(fā)送總線命令。如果是總線讀命令,在地址相位后需要一個(gè)交換周期,該周期過后,AD[3l~0]改由從設(shè)備驅(qū)動(dòng),以接納從設(shè)備的數(shù)據(jù)。對(duì)于寫操作沒有過渡期,直接從地址相位進(jìn)入數(shù)據(jù)相位。數(shù)據(jù)相位的個(gè)數(shù)取決于要傳送的數(shù)據(jù)個(gè)數(shù),一個(gè)數(shù)據(jù)相位至少需要一個(gè)PCI時(shí)鐘周期,在任何一個(gè)數(shù)據(jù)相位都可以插入等待周期。FRAME#從有效變成無效表示當(dāng)前正處于最后一個(gè)數(shù)據(jù)相位。?
? ?總線操作結(jié)束有多種方式。在大多數(shù)情況下,由從設(shè)備和主設(shè)備共同撤消準(zhǔn)備就緒信號(hào)TRDY#和IRDY#。如果從設(shè)備不能繼續(xù)傳送,可以設(shè)置STOP#信號(hào),表示從設(shè)備撤消與總線的連接。所尋址的從設(shè)備不存在或者DEVSEL#信號(hào)一直為無效狀態(tài)都可能導(dǎo)致主設(shè)備結(jié)束當(dāng)前總線操作,使FRAME#和IRDY#變?yōu)闊o效,回到總線空閑狀態(tài)。
?
(1)、總線上的讀操作
? ?圖2表示PCI總線讀操作時(shí)序的一個(gè)例子,從中可以看出,一旦FRAME#信號(hào)有效,地址相位便開始,并在時(shí)鐘2的上升沿處穩(wěn)定有效。在地址相位內(nèi),AD[31~00]上包含有效地址,C/BE#[3~0]上包含一個(gè)有效的總線命令。由于是對(duì)數(shù)據(jù)進(jìn)行讀取,因而要先插入一個(gè)等待周期,數(shù)據(jù)相位是從時(shí)鐘3的上升沿處開始,AD[31一00]上傳送的是數(shù)據(jù),C/BE#線上的信息用于指定數(shù)據(jù)線上哪些字節(jié)有效(即哪幾個(gè)字節(jié)是當(dāng)前要傳輸?shù)?/span>)。需要強(qiáng)調(diào)的是,無論是讀操作還是后面要講的寫操作,從數(shù)據(jù)相位的開始一直到傳輸完成,C/BE#的輸出緩沖器(或鎖存器)必須始終保持有效狀態(tài)。?圖2中的DEVSEL#信號(hào)和TRDY#信號(hào)由被地址相位內(nèi)所發(fā)地址選中的從設(shè)備提供,但要保證TRDY#在DEVSEL#之后出現(xiàn),IRDY#信號(hào)是發(fā)起讀操作的主設(shè)備根據(jù)總線的占用情況發(fā)出的。數(shù)據(jù)的真正傳輸是在IRDY#和TRDY#同時(shí)有效的時(shí)鐘前沿進(jìn)行的。當(dāng)這兩個(gè)信號(hào)之一無效時(shí),就表示需要插入等待周期,此時(shí),不進(jìn)行數(shù)據(jù)傳輸。這說明一個(gè)數(shù)據(jù)相位可以包含一次數(shù)據(jù)傳輸和若干個(gè)等待周期。圖中所示的時(shí)鐘4、6、8處各進(jìn)行了一次數(shù)據(jù)傳輸,而在時(shí)鐘3、5、7處插入了等待周期。?
? ?在讀操作中的地址相位和數(shù)據(jù)相位之間,AD線上要有一個(gè)總線交換周期,這通過從設(shè)備強(qiáng)制TRDY#實(shí)現(xiàn),即讓TRDY#的發(fā)出比地址晚一拍。在交換周期過后且DEVSEL#信號(hào)變?yōu)橛行r(shí),從設(shè)備必須驅(qū)動(dòng)AD線。?
? ?盡管主設(shè)備在時(shí)鐘7處已知道下一個(gè)數(shù)據(jù)相位是本次傳送的最后一個(gè),但由于某種原因它暫時(shí)不能完成該次傳輸(此時(shí)IRDY#無效),所以主設(shè)備還不能撤消FRAME#,只有在時(shí)鐘8處,IRDY#變?yōu)橛行Ш?#xff0c;FRAME#信號(hào)才能撤消,從而通知從設(shè)備這是最后一個(gè)數(shù)據(jù)相位。
圖2 PCI總線讀操作(2)、總線上的寫操作
? ?圖3是PCI總線寫操作時(shí)序的一個(gè)例子。從中可以看出,總線上的寫操作與讀操作相類似,也是FRAME#的有效表示寫操作周期中地址相位的開始,但地址相位后不需要交換周期,因?yàn)閿?shù)據(jù)和地址都是由同一主設(shè)備提供的。在圖3中,第一個(gè)和第二個(gè)數(shù)據(jù)相位中沒有等待周期,而在第三個(gè)數(shù)據(jù)相位中連續(xù)插入了3個(gè)等待周期,注意,第一個(gè)等待周期是由傳輸雙方共同引起的。告訴從設(shè)備最后一個(gè)數(shù)據(jù)相位的方法與讀操作時(shí)相同,即當(dāng)FRAME#撤消后,還需要IRDY#處于有效狀態(tài)。這里,主設(shè)備在時(shí)鐘6處使IRDY#恢復(fù)有效,通知從設(shè)備這是最后一個(gè)數(shù)據(jù)相位,但由于從設(shè)備未準(zhǔn)備好,最后一次數(shù)據(jù)傳輸?shù)綍r(shí)鐘8才完成。
? ?從圖中AD和C/BE#的波形可看出,主設(shè)備發(fā)送數(shù)據(jù)可以延遲,但字節(jié)允許信號(hào)不受等待周期的影響,不得延遲發(fā)送。?
? ?上述的讀/寫操作均是以多個(gè)數(shù)據(jù)相位為例來說明的。如果是一個(gè)數(shù)據(jù)相位,?FRAME#信號(hào)在沒有等待周期的情況下,應(yīng)在地址相位(讀操作應(yīng)在交換周期)過后即撤消。對(duì)于一個(gè)數(shù)據(jù)相位,中間亦可插入等待周期。
圖3 PCI總線寫操作(3)、PCI總線傳輸?shù)慕K止過程?
? 無論是主設(shè)備還是從設(shè)備,都可以提出終止傳輸?shù)囊?#xff0c;但不一定得到響應(yīng)。也就是說,主從設(shè)備雙方均無權(quán)單方面終止傳輸,而需要相互配合,但傳輸?shù)淖罱K停止控制要由主設(shè)備完成。?
? ?①由主設(shè)備引發(fā)的終止?
? ?主設(shè)備是通過撤消FRAME#并建立IRDY#來提出終止請(qǐng)求的,這樣做是為了通知從設(shè)備,現(xiàn)在己進(jìn)入了傳輸周期中最后一個(gè)數(shù)據(jù)相位。此后,IRDY#一直保持有效直到TRDY#信號(hào)有效,完成最后一個(gè)數(shù)據(jù)的傳輸。接著便撤消IRDY#,從而達(dá)到完全終止的條件(FRAME#和IRDY#同時(shí)無效),結(jié)束傳輸,進(jìn)入總線空閑狀態(tài)。
主設(shè)備一般在下列情況下會(huì)提出終止傳輸:?
? ?a一次數(shù)據(jù)傳輸即將結(jié)束(剩下一個(gè)數(shù)據(jù)未傳輸)。????
? ?b總線上有更高優(yōu)先級(jí)的總線占用請(qǐng)求,而總線仲裁器取消當(dāng)前主設(shè)備的總線控制權(quán)(移去了GNT#信號(hào))。?
? ?c主設(shè)備發(fā)出了FRAME#后在規(guī)定的時(shí)間內(nèi)沒有檢測(cè)到目標(biāo)設(shè)備的DEVSEL#響應(yīng)信號(hào)。
? ?②由從設(shè)備引發(fā)的終止?
? ?從設(shè)備可以通過STOP#信號(hào)請(qǐng)求終止傳輸。一旦STOP#有效,就必須保持有效到主設(shè)備置FRAME#無效。IRDY#和TRDY#之間的關(guān)系與STOP#和FRAME#之間的關(guān)系無關(guān)。所以,在從設(shè)備請(qǐng)求終止期間數(shù)據(jù)仍可以傳送,這僅取決于當(dāng)時(shí)IRDY#和TRDY#的狀態(tài)。?
? ?從設(shè)備可由下面兩種原因請(qǐng)求終止傳輸:?
? ?①?gòu)脑O(shè)備正處于不能傳送數(shù)據(jù)的狀態(tài)。例如,設(shè)備的數(shù)據(jù)緩沖器滿,暫時(shí)不能接收數(shù)據(jù),或者因數(shù)據(jù)緩沖器空而不能發(fā)送數(shù)據(jù)等。待傳送條件滿足后,重新啟動(dòng)傳輸。這種情況稱為“重入(Retry)”。?
? ?②由于從設(shè)備的響應(yīng)速度太慢,在PCI引導(dǎo)時(shí)間長(zhǎng)度(8個(gè)時(shí)鐘周期)不能作出響應(yīng)以及在猝發(fā)傳輸中,從設(shè)備檢測(cè)到下一個(gè)數(shù)據(jù)的地址已經(jīng)超出規(guī)定的范圍等原因而提出終止傳輸請(qǐng)求。此種情況稱為“解除連接(Disconnect)”。
?
總結(jié)
以上是生活随笔為你收集整理的PCI总线协议(一)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux进程基本知识详解
- 下一篇: DataFrame使用pd.sample