工控網首頁
>

應用設計

>

基于PCI總線的高速數據采集卡的設計

基于PCI總線的高速數據采集卡的設計

2015/12/17 9:49:50

一、引言

數據采集是數字信號處理中的重要環節。針對不同任務,數據采集要達到的技術指標也不同。對于瞬態信號、雷達信號和圖象處理都要求幾MB/S甚至幾十MB/S的速度。而目前用于PC機的數據采集卡大部分是基于ISA總線的,其最大缺點是傳輸速度太低,不能實現實時傳輸[1]。PCI總線是一種目前較為流行的、先進的高速同步總線,它的歷史較短,正式的2.2版本于1999年2月發布。其優點在于能夠實現設備間的快速訪問,33MHZ/32位的PCI總線可以實現132MB/S的數據傳輸率,目前已經有66MHZ/64位的PCI總線,傳輸速率更快[2]。PCI是獨立于處理器的同步總線,不需CPU的介入便可進行數據傳輸。此外,還支持突發傳遞、即插即用功能。PCI以其突出的性能備受計算機和通信界的青睞,將取代以往的總線,成為高檔機及高性能工作站外設的基石。

二、數據采集卡的結構及性能

本數據采集卡主要由一個PCI總線控制器(PCI9050)[3],一塊采集控制芯片(MAX7128),以及一個A/D轉換模塊構成,其具體的結構框圖如圖1所示。該數據采集卡的性能可以達到每秒采樣20M個樣本,A/D字長為8位,數據傳輸率在20MB/S以上,這對以往基于ISA總線的數據采集系統來說,根本無法實現。

圖中粗線表示數據/地址總線,細線表示控制線。前端信號經過提取、放大后,進入A/D;在CPLD控制下,高速A/D芯片將模擬信號轉為數字信號,并將數據輸出,存儲在雙口RAM中;當一組數據存儲完畢后,由CPLD通過PCI控制芯片向主機申請中斷,主機響應中斷后通過PCI控制芯片直接讀取RAM中的數據。

三、數據采集卡的設計方案

1、PCI總線控制器的實現

由于PCI總線協議的復雜度較高,其接口電路實現起來相對困難。因此,目前主要有兩種方案來實現PCI總線的控制:一種是采用專用的PCI接口芯片;另一種是用可嵌入PLD中的IP核。前者由于芯片本身已完成大部分PCI協議,不需設計者精通PCI協議的各種細節,開發周期短,但系統集成度較低,并且費用稍高;后者需要設計者根據PCI協議自己設計接口邏輯,要求設計人員完全掌握PCI協議,設計的難度相對較大,但由于可將PCI接口邏輯與用戶邏輯集成在一片PLD中,提高了電路板的集成度和系統的性能。根據設計需求和實際情況,我們最終選擇了第一種方式,采用了PLX公司的PLX9050作為PCI總線控制器,它即能滿足設計需要,并且價格較低。

PLX9050是PLX公司推出的用于低成本適配器的PCI總線目標接口芯片,支持32位、33MHZ的PCI總線規范。它提供用于適配卡的小型而高性能的PCI總線目標接口,主要功能與性能如下:

(1)符合PCI2.1規范,接口芯片支持低成本從屬適配器;

(2)五個本地總線地址空間和四個片選信號

(3)支持復用和非復用8位、16位和32位通用本地總線;

(4)串行EEPROM用于裝載配置信息;

(5)可將兩個來自本地總線的中斷轉換成PCI中斷;

(6)支持本地總線與PCI總線時鐘異步運行。

本設計方案采用了非復用方式(C模式),8位本地總線,兩個地址空間,一個本地中斷,接口電路的設計很簡單,在此不作具體介紹。

如果不用PCI9050的默認配置(大多數情況不用),設計者需要對其進行配置。配置數據預先燒入EEPROM中,上電后PCI9050自動裝入。PCI9050的配置寄存器分為兩類。一類是PCI配置寄存器,另一類是本地配置寄存器。PCI配置寄存器配置PCI9050的PCI總線接口方面的屬性,根據文檔說明進行配置即可。本地配置寄存器配置PCI9050的本地總線接口的屬性,由21個雙字配置寄存器組成,要根據實際開發的硬件板卡的硬件資源進行配置。本地配置寄存器共分六類:本地地址空間范圍寄存器(LASxRR)和擴展ROM范圍寄存器、本地地址空間的本地基地址寄存器(重新映射寄存器LASxBA)、本地地址空間總線屬性描述寄存器(LASxBRD)、片選基地址寄存器類(CSxBASE)、中斷控制寄存器、混合控制寄存器。在編寫配置EEPROM時,要注意各屬性寄存器和控制寄存器的設置不要前后矛盾,地址范圍和基址寄存器的設置要符合要求。在設計中,用了兩個空間,一個為存貯器空間(對應雙口RAM),一個為I/O空間(用于主機對采集卡的控制)。

