如何用雙端口RAM實現(xiàn)與PCI總線接口的數(shù)據(jù)通訊?
采用雙端口RAM實現(xiàn)DSP與PCI總線芯片之間的數(shù)據(jù)交換接口電路。
提出了一種使用CPLD解決雙端口RAM地址譯碼和PCI接口芯片局部總線仲裁的的硬件設計方案,并給出了PCI總線接口芯片寄存器配置實例,介紹了軟件包WinDriver開發(fā)設備驅動程序的具體過程。
隨著計算機技術的不斷發(fā)展,為滿足外設間以及外設與主機間的高速數(shù)據(jù)傳輸,Intel公司于1991年提出了PCI總線概念。PCI總線是一種能為主CPU及外設提供高性能數(shù)據(jù)通訊的總線,其局部總線在33MHz總線時鐘、32位數(shù)據(jù)通路時,數(shù)據(jù)傳輸速率最高可達133Mbps。實際應用中,可通過PCI總線實現(xiàn)主機與外部設備的高速數(shù)據(jù)傳輸,有效解決數(shù)據(jù)的實時傳輸和存儲問題,為信號的實時處理打下良好基礎。
本文主要提供一種基于PCI總線的數(shù)據(jù)傳輸系統(tǒng)設計方案,其中雙口RAM起橋梁作用,完成上位機與外圍主控單元之間的數(shù)據(jù)握手。
1 雙端口RAM實現(xiàn)PCI總線接口方案
本系統(tǒng)主要用于解決上位機與外圍控制單元的數(shù)據(jù)傳輸問題。上位機運行信息診斷程序,通過PCI總線與外圍控制單元以一定速率傳輸數(shù)據(jù),在主機中實時監(jiān)控并保存數(shù)據(jù)。由于實現(xiàn)高速實時數(shù)據(jù)傳輸,數(shù)據(jù)量大,所以在PCI局部總線上插入一個高速雙端口RAM。雙端口RAM一端作為PCI總線接口的本地端存儲器,一端作為DSP目標存儲器。需要傳輸保存的數(shù)據(jù)經(jīng)DSP處理后借助雙端口RAM和PCI總線接口完成了上位機與DSP的數(shù)據(jù)握手。本文提出的雙端口RAM實現(xiàn)PCI總線接口方案如圖1。
考慮到PCI總線接口對局部總線的控制時序比較復雜,需要譯碼和控制電路來實現(xiàn)局部總線的訪問及控制。本系統(tǒng)使用CPLD解決雙口RAM的地址訪問競爭沖突問題。需解決的主要問題有:①PCI接口電路設計;②CPLD地址譯碼和總線仲裁;③PCI總線驅動程序開發(fā)。
2 PCI接口電路設計
PCI卡的設計一般采用兩種方案。一種是根據(jù)PCI協(xié)議在FPGA或CPLD中實現(xiàn)PCI總線接口控制器,但是由于PCI協(xié)議的復雜性,使得開發(fā)難度大、周期長;另一種使用現(xiàn)成的PCI接口芯片,用戶開發(fā)難度降低,只把重點放在PCI接口芯片局部總線的接口設計和PCI總線配置空間的初始化,而不用速度考慮PCI總線規(guī)范上眾多的協(xié)議規(guī)范,加快了開發(fā)時間。
本數(shù)據(jù)傳輸系統(tǒng)使用PLX公司的PCI 9030總線接口芯片,以CPLD完成邏輯控制及與外設的連接,整個系統(tǒng)的硬件框圖如圖 2。其中雙端口RAM采用IDT71V321,CPLD選用XILINX公司的XC9536CPLD芯片,EEPROM選用NS公司的93CS56,控制單元DSP選用TMS 320LF2407A。
2.1 PCI 9030內(nèi)部結構及其數(shù)據(jù)傳輸
PCI 9030是PLX公司開發(fā)的PCI總線目標接口芯片。其特點:低功耗,PQFP176針封裝,符合PCI V2.2規(guī)范;在PCI總線上是從設備,但在局部總線上是主設備;PCI 9030支持突發(fā)傳輸,有5個PCI總線到局部總線地址空間,9個可編程的通用I/O,4個可編程的片選,支持熱插拔。PCI 9030主要由PCI總線接口邏輯、局部總線接口邏輯、串行E2PROM接口邏輯和內(nèi)部邏輯組成,結構框圖見圖3。
PCI 9030支持PCI主設備直接訪問局部總線上的設備,數(shù)據(jù)傳輸方式分為內(nèi)存映射的突發(fā)傳輸和I/O映射的單次傳輸,并且由PCI基址寄存器設置在PCI內(nèi)存和I/O空間中的合適位置,另外局部映射寄存器允許PCI地址空間轉換到局部地址空間。
2.2 配置實例
系統(tǒng)訪問的雙口RAM存儲空間為2KB,要求將這個存儲器空間映射到局部地址空間0,采用內(nèi)存方式映射,存儲器的數(shù)據(jù)寬度為 8位,并且不采用突發(fā)傳輸,讀寫時不可預取。下面介紹這個地址空間各個寄存器的具體配置過程。
(1)配置地址范圍寄存器
根據(jù)PCI配置寄存器與LAS0RR的對應關系以及雙口RAM的地址空間800H,取7FFH的補碼得到FFFFF800H。又因為按照設計要求,要映射到內(nèi)存空間的任何位置并且設置為不可預取的,這樣LASORR寄存器后3位應該為000H。所以LAS0RR的值應該最終確定為FFFFF800H。
(2)配置基址寄存器
該寄存器的基址必須是地址空間范圍的整數(shù)倍,在本例中必須是2K的整數(shù)倍,可將基地址定為 00004000H,又由于基址寄存器位0為空間使能位,所以應將這一位設置1;至于位 2、位3,由于是映射到內(nèi)存空間,設為00H即可。所以LAS0BA的值最終被確定為00004001H。
(3)配置片選信號控制寄存器
該寄存器的地址范圍和基地址必須與LAS0RR或LAS0BA所定義 的范圍和空間相對應??筛鶕?jù)PCI 9030提供的配置寄存器的方法確定CS0BASE的數(shù)值:板卡的2KB空間可以用十六進制表示為800H,將800H右移一位得到400H,然后將基地址加到400H左邊的任何一位中。因為所采用的基地址為00004000H,所以得到的值為00004400H;又因為第1位為片選使能位,應該設置為1。所以最終確定的數(shù)值為00004401H。
由于局部總線采用8位的寬度,將工作方式定義在不使能突發(fā),不預取,配置總線區(qū)域描述寄存器的數(shù)值確定為400140A2H。另外,還要根據(jù)要求設置CNTRL寄存器控制PCI 9030的工作狀態(tài),確定為18784500H。當所有這些數(shù)據(jù)都配置完成后,便可將這些數(shù)據(jù)按照加載順序寫入串行E2PROM中,從而完成整個系統(tǒng)的配置。
通過這幾個寄存器的配置,一個局部地址空間便可以確定下來。在系統(tǒng)上電后,系統(tǒng)BIOS根據(jù)這幾個寄存器的內(nèi)容將板卡上2KB的RAM空間重映射到PCI空間中,使主機可以像訪問自己的地址空間一樣訪問板卡上的RAM。
2.3 CPLD控制邏輯
對于雙口RAM同一個地址單元,不能同時進行讀或寫操作,但兩邊連接的主控芯片,都可以對其進行讀、寫操作,因此必須解決地址競爭問題。本系統(tǒng)中,使用XILINX公司的XC9536CPLD芯片完成PCI局部總線的譯碼和控制電路。由于系統(tǒng)控制計算主要在DSP中完成,上位機只起監(jiān)控和數(shù)據(jù)保存作用,因此規(guī)定對雙口RAM的操作DSP優(yōu)先于PCI 9030;同時CPLD也參與了DSP片外程序存儲器Flash和數(shù)據(jù)存儲器RAM的地址譯碼,控制邏輯用公式表示為:[!--empirenews.page--]
3 設備驅動程序設計
設備驅動程序開發(fā)工具通常有DDK、VtoolsD、WinDrvr等。為加快開發(fā)速度,采用JUNDO公司的WinDrvr開發(fā)設備驅動程序。其使用簡單,支持多種操作系統(tǒng)。
采用Windrvr開發(fā)PCI橋接設備的驅動程序有兩種方法。一種Wizard開發(fā)向導是自動生成驅動程序框架代碼,然后根據(jù)實際需要,加入定制功能。這種方法生成的代碼較多,程序較復雜。另一種是在Vc++創(chuàng)建工程中直接利用Windrvr的API函數(shù)生成驅動程序,比在Wizard生成的框架代碼上修改更為靈活。本文采用后一種方法。以下是用Windrvr開發(fā)PCI9030橋芯片的驅動代碼,只要稍加改動就可以作為其他PCI芯片驅動程序的一部分,例如PCI9050、PCI9052等。程序中出現(xiàn)的變量名都由其名稱反映含義,具體可以參見Windrvr設計文檔說明。
至此獲得了本地端映射到用戶的內(nèi)存地址,調(diào)用讀寫函數(shù)就可以對本地芯片進行操作。