摘 要:UART作為RS 232協議的控制接口得到了廣泛的應用,基于FPGA實現的UART設計可以使系統更加緊湊、穩定。系統結構進行了模塊化分解,使之適應自頂向下(Top Down)的設計方法。核心部分采用有限狀態機(FSM)實現,使控制邏輯直觀簡單,提高了設計效率。通過與計算機間的數據通信對設計的功能進行了驗證,在此基礎上衍生出一種將UART模塊嵌入FPGA芯片與計算機互聯進行功能驗證和調試的新方法。
關鍵詞:通用異步收發器;串口通信;現場可編程邏輯器件;有限狀態機
中圖分類號:TP29 文獻標識碼: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
通用異步收發器(Universal Asynchronous Receiver Transmitter,UART)是數字通信領域流行和廣泛使用的一種接口設備,主要用來控制符合RS 232-C協議的計算機與串行設備間的通信。普通串行外設和計算機間的通信,一般使用通用的串行接口芯片,但是這種接口芯片存在體積較大、接口復雜以及成本較高的缺點,會使得硬件設計更加復雜,并且結構與功能相對固定,無法根據設計的需要對其邏輯控制進行靈活的修改。而目前日趨成熟的SOC技術則要求將整個設計的功能集成在單片或幾塊芯片當中,因此,將UART的功能集成在FPGA芯片當中,可以使整個系統更為靈活、緊湊,性能也更加穩定[1]。本文提出了一種使用VHDL語言開發UART的方法,實現了FPGA與計算機之間的數據通信,并將其應用于FPGA芯片開發的功能驗證當中,從而衍生出了將UART嵌入到FPGA芯片,與計算機互聯的一種直觀的FPGA設計的驗證和調試方法。
1 UART通信原理
UART采用通用的RS 232-C串行接口標準,該協議的優點是使用廣泛,幾乎所有計算機和串行外設當中都置有這種接口,其傳輸距離可達15 m,并且實現較簡單,用于雙向連接時最少只需要2條導線即可實現基本通信。UART的具體幀格式如圖1所示,每幀數據由開始位、數據位、奇偶校驗位和停止位四部分依次組成[2]。其中,開始位為低電平;數據位長度為5,6,7,8不等;奇偶校驗的模式有無校驗、奇校驗、偶校驗、粘附校驗1和粘附校驗0;停止位為高電平,具體長度為1位、1.5位和2位不等,這些選項都通過UART內部的線性控制寄存器來確定。當沒有數據發送時,發送和接收引腳都保持高電平。

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

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

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

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