摘 要:UART作為RS 232協(xié)議的控制接口得到了廣泛的應(yīng)用,基于FPGA實現(xiàn)的UART設(shè)計可以使系統(tǒng)更加緊湊、穩(wěn)定。系統(tǒng)結(jié)構(gòu)進(jìn)行了模塊化分解,使之適應(yīng)自頂向下(Top Down)的設(shè)計方法。核心部分采用有限狀態(tài)機(jī)(FSM)實現(xiàn),使控制邏輯直觀簡單,提高了設(shè)計效率。通過與計算機(jī)間的數(shù)據(jù)通信對設(shè)計的功能進(jìn)行了驗證,在此基礎(chǔ)上衍生出一種將UART模塊嵌入FPGA芯片與計算機(jī)互聯(lián)進(jìn)行功能驗證和調(diào)試的新方法。
關(guān)鍵詞:通用異步收發(fā)器;串口通信;現(xiàn)場可編程邏輯器件;有限狀態(tài)機(jī)
中圖分類號:TP29 文獻(xiàn)標(biāo)識碼:B 文章編號:1004373X(2008)1716203
Design and Realization of UART and Its Verification Based on FPGA
ZHAO Yan,GE Lijia,SHUANG Tao
(Digital Communication and Signal Processing Lab.,Chongqing Communication College,Chongqing,400035,China)
Abstract:UART is used widely as the interface of RS 232,and to design it in FPGA can make system more compact and stable.The structure of the system is divided in modularization to fit the design method Top-Down.The core of this system is implemented with Finite State Machine (FSM),it makes the logic of control briefness.An experiment of communicating between UART and computer is designed to verificate the function of this system.And a new method of debugging the FPGA design by implanting UART into it to connect with computer is derived from this.
Keywords:uniersal asynchronous receiver transmitter;serial port communication;FPGA;finite state machine
通用異步收發(fā)器(Universal Asynchronous Receiver Transmitter,UART)是數(shù)字通信領(lǐng)域流行和廣泛使用的一種接口設(shè)備,主要用來控制符合RS 232-C協(xié)議的計算機(jī)與串行設(shè)備間的通信。普通串行外設(shè)和計算機(jī)間的通信,一般使用通用的串行接口芯片,但是這種接口芯片存在體積較大、接口復(fù)雜以及成本較高的缺點(diǎn),會使得硬件設(shè)計更加復(fù)雜,并且結(jié)構(gòu)與功能相對固定,無法根據(jù)設(shè)計的需要對其邏輯控制進(jìn)行靈活的修改。而目前日趨成熟的SOC技術(shù)則要求將整個設(shè)計的功能集成在單片或幾塊芯片當(dāng)中,因此,將UART的功能集成在FPGA芯片當(dāng)中,可以使整個系統(tǒng)更為靈活、緊湊,性能也更加穩(wěn)定[1]。本文提出了一種使用VHDL語言開發(fā)UART的方法,實現(xiàn)了FPGA與計算機(jī)之間的數(shù)據(jù)通信,并將其應(yīng)用于FPGA芯片開發(fā)的功能驗證當(dāng)中,從而衍生出了將UART嵌入到FPGA芯片,與計算機(jī)互聯(lián)的一種直觀的FPGA設(shè)計的驗證和調(diào)試方法。
1 UART通信原理
UART采用通用的RS 232-C串行接口標(biāo)準(zhǔn),該協(xié)議的優(yōu)點(diǎn)是使用廣泛,幾乎所有計算機(jī)和串行外設(shè)當(dāng)中都置有這種接口,其傳輸距離可達(dá)15 m,并且實現(xiàn)較簡單,用于雙向連接時最少只需要2條導(dǎo)線即可實現(xiàn)基本通信。UART的具體幀格式如圖1所示,每幀數(shù)據(jù)由開始位、數(shù)據(jù)位、奇偶校驗位和停止位四部分依次組成[2]。其中,開始位為低電平;數(shù)據(jù)位長度為5,6,7,8不等;奇偶校驗的模式有無校驗、奇校驗、偶校驗、粘附校驗1和粘附校驗0;停止位為高電平,具體長度為1位、1.5位和2位不等,這些選項都通過UART內(nèi)部的線性控制寄存器來確定。當(dāng)沒有數(shù)據(jù)發(fā)送時,發(fā)送和接收引腳都保持高電平。

