《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 可編程邏輯 > 設(shè)計(jì)應(yīng)用 > 基于FPGA的PCI總線串口卡設(shè)計(jì)
基于FPGA的PCI總線串口卡設(shè)計(jì)
來源:電子技術(shù)應(yīng)用2010年第8期
高曉青, 楊瑞峰
中北大學(xué) 信息與通信工程學(xué)院, 山西 太原030051
摘要: 為了方便外部設(shè)備與計(jì)算機(jī)進(jìn)行串口通信,提出一種基于FPGA的PCI總線串口卡設(shè)計(jì)。利用Altera公司的FPGA芯片EP1C6SQ240實(shí)現(xiàn)了串口和PCI總線的連接。介紹了用FPGA實(shí)現(xiàn)PCI接口、UART的方法,將PCI接口、UART的核心功能集中在FPGA上,使整個(gè)設(shè)計(jì)緊湊、小巧。該設(shè)計(jì)符合PCI 2.2規(guī)范,傳輸速率高,可廣泛應(yīng)用于各類測(cè)試設(shè)備、工廠自動(dòng)化、有線通信等領(lǐng)域。
關(guān)鍵詞: FPGA PCI總線 串口 UART WinDriver
中圖分類號(hào): TP336
文獻(xiàn)標(biāo)識(shí)碼: A
文章編號(hào): 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

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

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

1.1  PCI總線接口
 PCI總線接口的功能是將一個(gè)不支持 PCI 協(xié)議的后端設(shè)備接口到PCI 總線上。為了實(shí)現(xiàn)PCI總線接口的基本功能,必須完成如下模塊的設(shè)計(jì):PCI空間配置模塊、偶校驗(yàn)?zāi)K、地址譯碼和命令譯碼模塊、設(shè)備狀態(tài)機(jī)模塊等。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è)備編號(hào)。
 (2) Command:命令寄存器,包含設(shè)備控制位,包括允許存儲(chǔ)器讀寫響應(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è)備使用的中斷號(hào)和中斷引腳。
1.1.2 偶校驗(yàn)?zāi)K
 PCI總線的偶校驗(yàn)用于檢驗(yàn)數(shù)據(jù)傳輸是否正確。在PCI總線上,利用偶校驗(yàn)?zāi)K檢查每次傳輸中主設(shè)備是否正確地尋址到目標(biāo)設(shè)備,以及它們之間的數(shù)據(jù)是否正確地傳輸。
1.1.3 地址譯碼和命令譯碼模塊
 地址譯碼模塊主要用于檢測(cè)地址與此PCI串口設(shè)備的基地址是否匹配,如果匹配,則PCI串口設(shè)備響應(yīng)當(dāng)前的總線操作。
 命令譯碼模塊表示PCI串口設(shè)備響應(yīng)不同的總線命令,通過檢測(cè)PCI-cbe[3:0]信號(hào)線上的值,完成命令譯碼。
1.1.4 設(shè)備狀態(tài)機(jī)模塊
 PCI總線接口電路是時(shí)序復(fù)雜的接口電路,它的復(fù)雜性由PCI總線操作的多樣性決定。根據(jù)PCI的總線操作類型和總線操作時(shí)序關(guān)系,在這里抽象出一種簡(jiǎn)潔明了,符合總線時(shí)序、更易于硬件描述語言實(shí)現(xiàn)的狀態(tài)機(jī)??偩€接口狀態(tài)機(jī)示意圖如圖4所示。狀態(tài)機(jī)的設(shè)計(jì)是整個(gè)設(shè)計(jì)的核心部分,利用該狀態(tài)機(jī)可以完成配置寄存器、存儲(chǔ)器、I/O的讀寫操作。

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

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


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

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

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

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