??? 摘? 要:研究了基于PCI/cPCI總線的多通道DMA傳輸系統(tǒng),分析了實(shí)現(xiàn)多個(gè)DMA傳輸通道" title="傳輸通道">傳輸通道的方法;以PCI9054為PCI主橋、個(gè)人計(jì)算機(jī)為開發(fā)環(huán)境,詳細(xì)分析了多通道數(shù)據(jù)采集" title="數(shù)據(jù)采集">數(shù)據(jù)采集卡中不同通道的訪問策略,給出了接口電路的實(shí)現(xiàn)結(jié)構(gòu),討論了不同DMA傳輸方式" title="傳輸方式">傳輸方式的性能和應(yīng)用環(huán)境。?
??? 關(guān)鍵詞: PCI總線? DMA控制器? 突發(fā)傳輸? 數(shù)據(jù)采集
?
??? PCI/cPCI總線是一種獨(dú)立于CPU的局部總線,由于支持突發(fā)傳輸操作,其總線傳輸吞吐量為132MB/s(33bit,33MHz),已經(jīng)被廣泛應(yīng)用于個(gè)人計(jì)算機(jī)。但是,在x86結(jié)構(gòu)CPU的個(gè)人計(jì)算機(jī)下,由主CPU發(fā)起讀操作訪問PCI目標(biāo)設(shè)備時(shí),不能進(jìn)行突發(fā)讀操作。這是由于個(gè)人計(jì)算機(jī)啟動(dòng)時(shí)BIOS將PCI設(shè)備映射到非Cache存儲(chǔ)器中,會(huì)出現(xiàn)讀操作阻塞。對于突發(fā)寫操作,也存在同樣的問題。也就是說在PC環(huán)境下開發(fā)基于PCI的產(chǎn)品,PC機(jī)不支持突發(fā)傳輸。為了獲得高的數(shù)據(jù)傳輸量,就必須使用PCI主橋設(shè)計(jì)PC卡,并在DMA模式下操作。高傳輸性能的PCI總線主設(shè)備有很多,如PLX公司的PCI9054。本文以多通道高速數(shù)據(jù)系統(tǒng)的設(shè)計(jì)為例,說明PCI9054實(shí)現(xiàn)多通道DMA傳輸?shù)膽?yīng)用。?
1 PCI總線控制器的DMA傳輸?
??? PCI9054集成了兩個(gè)互相獨(dú)立的DMA通道,每個(gè)通道都支持Block DMA和Scatter/Gather DMA。其中通道0還支持請求(Demand)DMA傳輸方式。由于PCI9054的兩個(gè)DMA通道都是由DMA控制器和專用的雙向FIFO組成,當(dāng)每個(gè)通道進(jìn)行DMA傳輸時(shí),它對于PCI總線和本地總線都是主設(shè)備。即DMA控制器將發(fā)起對本地總線和PCI總線操作,其過程如圖1所示。?
?

