《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 可編程邏輯 > 設(shè)計應(yīng)用 > 基于FPGA的PCI總線串口卡設(shè)計
基于FPGA的PCI總線串口卡設(shè)計
來源:電子技術(shù)應(yīng)用2010年第8期
高曉青, 楊瑞峰
中北大學(xué) 信息與通信工程學(xué)院, 山西 太原030051
摘要: 為了方便外部設(shè)備與計算機進(jìn)行串口通信,提出一種基于FPGA的PCI總線串口卡設(shè)計。利用Altera公司的FPGA芯片EP1C6SQ240實現(xiàn)了串口和PCI總線的連接。介紹了用FPGA實現(xiàn)PCI接口、UART的方法,將PCI接口、UART的核心功能集中在FPGA上,使整個設(shè)計緊湊、小巧。該設(shè)計符合PCI 2.2規(guī)范,傳輸速率高,可廣泛應(yīng)用于各類測試設(shè)備、工廠自動化、有線通信等領(lǐng)域。
關(guān)鍵詞: FPGA PCI總線 串口 UART WinDriver
中圖分類號: TP336
文獻(xiàn)標(biāo)識碼: A
文章編號: 0258-7998(2010)08-0134-04
Design of PCI bus serial port card based on FPGA
GAO Xiao Qing, YANG Rui Feng
School of Information and Communication Engineering, North University of China, Taiyuan 030051, China
Abstract: In order to facilitate the serial communication of external devices and computers, a design of serial port card of PCI bus based on FPGA is presented in the paper. The serial port and PCI bus are connected by the FPGA chip EP1C6SQ240 of Altera Corporation. The introduced a method of design the PCI interface, UART in the same FPGA. FPGA is used to embed the core function of PCI interface and UART into it,so that the whole design is compact. The design is up to PCI Rev.2.2. And the serial port’s transmission rate is very high. Therefore, it can widely be applied in such fields as test equipments, shop automation,wire-line communication, etc.
Key words : PCI bus;FPGA;serial ports;UART;WinDriver

    隨著計算機測試技術(shù)的飛速發(fā)展,越來越多的外部設(shè)備通過串口與計算機進(jìn)行通信,實現(xiàn)信息共享以及設(shè)備的集中控制和管理。利用串口進(jìn)行通信具有結(jié)構(gòu)簡單、傳輸距離遠(yuǎn)、成本低廉等優(yōu)點,被廣泛應(yīng)用于各個領(lǐng)域[1]。同時,PCI(Peripheral Component Interconnect)總線是一種高性能32/64位局部總線,最大數(shù)據(jù)傳輸速率為132 Mb/s,可同時支持多組外設(shè),數(shù)據(jù)吞吐量大,是目前應(yīng)用最廣泛、最流行的一種高速同步總線[2]。因此,利用PCI總線實現(xiàn)上位機與外部設(shè)備的串口通信,可以提高通信能力。
 由于大部分I/O 設(shè)備沒有PCI總線功能,要實現(xiàn)設(shè)備與PCI總線的連接,需要PCI接口芯片、通用異步收發(fā)器UART(Universal Asynchronous Receiver Transmitter)等。而目前開發(fā)PCI總線與外部設(shè)備的串口通信大體上有兩種方式:(1)使用專用的芯片,如:PCI專用接口芯片S5920、S5933等;UART專用芯片8250、8251、16450、16550等。使用廠家提供的專用接口芯片,用戶可能只使用到它的部分功能,會造成一定的資源浪費,而且專用芯片價格高。(2)使用可編程器件FPGA。使用FPGA較使用專用芯片具有以下優(yōu)點:一方面用戶可以根據(jù)需要進(jìn)行設(shè)計,不會浪費資源;另一方面可以將PCI接口、UART都做在一片F(xiàn)PGA內(nèi),這樣就不需要外接專門的芯片,簡化了電路、縮小了體積、提高了系統(tǒng)的可靠性。