下面以本地地址空間1為例說明將本地地址總線映射到PCI總線的過程。首先設置LAS3RR,初始化時PCI9050芯片將從EEPROM中讀出此值,放入PCI基地址寄存器5中,主機先寫入FFFFFFFFH后,再讀回其值,為1的位表示需要分配地址。例如當LAS3RR的內容為FFF00000H時,PCI總線給本地地址空間3分配的PCI基地址可能是12300000H(此值是隨機的)。該例中內存區域的大小是1M。接下來設置LAS3BA,即填入PCI地址12300000H對應的本地總線地址。例如若填入04000001H。表明PCI總線上對PCI地址12300000H的訪問亦即對本地地址04000000H的訪問(注意C模式時最多只有28條地址線,J模式時可以有32位)。然后設置對應的片選寄存器3,以便當PCI總線對本地總線地址空間3的地址進行訪問時,片選信號3有效。其值設為04080001H,表示片選3的基地址是04080000H,其地址范圍計算:基地址第一個不是零的位前面有19個零,則范圍是2的19次冪再乘以2。這樣當PCI的訪問地址落入片選3寄存器定義的范圍內時,片選3信號CS3#有效,用來選擇本地總線上的外圍設備。最后配置本地地址空間3的本地總線描述寄存器,具體請查看相應參考文檔。

2、CPLD的內部邏輯設計

CPLD中集成了DMA控制器、PCI局部總線及A/D控制等功能,是設計中的重點。設計中選用ALTERA的EPM7128芯片,其內部邏輯框圖如圖2所示。其中,9050接口主要完成與PCI總線的握手,例如根據9050的時序要求產生相應的響應信號、當一組數據寫入完畢后產生中斷請求信號等;時鐘部分用于產生片內各種時鐘信號;控制部分主要根據主機命令開啟(關閉)A/D及對CPLD片內其它部分進行控制;DMA控制器的關鍵部分是地址控制器,寫入RAM時地址控制器根據A/D頻率產生遞增的RAM地址,另外還有RAM片選信號等其它必要的邏輯。

主機通過向本地I/O空間的特定地址單元寫入特定值來發出啟動命令,控制部分使A/D相應引腳置有效,以啟動A/D。A/D數據線上數據有效的同時,DMA控制器輸出RAM寫地址和RAM片選信號,將數據存入RAM。當RAM地址大于特定值(此值小于RAM容量)時,PCI局部總線部分產生LINT信號,申請中斷。同時,A/D仍繼續按地址遞增方式將變換后數據存入RAM,當RAM寫地址為最高有效地址后,地址控制器歸零,重新向RAM低地址寫入數據。由于PCI總線速度比A/D變換速度快,不會出現未讀數據被覆蓋的情況。主機收到中斷信號后,進入中斷處理程序,從低地址開始讀取數據采集卡上的RAM。PLX9050的數據線/地址線與RAM的數據線/地址線直接相連,讀寫控制線與CPLD相連,中斷過程中,CPLD根據邏輯產生控制信號, PLX9050直接讀RAM中的數據。

四、驅動程序的開發

在WINDOWS系統下,外設欲與主機進行數據交換,必須有自己的設備驅動程序。設備驅動程序的編寫,也是對設計者要求較高的一部分[4]。現在比較流行的驅動開發工具有DDK、VtoolsD和WinDriver等,其中WinDriver是專門用于快速開發PCI/ISA設備的驅動程序開發組件。利用它開發設備驅動程序不需要熟悉操作系統的內核,整個驅動程序中的所有函數都是工作在用戶模式下的,通過與WinDriver的.Vxd或.Sys文件交互來達到驅動硬件的目的。WinDriver的主要特征如下:

(1)提供了從用戶層直接訪問硬件的方法;

(2)無需DDK以及核心態驅動程序的開發經驗;

(3)對主流的PCI接口芯片(PLX、AMCC、V3系列)提供了很好的支持;

(4)支持I/O、DMA、中斷處理,支持PCI、ISA、USB、PCMCIA的開發;

(5)對于性能要求特別苛刻的部分通過WinDriver提供的API插入到核心態模式運行,以提高執行效率。