?
??? 如果要求從本地空間傳輸數(shù)據(jù)到PCI空間,PCI9054首先對本地總線執(zhí)行讀操作。在本地總線上可能有其它設(shè)備訪問本地總線,因此PCI9054需申請獲得本地總線訪問權(quán)。當(dāng)PCI9054獲得訪問權(quán)后,將本地?cái)?shù)據(jù)讀入PCI9054的FIFO中。與此同時(shí),PCI9054將向PCI總線仲裁器申請PCI總線訪問權(quán),將數(shù)據(jù)從FIFO寫到PCI總線空間。一旦DMA傳輸完成,PCI9054設(shè)定DMA“傳輸結(jié)束位”結(jié)束傳輸。如果設(shè)置中斷允許,PCI9054將根據(jù)設(shè)置向PCI總線或本地輸出中斷。同樣可將數(shù)據(jù)從PCI傳輸?shù)奖镜乜偩€空間。?
??? 雖然PCI9054的雙獨(dú)立DMA通道提供了靈活的優(yōu)先方案,支持多種傳輸模式" title="傳輸模式">傳輸模式,但在很多實(shí)際應(yīng)用中需多個(gè)DMA傳輸通道,必須根據(jù)不同應(yīng)用采用不同的策略。?
2 基于塊傳輸模式的多通道數(shù)據(jù)采集系統(tǒng)設(shè)計(jì)?
??? 塊傳輸是一種相對簡單的DMA傳輸模式。其操作是將本地總線存儲(chǔ)器中的數(shù)據(jù)傳輸?shù)紿OST內(nèi)存中,或?qū)OST內(nèi)存中的數(shù)據(jù)傳輸?shù)奖镜乜偩€上的存儲(chǔ)空間。在傳輸之前,HOST處理器設(shè)置DMA寄存器中本地和PCI空間起始地址、傳輸字節(jié)數(shù)、傳輸方向,然后HOST處理器設(shè)置DMA開始位,啟動(dòng)DMA并按配置的信息傳輸。
??? 四通道數(shù)據(jù)采集系統(tǒng)如圖2所示。系統(tǒng)由4個(gè)輸入通道" title="輸入通道">輸入通道、4個(gè)FIFO以及實(shí)現(xiàn)接口控制邏輯的CPLD組成。由于系統(tǒng)有4個(gè)輸入通道,而PCI9054只有二個(gè)DMA通道,不能滿足輸入通道數(shù)的需要,為此必須進(jìn)行處理。設(shè)計(jì)的關(guān)鍵是建立一個(gè)所有輸入共用的DMA傳輸通道。然而,一個(gè)DMA通道只有一個(gè)本地空間和一個(gè)PCI空間,因此必須將不同通道的地址空間映射到DMA傳輸通道的地址空間中,從而識(shí)別每次傳輸數(shù)據(jù)的輸入通道。圖3給出了不同通道地址空間的映射關(guān)系。當(dāng)數(shù)據(jù)從本地地址空間傳輸?shù)絇CI地址空間時(shí),首先將輸入通道的地址空間映射到本地的DMA訪問空間,DMA控制器將數(shù)據(jù)傳輸?shù)紻MA訪問的PCI空間,然后將PCI空間中的數(shù)據(jù)轉(zhuǎn)移到每個(gè)通道所對應(yīng)的內(nèi)存空間。
?

?

?
??? 輸入通道的存儲(chǔ)空間映射到DMA本地訪問空間是基于DMA訪問的。當(dāng)DMA控制器訪問本地空間時(shí),訪問的地址對4個(gè)通道而言是一樣的,必須給出對不同本地空間的訪問策略。訪問策略可有多種選擇,如優(yōu)先訪問、排隊(duì)訪問、循環(huán)訪問等。圖4給出循環(huán)訪問策略,并在CPLD中實(shí)現(xiàn)。其狀態(tài)變化為:?
??? …→STATE0→STATE1→STATE2→STATE3→STATE0…→?
?