1系統(tǒng)硬件設(shè)計
 本設(shè)計中選用Altera公司的FPGA芯片EP1C6SQ240作為核心器件,完成PCI接口以及UART的設(shè)計,實現(xiàn)PCI總線與串口的連接。選用美信公司的MAX490芯片作為電平轉(zhuǎn)換電路。系統(tǒng)的硬件連接框圖如圖1所示。

 數(shù)據(jù)傳輸過程:上位機通過PCI總線發(fā)送并行數(shù)據(jù)到UART的數(shù)據(jù)緩存器中,然后數(shù)據(jù)經(jīng)UART的數(shù)據(jù)緩存器進(jìn)入UART的移位寄存器進(jìn)行并串轉(zhuǎn)換后,通過串口傳到下位機。反之,下位機通過串口將數(shù)據(jù)傳送到UART的移位寄存器中,進(jìn)行串并轉(zhuǎn)換,然后進(jìn)入UART的數(shù)據(jù)緩存器中,最后傳到上位機。
 設(shè)計中采用,傳輸距離長、抗干擾能力強的RS422串口。但是規(guī)定RS422:邏輯1的電平為-6 V~-2 V;邏輯0的電平為+2 V~+6 V。而FPGA的I/O電平一般為0~3.3 V,二者之間的電平不兼容。為了使二者之間的供電電壓保持一致,必須加入電平轉(zhuǎn)換電路。為此選用美信公司的MAX490芯片來實現(xiàn)二者之間的電平轉(zhuǎn)換,其電路原理圖如圖2所示。

1.1  PCI總線接口
 PCI總線接口的功能是將一個不支持 PCI 協(xié)議的后端設(shè)備接口到PCI 總線上。為了實現(xiàn)PCI總線接口的基本功能,必須完成如下模塊的設(shè)計:PCI空間配置模塊、偶校驗?zāi)K、地址譯碼和命令譯碼模塊、設(shè)備狀態(tài)機模塊等。PCI總線接口原理框圖如圖3所示。

1.1.1 PCI空間配置模塊
 PCI協(xié)議支持3種地址空間:I/O空間、內(nèi)存空間和配置空間。配置空間是PCI所特有的一種空間,其大小為256 B,前64 B是必需的,記錄了PCI串口設(shè)備的基本信息。PCI設(shè)備的一些主要的信息如下:
 (1) VendorID、DeviceID:分別表示設(shè)備的生產(chǎn)廠商和設(shè)備編號。
 (2) Command:命令寄存器,包含設(shè)備控制位,包括允許存儲器讀寫響應(yīng)等。
 (3) Status:狀態(tài)寄存器,記錄PCI總線的相關(guān)事件信息。
 (4) Base Adress Register:基地址寄存器,指示此PCI設(shè)備按I/O方式還是按內(nèi)存方式進(jìn)行讀寫以及需要的地址空間大小。
 (5) Interrupt Line、Interrupt Pin:為設(shè)備使用的中斷號和中斷引腳。
1.1.2 偶校驗?zāi)K
 PCI總線的偶校驗用于檢驗數(shù)據(jù)傳輸是否正確。在PCI總線上,利用偶校驗?zāi)K檢查每次傳輸中主設(shè)備是否正確地尋址到目標(biāo)設(shè)備,以及它們之間的數(shù)據(jù)是否正確地傳輸。
1.1.3 地址譯碼和命令譯碼模塊
 地址譯碼模塊主要用于檢測地址與此PCI串口設(shè)備的基地址是否匹配,如果匹配,則PCI串口設(shè)備響應(yīng)當(dāng)前的總線操作。
 命令譯碼模塊表示PCI串口設(shè)備響應(yīng)不同的總線命令,通過檢測PCI-cbe[3:0]信號線上的值,完成命令譯碼。