2 UART的FPGA實現(xiàn)
本實現(xiàn)中,UART主要包括接收模塊、發(fā)送模塊、MODEM控制器和中斷仲裁4個部分。它們的具體功能如下:
接收模塊 具體作用是接收從串行數(shù)據(jù)輸入端口SIN送來的異步數(shù)據(jù),并進(jìn)行串/并轉(zhuǎn)換,此外,接收模塊還包含模塊控制和模塊狀態(tài)配置功能,用來設(shè)置接收數(shù)據(jù)幀的屬性以及向中斷仲裁模塊輸出狀態(tài)信號;
發(fā)送模塊 其作用是對從CPU送來的并行數(shù)據(jù)進(jìn)行并/串轉(zhuǎn)換,將串行數(shù)據(jù)從SOUT輸出到串口,同接收模塊相同,該模塊也包含模塊控制和模塊狀態(tài)配置功能;
中斷仲裁模塊 其作用是用來實現(xiàn)外部接口對內(nèi)部寄存器的操作以及中斷信號的仲裁操作,在UART的工作過程中,發(fā)送和接收模塊的狀態(tài)信號都送入該模塊的線性狀態(tài)寄存器中,經(jīng)過內(nèi)部的邏輯操作輸出相應(yīng)的中斷信號,指示與UART相連的外部設(shè)備進(jìn)行相應(yīng)的讀寫操作;
MODEM模塊 其作用是用來和外部的調(diào)制解調(diào)器或者其他的UART設(shè)備進(jìn)行通信[3]。
2.1 接收模塊
在接收的過程中,由于串行數(shù)據(jù)幀異步于接收時鐘,因此,當(dāng)檢測到SIN由高電平到低電平的變化將被認(rèn)為是一幀數(shù)據(jù)的開始位。為避免由于噪聲引起的錯誤數(shù)據(jù),本設(shè)計中實現(xiàn)了錯誤開始位檢測功能,即要求開始位必須在收發(fā)波特率時鐘的50%以上為低電平。由于我們采用的內(nèi)部時鐘其頻率是波特率時鐘的16倍,因此開始位至少在8個內(nèi)部時鐘周期內(nèi)為低電平才被認(rèn)為有效。一旦開始位被確認(rèn),后面的數(shù)據(jù)比特和校驗比特將會每16個內(nèi)部時鐘周期采樣一次。
接收模塊包括一個數(shù)據(jù)緩沖寄存器和一個接收移位寄存器。當(dāng)檢測到開始位有效時,其后的數(shù)據(jù)比特將會依次存入數(shù)據(jù)移位寄存器,根據(jù)數(shù)據(jù)幀的配置,當(dāng)接收完所有數(shù)據(jù)比特后會根據(jù)奇偶校驗是否被使能來判斷下一步進(jìn)行校驗或停止接收,等待外部設(shè)備讀取接收到的數(shù)據(jù)。整個過程可通過狀態(tài)機(jī)方便的實現(xiàn),狀態(tài)轉(zhuǎn)移圖如圖2所示。