(6)可利用常見的軟件開發平臺(Visual C++、Borland C++、Delphi等);

有兩種利用WinDriver開發驅動程序的方法,現分別介紹如下:

(1)利用WinDriver自帶的WinDriver Wizard分析用戶開發的插卡,看其是否像設計的那樣正常工作,然后自動生成驅動程序的框架代碼 ,修改代碼并加入定制功能,在用戶態執行和調試代碼并將性能要求苛刻的部分插入到核心態。

(2)另一種方法是直接應用WinDriver提供的API函數來編寫驅動程序,實踐證明這種方法比用Wizard生成框架代碼的方法更靈活方便。但要求編程人員對驅動程序的框架有一定的了解。 一般來說,驅動程序的結構如下所示:

a、打開WinDriver設備;

b、查找要訪問的PCI設備;

c、枚舉該設備的資源(內存、I/O、中斷);

d、鎖定該設備的資源;

e、訪問插卡上的資源(讀寫內存、讀寫I/O、響應中斷);

f、解鎖資源;

g、關閉WinDriver設備。

本設計中主要用到中斷調用。在用戶態,理論上WinDriver能夠處理每秒兩萬次的中斷,若所用RAM為1K,則最高數據傳輸速率為20M/B。實際上,中斷處理速度達不到2萬次/秒,可考慮增加RAM容量以提高傳輸速度。也可以考慮將速率要求高的部分插入到核心態運行。

以下是一段使用WinDriver開發的PLX9050的驅動代碼,從中可以看出WinDriver驅動程序的框架結構,只要對其稍作修改就可作為其他PCI卡的一部分。程序中沒有給出變量說明,具體說明請查閱WinDriver的設計文檔。

hWD=WD_open();//打開WinDriver設備,得到一個文件句柄; Pciscan..searchId.dwVenderId=0x10b5;//PLX公司供貨號; Pciscan..searchId.dwDeviceId=0x9050;//PXL9050的設備號; WD_PCIScanCards(hWD,&Pciscan)//檢測PCI插槽上的設備; PciSlot=Pciscan.cardslot[0];//將插卡的地址傳遞給變量PCICardInfo來 PCICardInfo.pcislot=PciSlot;//檢測卡上的資源信息; WD_PciGetCardInfo(hWD,&PciCardInfo);//檢測卡上的資源信息; Card=PciCardInfo.card; Cardreg.card=Card; WD_CardRegister(hWD,&Cardreg);//向系統登記檢測到的資源信息; Item=Card.Item[0];//將卡上的0號資源賦給變量Item; If (Item.item==ITEM_MEMORY) RegAddress=Item.I.Mem.dwTrans.Addr;//得到PCI卡上的內存映射到用戶態的地址; Trans.dwport=RegAddress; Trans.CmdTrans=RM_B;//設為內存字節讀命令; Trans.fAutoinc=True; WD_Transfer(hWD,&Trans)//進行數據傳遞; WD_CardUnregister(hWD,&Cardreg)//釋放注冊到的資源; WD_Close(hWD)//關閉WinDriver設備  

五、結束語

現在A/D芯片的采樣速率可達幾百兆次/秒,數據采集的速度取決于與計算機的接口和設備驅動程序的編寫。雖然PCI9050具有簡單的用戶接口和低廉的價格,不失為低成本PCI接口控制芯片的較佳選擇,但仍會成為超高速數據采集卡瓶頸。PCI9030是PLX公司最新推出的PCI芯片,與PCI9050具有相似的結構,支持高達66MHZ的局部總線時鐘,將能滿足超高速的需要。利用Windriver編寫的設備驅動,不是真正的核心態程序,效率不是太高,對于超高速外設,可以考慮用微軟的DDK編寫高效的核心態程序。總之,利用PCI總線的高速特性實時傳輸和存貯采集數據,有效的解決了數據傳輸和處理的實時性。PCI總線可以滿足從高速到超高速不同等級數據采集卡的需要,基于PCI總線的數據采集系統有很大的發展空間,十分廣闊的前景。  

投訴建議

提交

查看更多評論
其他資訊

查看更多

超越傳統直覺,MATLAB/Simulink助力重型機械的智能化轉型

新大陸自動識別精彩亮相2024華南國際工業博覽會

派拓網絡被Forrester評為XDR領域領導者

智能工控,存儲強基 | 海康威視帶來精彩主題演講

展會|Lubeworks路博流體供料系統精彩亮相AMTS展會