1.1.4 設(shè)備狀態(tài)機模塊
 PCI總線接口電路是時序復(fù)雜的接口電路,它的復(fù)雜性由PCI總線操作的多樣性決定。根據(jù)PCI的總線操作類型和總線操作時序關(guān)系,在這里抽象出一種簡潔明了,符合總線時序、更易于硬件描述語言實現(xiàn)的狀態(tài)機??偩€接口狀態(tài)機示意圖如圖4所示。狀態(tài)機的設(shè)計是整個設(shè)計的核心部分,利用該狀態(tài)機可以完成配置寄存器、存儲器、I/O的讀寫操作。

 狀態(tài)機包括4個狀態(tài):空閑(idle)狀態(tài)、配置讀寫(con)狀態(tài)、存儲器或I/O讀寫(rw)狀態(tài)、傳輸中止(backoff)狀態(tài)。系統(tǒng)復(fù)位后,狀態(tài)機轉(zhuǎn)入空閑狀態(tài),在空閑狀態(tài)中采樣總線,并根據(jù)總線的變化來決定狀態(tài)機即將轉(zhuǎn)入的狀態(tài)。如果此時命令總線上是配置寄存器讀寫命令,判斷PCI-irdy信號是否有效來決定下一可能的狀態(tài)。如果信號無效,則狀態(tài)機轉(zhuǎn)入傳輸中止?fàn)顟B(tài),然后返回空閑狀態(tài);如果信號有效,則狀態(tài)機轉(zhuǎn)入配置讀寫狀態(tài)。如果此時命令總線上是存儲器或者I/O的讀寫命令,則判斷PCI-frame信號是否有效來決定下一可能的狀態(tài)。如果信號無效,狀態(tài)機轉(zhuǎn)入傳輸中止?fàn)顟B(tài),然后返回空閑狀態(tài);如果信號有效,狀態(tài)機轉(zhuǎn)入存儲器或I/O讀寫狀態(tài)。
1.2  UART模塊
 PCI總線傳輸?shù)氖遣⑿袛?shù)據(jù),而串口傳輸?shù)氖谴袛?shù)據(jù),要想實現(xiàn)PCI總線與串口的數(shù)據(jù)傳輸,必須通過UART完成數(shù)據(jù)的串并/并串轉(zhuǎn)換。本文設(shè)計的基于FPGA的UART由4個模塊組成:波特率發(fā)生器模塊、寄存器控制模塊、接收模塊以及發(fā)送模塊。UART的總體框圖如圖5所示。

1.2.1 波特率發(fā)生器模塊
 波特率發(fā)生器實際上就是一個分頻器,用來產(chǎn)生和串行通信所采用的波特率同步的時鐘,這樣才能按照串行通信的時序要求進(jìn)行數(shù)據(jù)接收或發(fā)送[3]。本設(shè)計中UART收發(fā)的每一個數(shù)據(jù)寬度都是波特率發(fā)生器輸出時鐘周期的16倍,即假定當(dāng)前按照9 600 b/s進(jìn)行收發(fā),那么波特率發(fā)生器輸出的時鐘頻率應(yīng)為9 600×16 Hz。
1.2.2 寄存器控制模塊
 設(shè)計的UART包括:2個數(shù)據(jù)緩沖寄存器(接收、發(fā)送緩沖寄存器);2個狀態(tài)寄存器(中斷識別、線路狀態(tài)寄存器);2個控制寄存器(中斷使能、線路控制寄存器);2個移位寄存器(接收、發(fā)送移位寄存器)。寄存器控制模塊完成除了移位寄存器外的所有寄存器的讀寫控制。
1.2.3 接收模塊
 接收模塊包括接收緩沖寄存器和接收移位寄存器。在接收數(shù)據(jù)開始時,為了能夠準(zhǔn)確地傳輸數(shù)據(jù),先要清空接收緩沖寄存器和接收移位寄存器,然后接收移位寄存器等待檢測數(shù)據(jù)的起始位。檢測到有效的起始位后開始接收數(shù)據(jù),同時啟動接收數(shù)據(jù)計數(shù)器,統(tǒng)計接收數(shù)據(jù)的位數(shù),直到接收到滿足需求的數(shù)據(jù)位。如果需要奇偶校驗,則產(chǎn)生校驗位。最后接收停止位,完成1幀數(shù)據(jù)(起始位+數(shù)據(jù)位+奇偶校驗位+停止位)的接收,將數(shù)據(jù)存入接收緩沖寄存器,進(jìn)行下一幀數(shù)據(jù)的接收,并通知上位機讀取數(shù)據(jù)。
 接收模塊通過狀態(tài)機來完成數(shù)據(jù)接收,其狀態(tài)機包含4個狀態(tài):空閑狀態(tài)(idle)、移位狀態(tài)(shift)、奇偶校驗狀態(tài)(parity)和停止位狀態(tài)(stop),如圖6所示。其工作過程如下:當(dāng)系統(tǒng)復(fù)位時,狀態(tài)機進(jìn)入空閑狀態(tài),等待接收開始位;當(dāng)開始位被確定有效后,狀態(tài)機進(jìn)入移位狀態(tài)。在移位狀態(tài)中,接收模塊為每個數(shù)據(jù)位的移入等待16個內(nèi)部時鐘周期,接收完特定的數(shù)據(jù)位后,若奇偶校驗使能有效,則跳轉(zhuǎn)到奇偶校驗狀態(tài);否則,進(jìn)入停止位狀態(tài),而后進(jìn)入空閑狀態(tài),重復(fù)上述過程。