由圖2不難看出,接收模塊的狀態(tài)機(jī)包含4個狀態(tài):空閑狀態(tài)(idle)、移位狀態(tài)(shift)、奇偶校驗狀態(tài)(parity)和停止位狀態(tài)(stop)。其工作過程如下:當(dāng)系統(tǒng)復(fù)位時,狀態(tài)機(jī)進(jìn)入idle狀態(tài),等待開始位,SIN由高電平變?yōu)榈碗娖讲⒈淮_認(rèn)為有效的開始位后,狀態(tài)機(jī)進(jìn)入shift狀態(tài);shift狀態(tài)中,接收模塊為每一個數(shù)據(jù)比特移入等待16個內(nèi)部時鐘周期,接收完一幀數(shù)據(jù)后,若奇偶校驗使能有效,跳轉(zhuǎn)到parity狀態(tài),否則,進(jìn)入stop狀態(tài);在parity狀態(tài)中對奇偶校驗比特進(jìn)行采樣,狀態(tài)機(jī)將跳轉(zhuǎn)到stop狀態(tài);狀態(tài)機(jī)進(jìn)入stop狀態(tài)后,等待16個內(nèi)部時鐘周期后將對停止位的長度進(jìn)行采樣,而后進(jìn)入idle狀態(tài)。
2.2 發(fā)送模塊
在發(fā)送過程中,當(dāng)發(fā)送數(shù)據(jù)裝載到發(fā)送保持寄存器后,串行數(shù)據(jù)將自動使能從而進(jìn)行數(shù)據(jù)傳輸。首先一個開始位被發(fā)送出去,同時發(fā)送數(shù)據(jù)由發(fā)送保持寄存器裝載到發(fā)送移位寄存器中,而將數(shù)據(jù)以波特率時鐘逐位發(fā)送出去,并按照線性控制寄存器的要求加上奇偶校驗位和停止位。其時鐘、幀結(jié)構(gòu)配置和工作過程與接收模塊類似,因此,發(fā)送模塊也可以通過相似的狀態(tài)機(jī)實現(xiàn)。
2.3 中斷仲裁模塊
UART的中斷分為4個等級,其對應(yīng)的中斷事件為:接收模塊線性狀態(tài)、接收數(shù)據(jù)準(zhǔn)備就緒、發(fā)送保持寄存器空和MODEM狀態(tài),它們記錄在中斷識別寄存器中。UART通過讀取中斷識別寄存器檢測所有的中斷信號,然后指明優(yōu)先級最高的中斷給外部接口。該模塊使用狀態(tài)機(jī)實現(xiàn)時,共分為5個狀態(tài),其中4個等級的中斷各為一個狀態(tài),外加一個空閑狀態(tài),根據(jù)每次讀取中段識別寄存器的結(jié)果確定應(yīng)進(jìn)入哪一狀態(tài),從而保證了各級中斷依次被響應(yīng)。
2.4 MODEM控制器模塊
在UART中,MODEM控制器模塊的作用是用來和外部的調(diào)制解調(diào)器或者其他的UART設(shè)備進(jìn)行通信,它主要通過MODEM控制器和MODEM狀態(tài)寄存器來進(jìn)行具體操作。MODEM控制器用來控制DTRn(Data Terminal Ready)和RTSn(Request To Send)的輸出狀態(tài)。DCDn(Data Carrier Detect)、CTSn(Clear To Send)、DSRn(Data Set Ready)和RIn(Ring Indicator)的線性狀態(tài)由MODEM控制模塊來監(jiān)控,同時存儲于MODEM狀態(tài)寄存器中。
3 基于UART的FPGA設(shè)計驗證方法
對于大多數(shù)FPGA設(shè)計來講,UART也可以作為設(shè)計模塊與PC的接口嵌入到FPGA芯片當(dāng)中,通過RS 232接口連接到計算機(jī),使用相關(guān)的串口調(diào)試軟件即可在計算機(jī)上對FPGA進(jìn)行數(shù)據(jù)的輸入,并且在顯示器上直接觀察到其輸出的結(jié)果,這樣就衍生出一種針對FPGA設(shè)計功能驗證的直觀有效的方法,即基于UART與串口調(diào)試軟件的功能驗證方法。該方法的關(guān)鍵在于如何將UART嵌入待驗證的模塊,本文以卷積編碼加交織模塊為例,詳細(xì)介紹其與UART的連接方法,連接示意圖如圖3所示。