?
??? STATEx表示對本地空間x的操作狀態(tài)。當(dāng)輸入通道FIFOx的請求傳輸信號(hào)FLAGx有效,狀態(tài)機(jī)將停留在STATEx狀態(tài),等待DMA控制器的訪問。當(dāng)計(jì)算機(jī)啟動(dòng)DMA通道時(shí),產(chǎn)生通道選擇信號(hào)CSx,訪問本地空間FIFOx。當(dāng)DMA傳輸結(jié)束后,信號(hào)CSx無效,狀態(tài)轉(zhuǎn)為下一個(gè)狀態(tài)。如果在下一個(gè)狀態(tài)沒有檢測到請求信號(hào),狀態(tài)將轉(zhuǎn)移到該狀態(tài)的下一個(gè)狀態(tài),直到檢測到請求信號(hào)FLAGx有效時(shí),狀態(tài)機(jī)才停留在STATEx狀態(tài),等待DMA控制器訪問。?
??? DMA控制器訪問依賴于數(shù)據(jù)采集通道的請求傳輸信號(hào)FLAGx。如果數(shù)據(jù)采集通道啟動(dòng),將向相應(yīng)通道的FIFO中輸入數(shù)據(jù),一旦FIFO中的數(shù)據(jù)達(dá)到某種程度,設(shè)置請求傳輸信號(hào)。該信號(hào)將從本地中斷信號(hào)LINT#輸入并路由到PCI總線上,計(jì)算機(jī)將接收并響應(yīng)中斷。其中斷響應(yīng)程序流程如圖5所示。計(jì)算機(jī)讀PCI9054內(nèi)部中斷狀態(tài)寄存器,檢測為本地中斷,從CPLD中設(shè)置的狀態(tài)寄存器讀取通道狀態(tài)。然后啟動(dòng)DMA控制器。當(dāng)數(shù)據(jù)傳輸結(jié)束后,PCI9054同樣產(chǎn)生PCI中斷,讀PCI9054內(nèi)部中斷狀態(tài)寄存器,檢測為DMA傳輸結(jié)束,這時(shí)查詢通道狀態(tài)寄存器的值,決定傳輸數(shù)據(jù)的通道,并對數(shù)據(jù)作相應(yīng)的處理,其處理方式依賴于不同的應(yīng)用需要。?
?

?
??? 如果應(yīng)用中需要有選擇性地傳輸輸入通道數(shù)據(jù),假設(shè)選擇通道0、1、3,這時(shí)只須對CPLD中設(shè)置的屏蔽寄存器寫數(shù)據(jù)初始化,即可屏蔽輸入通道2。?
??? 在該設(shè)計(jì)中存在一個(gè)問題:對于一次DMA傳輸,計(jì)算機(jī)需要響應(yīng)兩次中斷,這將增加計(jì)算機(jī)的處理事務(wù)。為此,可以采用PCI9054的DMA通道的請求傳輸方式。利用輸入通道的請求傳輸標(biāo)示信號(hào)產(chǎn)生DMA請求信號(hào)DREQ0#,從而啟動(dòng)DMA傳輸,并產(chǎn)生DACK0#響應(yīng)信號(hào)。當(dāng)數(shù)據(jù)傳輸結(jié)束后,計(jì)算機(jī)響應(yīng)中斷,讀輸入通道狀態(tài)寄存器,判斷傳輸?shù)接?jì)算機(jī)中數(shù)據(jù)的輸入通道。?
3 基于Scatter/Gather傳輸模式的多通道數(shù)據(jù)采集系統(tǒng)設(shè)計(jì)
??? Scatter/Gather(或S/G)DMA傳輸模式是PCI9054的另外一種傳輸模式。其基本方法是將本地總線上或PCI總線上分散的數(shù)據(jù)塊一次性地通過DMA傳輸方式傳輸?shù)絇CI存儲(chǔ)空間或本地存儲(chǔ)空間,不需要多次啟動(dòng)DMA控制器。數(shù)據(jù)采集系統(tǒng)結(jié)構(gòu)如圖2所示,空間映射如圖3。PCI9054的S/G傳輸模式其實(shí)是利用PCI9054內(nèi)部的DMA傳輸通道,建立了一個(gè)虛擬的DMA傳輸,并使用描述模塊建立一個(gè)傳輸鏈,將不同位置上的數(shù)據(jù)塊傳輸連接起來。該描述模塊包括PCI和Local的起始地址、傳輸字節(jié)數(shù)、傳輸方向和下一個(gè)描述模塊的地址。該模塊由HOST處理器在HOST存儲(chǔ)器中建立。然后HOST或本地處理器設(shè)置S/G模式;在PCI9054描述指針寄存器中建立開始描述塊地址。?
??? 當(dāng)本地總線請求傳輸信號(hào)有效時(shí),產(chǎn)生PCI中斷INTA#,PC響應(yīng)中斷,設(shè)置DMA控制器控制位啟動(dòng)傳輸,其傳輸過程如圖6所示。PCI9054根據(jù)開始描述塊地址裝載第一個(gè)描述塊并傳輸該空間的數(shù)據(jù)。當(dāng)?shù)谝粔K數(shù)據(jù)傳輸結(jié)束后,檢測描述鏈結(jié)束位。如果沒有設(shè)置,表明不是最后的塊傳輸,指定下一個(gè)描述模塊的位置,并繼續(xù)裝載描述塊和傳輸數(shù)據(jù),如此重復(fù)直至檢測到描述鏈結(jié)束位被設(shè)置。當(dāng)檢測到鏈結(jié)束狀態(tài)位時(shí),表明PCI9054沒有下一個(gè)數(shù)據(jù)塊傳輸,設(shè)置DMA傳輸結(jié)束狀態(tài)位,表明數(shù)據(jù)傳輸結(jié)束。?
?