1.2.4 發(fā)送模塊
 發(fā)送模塊包括發(fā)送緩存寄存器和發(fā)送移位寄存器。在發(fā)送數(shù)據(jù)開始時,清空發(fā)送緩存寄存器和發(fā)送移位寄存器后,發(fā)送緩存寄存器接收發(fā)送來的數(shù)據(jù),然后從發(fā)送緩存寄存器向發(fā)送移位寄存器發(fā)送數(shù)據(jù)。首先發(fā)送起始位到發(fā)送移位寄存器,同時啟動發(fā)送數(shù)據(jù)計數(shù)器,記錄發(fā)送數(shù)據(jù)的個數(shù),直到發(fā)送移位寄存器接收到滿足需求的數(shù)據(jù)。若奇偶校驗使能有效,則跳轉(zhuǎn)到奇偶校驗狀態(tài);否則,進(jìn)入停止位狀態(tài),完成1幀數(shù)據(jù)的發(fā)送。只要發(fā)送緩存寄存器不為空,則繼續(xù)傳輸下一幀數(shù)據(jù)。其狀態(tài)機的實現(xiàn)與接收模塊的類似。
2  系統(tǒng)軟件設(shè)計
2.1  驅(qū)動程序

 WinDriver是一套PCI驅(qū)動程序開發(fā)包。它改變了傳統(tǒng)驅(qū)動程序開發(fā)的方法與思路,極大地簡化了驅(qū)動程序的編制。同時,WinDriver又沒有犧牲驅(qū)動程序的性能,是一套高效、快捷的PCI驅(qū)動程序開發(fā)軟件包[4]。WinDriver可在VC/C++、Delphi、BC++、VB等多種開發(fā)環(huán)境中使用,本設(shè)計選用VC++作為驅(qū)動程序的開發(fā)環(huán)境,通過WinDriver生成VC++代碼,根據(jù)設(shè)計的需要修改生成的代碼以完成此PCI設(shè)備的驅(qū)動。驅(qū)動程序流程圖如圖7所示。

2.2  應(yīng)用程序
 應(yīng)用程序負(fù)責(zé)調(diào)用、連接驅(qū)動程序,實現(xiàn)與驅(qū)動程序的通信。連接到驅(qū)動程序后,向驅(qū)動程序注冊,同時啟動串口監(jiān)測工作線程,等待事件發(fā)生。當(dāng)驅(qū)動程序接收到中斷后,通過發(fā)送消息通知應(yīng)用程序,處理發(fā)生的事件。處理后退出應(yīng)用程序,結(jié)束等待事件線程。應(yīng)用程序流程圖如圖8所示。
 本文介紹了一種基于FPGA的PCI總線串口卡設(shè)計方法,簡單說明了其硬件的設(shè)計和驅(qū)動程序、應(yīng)用程序的編寫方法。該設(shè)計符合通用的PCI規(guī)范,支持即插即用功能,傳輸速率高,抗干擾能力強??梢詮V泛應(yīng)用于各類測試設(shè)備、工廠自動化等,具有很高的實用價值。
參考文獻(xiàn)
[1]     徐志春.基于PCI總線的多串口通信適配卡設(shè)計[J].微計算機信息,2007,23:294-296.
[2]     王友波,劉明業(yè).PCI總線接口控制器的FPGA設(shè)計[J].北京理工大學(xué)學(xué)報,2004,24(5): 423-426.
[3]     楊大柱.基于FPGA的UART電路設(shè)計與仿真[J]. 微計 算機信息, 2007,23(5-2):212-213.
[4]     劉映杰,張在峰,劉瑋,等.用WinDriver開發(fā)PCI設(shè)備驅(qū)動程序[J]. 信息技術(shù),2004, 28 (2):78-80.

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。