在本方案中,每次實驗由鍵盤輸入26 b數(shù)據(jù),通過串口調(diào)試軟件和UART發(fā)送到FPGA芯片,經(jīng)碼率為1/2的卷積編碼后得到52 b數(shù)據(jù)進(jìn)行交織,交織后的數(shù)據(jù)分為4 b一組送到UART發(fā)送模塊,經(jīng)UART通過串口發(fā)送到計算機(jī)上,最終在屏幕上看到編碼和交織的結(jié)果。
卷積編碼模塊采用Xilinx的IP核實現(xiàn),該模塊要求串行輸入,而UART接收模塊的輸出為8位并行數(shù)據(jù),故在他們之間加上并串轉(zhuǎn)換模塊。隨著每一次并行數(shù)據(jù)的寫入,并串轉(zhuǎn)換模塊會接收到一個寫入的指示信號,同時開始順序輸出8位串行數(shù)據(jù)到卷積編碼模塊。卷積編碼器的輸出是2位并行數(shù)據(jù),由于先前的接收模塊及串并轉(zhuǎn)換模塊每次處理8 b數(shù)據(jù)的關(guān)系,故可以認(rèn)為卷積編碼器每次連續(xù)輸出8個2位并行數(shù)據(jù),而我們的系統(tǒng)要求每26個輸入比特進(jìn)行一次卷積編碼和交織,所以在編碼和交織之間連接一個FIFO作為數(shù)據(jù)緩沖,累計到26 b數(shù)據(jù)后輸出一次,同時設(shè)置其輸入為2 b并行,輸出為串行,即實現(xiàn)了并串轉(zhuǎn)換的功能,滿足了交織器串行數(shù)據(jù)輸入的要求。最后發(fā)送回計算機(jī)的數(shù)據(jù)為52 b,所以對UART發(fā)送模塊作了簡單的修改,使其每次發(fā)送4 b數(shù)據(jù),這樣就可以將52 b分13次發(fā)完,同時為了實現(xiàn)交織器輸出的連續(xù)數(shù)據(jù)與UART的銜接,我們在此處再加一個FIFO作為緩沖以及串并轉(zhuǎn)換,將輸入的串行數(shù)據(jù)變?yōu)? b并行數(shù)據(jù)逐次發(fā)送。
這些模塊的工作都由一些控制信號來指示,所以本例中采用了一個自己編寫的控制信號模塊來生成這些指示信號,比如每次UART接收到數(shù)據(jù)后即產(chǎn)生一個寫入信號指示串并轉(zhuǎn)換模塊開始工作,同時在其輸出有效時產(chǎn)生信號告訴編碼器開始工作;同理,兩個FIFO何時接收數(shù)據(jù)、何時輸出數(shù)據(jù)以及交織器何時工作都受該模塊產(chǎn)生的信號控制,這樣,就能夠保證多個模塊協(xié)調(diào)統(tǒng)一的工作。
將輸入數(shù)據(jù)1101 0101 0101 1101 0111 1111 0110 01通過計算機(jī)發(fā)送到UART,按照每幀8 b的要求將該26 b的數(shù)據(jù)補(bǔ)0至32位,得到數(shù)據(jù)1101 0101 0101 1101 0111 1111 0110 0100 0000,轉(zhuǎn)換成16進(jìn)制為D55D7F40,寫入FPGA進(jìn)行編碼交織再經(jīng)由UART傳回計算機(jī)得數(shù)據(jù)0D 0E 06 0B 00 0C 0C 09 03 0C 04 0C 0D,如圖4所示。每8位數(shù)據(jù)取后4位得D E 6 B 0 C C 9 3 C 4 C D,轉(zhuǎn)換為二進(jìn)制得1101 1110 0110 1011 0000 1100 1100 1001 0011 1100 0100 1100 1101。通過Matlab進(jìn)行理論驗證,確為我們采用的(2,1,7)卷積編碼(171,133)再經(jīng)交織后得到的輸出。同時該實驗也驗證了UART在實際應(yīng)用中的效果。

4 結(jié) 語
使用FPGA實現(xiàn)UART模塊的功能,可以減小系統(tǒng)面積,降低功耗,同時使得設(shè)計更加緊湊和穩(wěn)定。本文使用VHDL語言在Xilinx公司FPGA芯片Vertax II Pro上實現(xiàn)了標(biāo)準(zhǔn)UART模塊并加以驗證[4],在某些具體應(yīng)用中,也可以將本實現(xiàn)中的發(fā)送和接收模塊單獨(dú)使用,進(jìn)一步體現(xiàn)了FPGA設(shè)計的靈活性。此外,本設(shè)計的驗證方案也能夠用來驗證FPGA設(shè)計的功能,只要將UART集成在需要驗證的模塊上,就可以通過連接開發(fā)系統(tǒng)與計算機(jī),在PC終端方便地觀察系統(tǒng)的輸入和輸出,為FPGA設(shè)計的功能驗證提出了新的方法。
參 考 文 獻(xiàn)
[1]姜寧,范多旺.基于FPGA/CPLD的通用異步通信接口UART的設(shè)計[J].信息技術(shù)與信息化,2006(1):86-87.
[2]黃智偉.FPGA系統(tǒng)設(shè)計與實踐[M].北京:電子工業(yè)出版社,2005.
[3]趙鑫,蔣亮.VHDL與數(shù)字電路設(shè)計[M].北京:機(jī)械工業(yè)出版社,2005.
[4]Xilinx.Virtex-Ⅱ Platform FPGA User Guide.http://www.Xilinx.com.
[5]聶濤,許世宏.基于FPGA的UART設(shè)計.現(xiàn)代電子技術(shù),2006,29(2):31-33,36.