文獻標識碼: A
文章編號: 0258-7998(2010)08-0134-04
隨著計算機測試技術的飛速發展,越來越多的外部設備通過串口與計算機進行通信,實現信息共享以及設備的集中控制和管理。利用串口進行通信具有結構簡單、傳輸距離遠、成本低廉等優點,被廣泛應用于各個領域[1]。同時,PCI(Peripheral Component Interconnect)總線是一種高性能32/64位局部總線,最大數據傳輸速率為132 Mb/s,可同時支持多組外設,數據吞吐量大,是目前應用最廣泛、最流行的一種高速同步總線[2]。因此,利用PCI總線實現上位機與外部設備的串口通信,可以提高通信能力。
由于大部分I/O 設備沒有PCI總線功能,要實現設備與PCI總線的連接,需要PCI接口芯片、通用異步收發器UART(Universal Asynchronous Receiver Transmitter)等。而目前開發PCI總線與外部設備的串口通信大體上有兩種方式:(1)使用專用的芯片,如:PCI專用接口芯片S5920、S5933等;UART專用芯片8250、8251、16450、16550等。使用廠家提供的專用接口芯片,用戶可能只使用到它的部分功能,會造成一定的資源浪費,而且專用芯片價格高。(2)使用可編程器件FPGA。使用FPGA較使用專用芯片具有以下優點:一方面用戶可以根據需要進行設計,不會浪費資源;另一方面可以將PCI接口、UART都做在一片FPGA內,這樣就不需要外接專門的芯片,簡化了電路、縮小了體積、提高了系統的可靠性。
1系統硬件設計
本設計中選用Altera公司的FPGA芯片EP1C6SQ240作為核心器件,完成PCI接口以及UART的設計,實現PCI總線與串口的連接。選用美信公司的MAX490芯片作為電平轉換電路。系統的硬件連接框圖如圖1所示。
數據傳輸過程:上位機通過PCI總線發送并行數據到UART的數據緩存器中,然后數據經UART的數據緩存器進入UART的移位寄存器進行并串轉換后,通過串口傳到下位機。反之,下位機通過串口將數據傳送到UART的移位寄存器中,進行串并轉換,然后進入UART的數據緩存器中,最后傳到上位機。
設計中采用,傳輸距離長、抗干擾能力強的RS422串口。但是規定RS422:邏輯1的電平為-6 V~-2 V;邏輯0的電平為+2 V~+6 V。而FPGA的I/O電平一般為0~3.3 V,二者之間的電平不兼容。為了使二者之間的供電電壓保持一致,必須加入電平轉換電路。為此選用美信公司的MAX490芯片來實現二者之間的電平轉換,其電路原理圖如圖2所示。
1.1 PCI總線接口
PCI總線接口的功能是將一個不支持 PCI 協議的后端設備接口到PCI 總線上。為了實現PCI總線接口的基本功能,必須完成如下模塊的設計:PCI空間配置模塊、偶校驗模塊、地址譯碼和命令譯碼模塊、設備狀態機模塊等。PCI總線接口原理框圖如圖3所示。
1.1.1 PCI空間配置模塊
PCI協議支持3種地址空間:I/O空間、內存空間和配置空間。配置空間是PCI所特有的一種空間,其大小為256 B,前64 B是必需的,記錄了PCI串口設備的基本信息。PCI設備的一些主要的信息如下:
(1) VendorID、DeviceID:分別表示設備的生產廠商和設備編號。
(2) Command:命令寄存器,包含設備控制位,包括允許存儲器讀寫響應等。
(3) Status:狀態寄存器,記錄PCI總線的相關事件信息。
(4) Base Adress Register:基地址寄存器,指示此PCI設備按I/O方式還是按內存方式進行讀寫以及需要的地址空間大小。
(5) Interrupt Line、Interrupt Pin:為設備使用的中斷號和中斷引腳。
1.1.2 偶校驗模塊
PCI總線的偶校驗用于檢驗數據傳輸是否正確。在PCI總線上,利用偶校驗模塊檢查每次傳輸中主設備是否正確地尋址到目標設備,以及它們之間的數據是否正確地傳輸。
1.1.3 地址譯碼和命令譯碼模塊
地址譯碼模塊主要用于檢測地址與此PCI串口設備的基地址是否匹配,如果匹配,則PCI串口設備響應當前的總線操作。
命令譯碼模塊表示PCI串口設備響應不同的總線命令,通過檢測PCI-cbe[3:0]信號線上的值,完成命令譯碼。
1.1.4 設備狀態機模塊
PCI總線接口電路是時序復雜的接口電路,它的復雜性由PCI總線操作的多樣性決定。根據PCI的總線操作類型和總線操作時序關系,在這里抽象出一種簡潔明了,符合總線時序、更易于硬件描述語言實現的狀態機。總線接口狀態機示意圖如圖4所示。狀態機的設計是整個設計的核心部分,利用該狀態機可以完成配置寄存器、存儲器、I/O的讀寫操作。
狀態機包括4個狀態:空閑(idle)狀態、配置讀寫(con)狀態、存儲器或I/O讀寫(rw)狀態、傳輸中止(backoff)狀態。系統復位后,狀態機轉入空閑狀態,在空閑狀態中采樣總線,并根據總線的變化來決定狀態機即將轉入的狀態。如果此時命令總線上是配置寄存器讀寫命令,判斷PCI-irdy信號是否有效來決定下一可能的狀態。如果信號無效,則狀態機轉入傳輸中止狀態,然后返回空閑狀態;如果信號有效,則狀態機轉入配置讀寫狀態。如果此時命令總線上是存儲器或者I/O的讀寫命令,則判斷PCI-frame信號是否有效來決定下一可能的狀態。如果信號無效,狀態機轉入傳輸中止狀態,然后返回空閑狀態;如果信號有效,狀態機轉入存儲器或I/O讀寫狀態。
1.2 UART模塊
PCI總線傳輸的是并行數據,而串口傳輸的是串行數據,要想實現PCI總線與串口的數據傳輸,必須通過UART完成數據的串并/并串轉換。本文設計的基于FPGA的UART由4個模塊組成:波特率發生器模塊、寄存器控制模塊、接收模塊以及發送模塊。UART的總體框圖如圖5所示。
1.2.1 波特率發生器模塊
波特率發生器實際上就是一個分頻器,用來產生和串行通信所采用的波特率同步的時鐘,這樣才能按照串行通信的時序要求進行數據接收或發送[3]。本設計中UART收發的每一個數據寬度都是波特率發生器輸出時鐘周期的16倍,即假定當前按照9 600 b/s進行收發,那么波特率發生器輸出的時鐘頻率應為9 600×16 Hz。
1.2.2 寄存器控制模塊
設計的UART包括:2個數據緩沖寄存器(接收、發送緩沖寄存器);2個狀態寄存器(中斷識別、線路狀態寄存器);2個控制寄存器(中斷使能、線路控制寄存器);2個移位寄存器(接收、發送移位寄存器)。寄存器控制模塊完成除了移位寄存器外的所有寄存器的讀寫控制。
1.2.3 接收模塊
接收模塊包括接收緩沖寄存器和接收移位寄存器。在接收數據開始時,為了能夠準確地傳輸數據,先要清空接收緩沖寄存器和接收移位寄存器,然后接收移位寄存器等待檢測數據的起始位。檢測到有效的起始位后開始接收數據,同時啟動接收數據計數器,統計接收數據的位數,直到接收到滿足需求的數據位。如果需要奇偶校驗,則產生校驗位。最后接收停止位,完成1幀數據(起始位+數據位+奇偶校驗位+停止位)的接收,將數據存入接收緩沖寄存器,進行下一幀數據的接收,并通知上位機讀取數據。
接收模塊通過狀態機來完成數據接收,其狀態機包含4個狀態:空閑狀態(idle)、移位狀態(shift)、奇偶校驗狀態(parity)和停止位狀態(stop),如圖6所示。其工作過程如下:當系統復位時,狀態機進入空閑狀態,等待接收開始位;當開始位被確定有效后,狀態機進入移位狀態。在移位狀態中,接收模塊為每個數據位的移入等待16個內部時鐘周期,接收完特定的數據位后,若奇偶校驗使能有效,則跳轉到奇偶校驗狀態;否則,進入停止位狀態,而后進入空閑狀態,重復上述過程。
1.2.4 發送模塊
發送模塊包括發送緩存寄存器和發送移位寄存器。在發送數據開始時,清空發送緩存寄存器和發送移位寄存器后,發送緩存寄存器接收發送來的數據,然后從發送緩存寄存器向發送移位寄存器發送數據。首先發送起始位到發送移位寄存器,同時啟動發送數據計數器,記錄發送數據的個數,直到發送移位寄存器接收到滿足需求的數據。若奇偶校驗使能有效,則跳轉到奇偶校驗狀態;否則,進入停止位狀態,完成1幀數據的發送。只要發送緩存寄存器不為空,則繼續傳輸下一幀數據。其狀態機的實現與接收模塊的類似。
2 系統軟件設計
2.1 驅動程序
WinDriver是一套PCI驅動程序開發包。它改變了傳統驅動程序開發的方法與思路,極大地簡化了驅動程序的編制。同時,WinDriver又沒有犧牲驅動程序的性能,是一套高效、快捷的PCI驅動程序開發軟件包[4]。WinDriver可在VC/C++、Delphi、BC++、VB等多種開發環境中使用,本設計選用VC++作為驅動程序的開發環境,通過WinDriver生成VC++代碼,根據設計的需要修改生成的代碼以完成此PCI設備的驅動。驅動程序流程圖如圖7所示。
2.2 應用程序
應用程序負責調用、連接驅動程序,實現與驅動程序的通信。連接到驅動程序后,向驅動程序注冊,同時啟動串口監測工作線程,等待事件發生。當驅動程序接收到中斷后,通過發送消息通知應用程序,處理發生的事件。處理后退出應用程序,結束等待事件線程。應用程序流程圖如圖8所示。
本文介紹了一種基于FPGA的PCI總線串口卡設計方法,簡單說明了其硬件的設計和驅動程序、應用程序的編寫方法。該設計符合通用的PCI規范,支持即插即用功能,傳輸速率高,抗干擾能力強。可以廣泛應用于各類測試設備、工廠自動化等,具有很高的實用價值。
參考文獻
[1] 徐志春.基于PCI總線的多串口通信適配卡設計[J].微計算機信息,2007,23:294-296.
[2] 王友波,劉明業.PCI總線接口控制器的FPGA設計[J].北京理工大學學報,2004,24(5): 423-426.
[3] 楊大柱.基于FPGA的UART電路設計與仿真[J]. 微計 算機信息, 2007,23(5-2):212-213.
[4] 劉映杰,張在峰,劉瑋,等.用WinDriver開發PCI設備驅動程序[J]. 信息技術,2004, 28 (2):78-80.