?
??? 對于多通道數(shù)據(jù)采集應(yīng)用,假設(shè)每個(gè)輸入通道數(shù)據(jù)采集的速率一樣,那么輸入到每個(gè)通道中FIFO的數(shù)據(jù)是一樣的速率。當(dāng) FIFO中的數(shù)據(jù)達(dá)到一定程度時(shí),產(chǎn)生中斷請求傳輸,計(jì)算機(jī)響應(yīng)中斷,進(jìn)行上述操作。由此可見每次啟動(dòng)DMA傳輸,將4個(gè)數(shù)據(jù)采集通道的數(shù)據(jù)一次傳輸?shù)接?jì)算機(jī)內(nèi)存的不同空間中。當(dāng)然,如果只需傳輸4個(gè)通道中的幾個(gè),如只傳輸通道1、2、4的數(shù)據(jù),那么只用修改塊傳輸描述塊中的參數(shù),重新建立塊傳輸鏈,只傳輸輸入通道1、2、4的數(shù)據(jù),從而屏蔽了輸入通道3。?
??? 該傳輸方式相對塊傳輸模式而言,不用進(jìn)行4次DMA啟動(dòng),減少訪問的開銷,同時(shí)不需要設(shè)計(jì)復(fù)雜的接口電路。由于S/G模式對多塊數(shù)據(jù)傳輸是統(tǒng)一進(jìn)行的,要求輸入通道的數(shù)據(jù)輸入速率一致,或有相對穩(wěn)定的關(guān)系,使每個(gè)塊傳輸?shù)拇笮∠鄬Ψ€(wěn)定。當(dāng)然每個(gè)通道的采樣速率可能不一致,并隨時(shí)需要調(diào)整,這樣就需要相應(yīng)地修改描述塊的參數(shù),使S/G模式操作變得較復(fù)雜。塊傳輸模式可以根據(jù)每個(gè)通道各自請求的傳輸狀態(tài)進(jìn)行傳輸,表現(xiàn)出應(yīng)用的靈活性。?
??? 該設(shè)計(jì)雖然只是針對多通道數(shù)據(jù)采集應(yīng)用,但可以在其它的開發(fā)應(yīng)用中采用,如圖像傳輸可傳輸多個(gè)經(jīng)過壓縮或沒有壓縮的圖像數(shù)據(jù)到計(jì)算機(jī)中存儲(chǔ)或顯示。另外,該設(shè)計(jì)中的數(shù)據(jù)傳輸模式不僅限于個(gè)人計(jì)算機(jī)環(huán)境,還可廣泛應(yīng)用于嵌入式系統(tǒng)中,如多路接入通信系統(tǒng)等。?
參考文獻(xiàn)?
1 PCI9054 Data Book. PLX Technology Inc. 2000?
2 PCI Local Bus Specification,v.2.2. December,1998.
