O 引言
??? 目前市面上有多種數據采集卡,但其應用都具有一定的局限性,不可能完全滿足用戶的需求。本文介紹的數據采集卡可應用于某視頻圖像采集系統中,數據源發送多路同步串行數據,然后經過數據采集卡傳入上位機用以進行后續分析。上位機向外寫控制字并轉換后以異步串行方式輸出。用以控制視頻圖像的采集。本系統將PCI接口邏輯和其他用戶邏輯集成于一片FPGA中,因而大大節省了資源,便于進行串口擴展及其他功能的添加,性能良好,用途廣泛。
1 PCI總線
??? PCI總線是一種高性能的局部總線,具有32位可升級到64位的、獨立于CPU的總線結構。工作頻率為33/66 MHz,最高傳送速度可達132 MB/s(32位、33 MHz)或528 MB/s(64位、66 MHz)。
??? PCI總線定義了Memory(存儲器)空間、I/O(輸入/輸出)空間和配置空間3種地址空間,并具有兩種工作模式:其中主模式下的PCI設備具有總線控制權,可以實現DMA傳輸;而被主設備控制進行通信的稱為從模式(TARGET)。
1.1 PCI總線的配置空間
??? 所有的PCI設備都必須實現配置空間,該空間分為首部區和設備有關區。首部區中的強制性寄存器有:供應商代碼(Vendor ID)寄存器用于標明設備制造商),設備代碼(Device ID)寄存器(用于指明特定的設備,它由供應商分配),版本識別(Revision ID)寄存器,首部類型(He-ader Type)寄存器和類別寄存器(Class Code)。以上五個寄存器均可用于PCI總線上設備的識別。另外,首部區中還有兩種必須實現的寄存器:其中命令寄存器用于存放PCI命令,而設備狀態寄存器則用于記錄PCI的狀態信息。
??? 操作系統在啟動時應判斷系統中有多少存儲器、以及I/O設備需要多少地址空間,然后建立統一的地址映射關系,這時的PCI設備需要用到基地址寄存器。另外,若要實現中斷,還必須設置中斷引腳(Interrupt Pin)寄存器和中斷線(Interrupt Line)寄存器。
1.2 PCI總線的中斷機制
??? PCI總線的硬件中斷方式分為邊沿觸發和電平觸發,PCI設備為低電平觸發(level-sensitive)。PCI總線上有4條中斷請求信號線:INTA ,中斷引腳寄存器的值01H~04H分別對應4條中斷線,單功能PCI設備只能使用INTA#。此外,使用了中斷引腳的設備還必須實現中斷線寄存器。POST例程(加電自檢測程序)在進行系統初始化和配置時還要將中斷線信息寫入該寄存器。PCI總線中斷是可以共享的,這一方面解決了中斷資源緊張的問題,但另一方面也會給PCI中斷的實現帶來麻煩。
2 系統硬件實現
2.1 PCI配置寄存器的設置
??? Altera公司的PCI編譯器(PCI Compiler)提供有使用Altera器件實現PCI接口設計的完全解決方案。其中包括4種PCI接口兆核函數(PCI IP)及相關測試平臺。
??? 通過PCI編譯器的IP工具臺或直接編輯生成的兆核函數頭文件可以設置并修改PCI的配置空間信息,本系統的主要配置信息如下:
?
2.2 PCI T32兆核函數的內部結構及外圍信號
??? PCI Compiler提供的四種PCI IP包括PCI_M64/32、64/32位的主模式接口和PCI_T64/32、64/32位的從模式接口。本系統通過PCI接口與PC機傳輸32位數據,并由上位機應用程序控制系統工作。故該系統工作于32位從模式,即本系統的PCI接口使用PCI_T32模塊來實現,該模塊的內部功能及外圍信號如圖1所示。?
參數配置寄存器(Parameterizde Configuration Registers)是符合PCI規范的所有配置的寄存器,可用于識別設備、控制PCI總線功能、提供PCI總線狀態等,PCI側從模式控制模塊(PCI Target Control)用于控制PCI_T32與PCI總線的各種操作,而用戶側從模式控制模塊(Local Target Control)則用于控制PCI_T32與用戶邏輯的各種操作。
??? PCI_T32上PCI總線一側的信號是符合PCI協議的標準信號,該信號Local側的信號為Altera PCI IP特有的與用戶邏輯接口的信號,起著關鍵作用。其中:
??? l_adi[31:0]為地址/數據輸入信號;
??? l_dato[31:0]為數據輸出信號;
??? l_adro [31:0]為地址輸出信號,讀操作時,可將PCI側地址/數據信號AD[31:0]上的第一個有效周期(即地址期)的數據輸出;
??? l_emdo[3:0]為命令輸出信號,其位定義及時序符合PCI規范,其為0010時為I/O讀操作,為0011時為I/O寫操作、為0110時為內存讀操作。為0111時為內存寫操作,為1010時為配置空間讀,為1011時為配置空間寫,用戶對這組信號進行譯碼可知其當前PCI總線上設備的操作情況;
??? l_irqn為用戶中斷請求信號,由于PCI總線為低電平中斷,所以,用戶邏輯若要發出PCI中斷請求,就必須將低脈沖送入l_irqn。實驗證明,低脈沖持續時間須在4~8μs之間,持續時間過短會出現丟失中斷現象,而時間過長時,操作系統又會重復響應同一個中斷請求;
??? l_tsr[11:0]可用于控制local目標設備狀態寄存器,其中D0~D5位分別對應BAR0~BAR5,哪位有效代表哪個BAR被選中;
??? l_dxfrn為輸出信號,表示local目標設備數據傳輸成功。
2.3 FAGA邏輯設計
??? 一個數據采集系統若要穩定可靠地采集數據,都需要設置合適的數據緩沖區,本系統的數據緩沖區由FPGA內部IP核實現。圖2所示為FPGA內部的PCI接口及數據緩沖區框圖。
?
同步串行通信對時鐘的同步要求非常嚴格,設計時應該注意收/發兩方必須使用同一時鐘來控制數據的傳輸。另外,PCI_T32內存讀寫分為單周期模式和突發模式。突發模式即在給出首地址后主設備連續讀寫多個數據,這在FPGA中需要用戶端地址每周期自動增1的操作。
3 系統軟件開發
3.1 驅動程序
??? PCI設備的硬件資源由Windows操作系統根據PC機中所有設備對資源的占有來統一分配。為了保證系統的安全和穩定性,在Windows2000及其后的微軟操作系統中,運行在ring3層的用戶應用程序無法直接訪問硬件,而必須通過運行于ring0層的設備驅動程序來訪問。設備驅動不僅要實現對硬件的操作,還要為用戶應用程序提供專用的API函數庫,以方便用戶實現對硬件的操作訪問。
??? Windows XP操作系統下的驅動程序一般是基于WDM(Windows Driver Model)模型開發的。該模型中的上層應用程序通過調用Win32 API函數發出對設備的訪問請求,I/O管理器則根據這個請求構造合適的IRP(I/O Request Packet,I/O請求包),并將其傳給設備驅動程序,接著由驅動程序直接訪問硬件完成IRP處理,最后由I/O管理器把數據和結構返回給應用程序。
WDM驅動比較常用的有以下三種方法:
??? 第一種是直接使用Windows DDK(Device
Driver Kit,驅動程序開發包)開發的驅動程序面向Windows內核,該方法工作穩定,效率更高。但必須精通Windows內部體系結構及設備驅動程序的體系結構等,因此開發難度較大。
??? 第二種是使用DriverStudio。此工具軟件已經做了很多基礎性工作,也進行了一些封裝。
??? 第三種是使用WinDriver,使用該方法時,開發者只需要在用戶模式下編寫程序來調用它提供的通用驅動即可。其中Drvier Wizard可以進行硬件診斷和自動代碼生成。另外還可以將對速度要求較高的模塊插入內核運行來獲取更好的性能。本系統即采用WinDriver開發方法。
3.2 WinDriver中的重要函數
??? 利用WinDriver開發驅動程序通常有兩種方法:第一種是利用Driver Wizard生成的代碼進行修改;第二種是直接利用WinDriver提供的API函數來編寫自己的程序。本系統即采用這種方法,開發時首先要注意包含所有相關的頭文件。其基本驅動程序的結構及API函數如下:
?
3.3 中斷實現
??? PCI總線的通信方式有查詢和中斷兩種方式。查詢方式實現簡單,但是難以適應實時性要求較高的場合,而且上位機軟件資源占用率過大;中斷方式則可克服以上缺點,可以實現數據的實時傳輸。本系統將數據經過處理后存入RAM,存滿一幀數據,硬件便發出中斷請求信號,上位機響應中斷請求后,即可讀取一幀數據。
??? 要實現中斷機制,就要建立一個獨立的中斷響應線程,并在主函數中完成中斷的使能、屏蔽及中斷線程的啟動。另外,使用WinDriver處理電平中斷時,還必須建立傳輸命令(INTCSR)來應答中斷。
??? 其中斷處理過程分為四步:
??? 第一步,調用WDC_IntEnable(),此函數的功能是分配并初始化WC_INTERRUPT結構體,自動創建中斷處理線程,同時在其中包含WD_Int-Wait()函數,作用是使線程休眠直至有中斷發生。另外,還可以調用底層API函數InterruptEnable()或WD_Enable(),但此時需要由用戶自己創建中斷線程;
??? 第二步是中斷線程無限循環以等待中斷發生。中斷發生時,WinDriver在內核中執行傳輸命令,當操作返回到用戶模式時,驅動的用戶模式中斷處理例程將被調用;之后,中斷處理例程返回,但中斷等待循環繼續;最后在不再使用中斷時,調用’WDC_IntDisable()、底層API函數Inter-mptDisable()或WD_IntDisable()來關閉中斷。
3.4 驅動的分發及安裝
??? 驅動的分發是指在目標機上不用安裝WinDriver開發包即可應用其開發的設備驅動。需要準備的分發包應包括windrvr6.sys、windrvr-6.inf、wd921.cat、waapi921.dll、difxapi.dll、自己的INF(Information File)等文件,而且即使是自己開發內核驅動。也應包含在內。
??? Windows操作系統依靠INF文件來得到即插即用設備的驅動程序信息。WinDriver會自動檢測PC機上的即插即用設備。并為相應硬件生成I-NF文件,而且只需稍作修改即可。INF文件可引導系統找到硬件所需要的驅動程序,由WinDriver生成的INF文件中列出了默認的拷貝文件win-drvr6.sys。設備驅動可通過工作于內核模式的windrvr6.sys訪問硬件。之后在目標機上裝入驅動分發包及INF文件,即可通過應用程序控制PCI設備。
4 結束語
??? 該數據傳輸系統的PCI接口邏輯和數據傳輸、處理、緩存等用戶邏輯可集成于一片FPGA中。因而可極大的提高資源利用率,并可滿足大量數據高速傳輸的要求。上位機應用程序采用中斷方式讀取數據可大大提高系統的性能。目前,經多次試驗,該系統已完全可以滿足工程需要。
評論
查看更多