楊宗國 李艷萍
摘 要:為了實現計算機與基于FPGA圖像處理系統的數據通信,這里用FPGA設計了一款簡易通用異步收發器(UART)模塊。UART的主要功能是實現數據處理模塊與RS 232串行數據接口之間的數據轉換,即將送過來的并行數據轉換為輸出的串行數據流,由數據處理模塊傳送給計算機,還可以將串行數據轉換為并行數據,供數據處理模塊使用。為了簡化電路設計,減少電路面積,這里省略了UART系統中的奇偶檢驗模塊。
關鍵詞:FPGA;VHDL;串/并轉換;并/串轉換;UART
中圖分類號:TN971文獻標識碼:B
文章編號:1004 373X(2009)02 019 04
Design of UART Module Based on FPGA
YANG Zongguo,LI Yanping
(College of Information Engineering,Taiyuan University of Technology,Taiyuan,030024,China)
Abstract:To realize data communication between computer and FPGA-based image processing system,a simple Universal Asynchronous Receiver Transmitter(UART)is designed by FPGA.The main function of UART is to realize data conversion between data disposal module and RS 232 serial port,that is to say,parallel data trinsmitted by data disposal module is converted into serial data flow,then it is transmitted into computer,the serial data is converted into parallel data for the usage of data disposal module.For predigesting circuit design and reducing electrocircuit proportion,parity check module is not needed.
Keywords:FPGA;VHDL;S/P conversion;P/S conversion;UART
0 引 言
在計算機的數據通信中,外設一般不能與計算機直接相連,它們之間的信息交換主要存在以下問題:
(1) 速度不匹配。
外設的工作速度和計算機的工作速度不一樣,而且外設之間的工作速度差異也比較大。
(2) 數據格式不匹配。
不同的外設在進行信息存儲和處理時的數據格式可能不同,例如最基本的數據格式可分為并行數據和串行數據。
(3) 信息類型不匹配。
不同的外設可能采用不同類型的型號,有些是模擬信號,有些是數字信號,因此采用的處理方式也不同。
為了解決外設和計算機之間的信息交換問題,即需要設計一個信息交換的中間環節接口。UART控制器是最常用的接口。
通用異步收發器(Universal Asynchronous Receiver/Transmitter,UART)是輔助計算機與串行設備之間的通信,作為RS 232通信接口的一個重要的部分,目前大部分的處理器都集成了UART。
1 UART的數據格式
UART的數據傳輸格式如圖1所示。
由于數字圖像亞像素在計算機中是用8位二進制表示,因此UART傳輸的有效數據位為8位。傳輸線在空閑時為高電平,因此有效數據流的開始位設為0。接著傳輸8位有效數據位,先從最低位開始傳送。奇偶檢驗位可以設置為奇檢驗、偶校驗或者不設置校驗位,由于本系統使用的傳輸速率不高,為了加快開發進程,減少電路面積,因此沒有設計奇偶檢驗模塊,數據流中不設奇偶檢驗位。最后停止位為高電平。
2 UART的基本結構
設計的UART主要由UART內核、信號檢測器、移位寄存器、波特率發生器和計數器組成,如圖2所示。UART各個功能模塊的功能如下文所述。
2.1 信號檢測器模塊
信號檢測器用于對RS 232的輸入信號進行實時監測,一旦發現新的數據則立即通知UART內核。信號檢測器的仿真波形如圖3所示。
其中,RxD第一次為低時,new_data信號闡述輸出,之后RxD又變低,但由于信號檢測器處于鎖定狀態,所以new_data信號并沒有輸出;最后,reset_n信號將信號檢測器復位,RxD再次變低時,new_data又有輸出。可見信號檢測器的實現完全正確,其功能完全符合設計要求。
2.2 移位寄存器模塊
移位寄存器模塊的作用是存儲輸入或者輸出數據。當UART接收RS 232輸入時,移位寄存器在波特率模式下采集RS 232輸入信號,且保存結果;當進行RS 232輸出時,UART內核首先將數據加載到移位寄存器內,再使移位寄存器在波特率模式下將數據輸出到RS 232輸出端口上。移位寄存器的仿真波形圖如圖4所示。
如圖4所示,移位寄存器在復位后的每個時鐘的上升沿工作。由于數據發送時是先發送有效數據的最低位,因此移位寄存器是將接收的數據由高位向低位移動,dout輸出移位寄存器的最低位。圖中的regs數據用16進制表示。
2.3 波特率發生器模塊
波特率發生器的功能是產生和RS 232通信所采用的波特率同步的時鐘,這樣才能方便地按照RS 232串行通信的時序要求進行數據接收或者發送。比如,波特率為9 600 b/s,即每秒傳輸9 600 b數據,則同步的波特率時鐘頻率為9 600 Hz,周期為1/9 600=0.104 17。
設計波特率時鐘的基本思路就是設計一個計數器,該計數器工作在速度很高的系統時鐘下,當計數器計數到某數值時將輸出置高,再計數到一定的數值后再將輸出置低,如此反復便能夠得到所需的波特率時鐘。該系統所用的FPGA系統時鐘為50 MHz,RS 232通信的波特率為9 600b/s,則波特率時鐘的每個周期相當于50×1069 6005 208個系統時鐘周期。假如要得到占空比為50%的波特率時鐘,只要使得計數器在計數到1 604時將輸出置高,之后在計數到5 208時將輸出置低并且重新計數,就能實現和9 600波特率同步的時鐘。
為了便于仿真,使計數器計到2時將輸出置高,之后計到4時將輸出置地并且重新計數。波特率發生器的仿真波形圖如圖5所示。
觀察波形可以看到波特率發生器每經過4個時鐘周期輸出1個完整的波特率時鐘周期,占空比為1/2,并且在每次輸出波特率時鐘周期之后輸出1個系統時鐘脈寬的提示信號indicator,UART通過此信號來了解波特率發生器已輸出的波特率時鐘周期個數。由波形圖可見波特率發生器的工作完全滿足設計的要求。
2.4 計數器模塊
計數器模塊的功能是可控的,在輸入時鐘的驅動下進行計數,當達到計數上閾時給UART內核一個提示信號。在不同的工作狀態下,計數器模塊的輸入時鐘是不同的。UART在數據發送之前需要進行數據加載(即將串行序列保存在移位寄存器內),在此工程中計數器模塊的輸入時鐘為系統時鐘,因為此時移位寄存器也工作在系統時鐘下。除了數據加載,另外2個需要計數器模塊的過程是數據接收和數據發送。由于這兩個過程中移位寄存器工作在波特率時鐘下,所以計數器模塊的時鐘就是與波特率時鐘同步的波特率發生器提示信號indicator,這樣每輸出1個完整的波特率時鐘周期計數器就能增加1。
計數器的仿真波形圖如圖6所示。
計數器在復位后并且ce有效時開始計數,并且在第10個時鐘周期輸出提示信號overflow。
2.5 發送數據緩沖器模塊
發送數據緩沖器模塊的功能是將要發送的并行數據轉換成串行數據,并且在輸出的串行數據流中加人起始位和停止位。緩沖器首先將要發送的8位數據寄存,并在最低位后添加起始位‘0,在最高位前添加停止位‘1,組成10位要發送的數據,然后根據UART內核模塊的計數值將相應的數據送入移位寄存器輸入端。UART內核模塊輸出的計數值是從0依次計到9,即先將要發送數據的最低位送入移位寄存器。發送數據緩沖器的仿真波形圖如圖7所示。
由波形圖可知,發送數據緩沖器在復位后,在輸入的計數值si_count為0時,send_si輸出起始位‘0。在輸入的計數值si_count為1~8時,send_si分別輸出send_bus上相應的數據位。在輸入的計數值si_count為9時,send_si輸出停止位‘1。
2.6 UART內核模塊
UART內核模塊是整個設計的核心。在數據接收時,UART內核模塊負責控制波特率發生器和移位寄存器,使得移位寄存器在波特率時鐘的驅動下同步地接收并且保存RS 232接收端口上的數據。在數據發送時,UART內核模塊首先根據待發送數據產生完整的發送數據序列(包括起始位、數據位和停止位),之后控制移位寄存器將序列加載到移位寄存器的內部寄存器里,最后再控制波特率發生器驅動移位寄存器將數據串行輸出。
UART內核模塊的主要功能是控制數據接收、數據加載和數據發送的過程,這可以用狀態機來實現,其狀態圖如圖8所示。
)數據加載過程。
數據的接收過程可以定義3個狀態:空閑“idle”狀態、接收“receive”和接收完成“receive_over”。UART內核模塊在復位后進入空閑狀態。如果信號檢測器檢測到數據傳輸,即new_data=‘1,UART內核檢測到此信號就會進入接收狀態。在UART進入由空閑狀態轉為接收狀態過程中,需要進行一系列的接收預備操作,包括將子模塊復位、選擇移位寄存器串行輸入數據以及選擇移位寄存器的輸入時鐘等。進入接收狀態后,波特率發生器開始工作,其輸出波特率時鐘驅動移位寄存器同步的存儲RS 232接收端口上的數據,并且其提示信號“indicator”驅動計數器進行計數。當所有數據接收完成,計數器也達到了其計數的上閾,此時overflow=‘1,通知UART內核進入接收狀態。UART內核進入接收完成狀態的同時,會檢查奇偶校驗的結果,同時使得子模塊使能信號無效,以停止各個子模塊。
UART內核的接收完成狀態僅保持1個時鐘周期,設置這個狀態的作用是借用一個時鐘周期復位信號檢測器,準備接收下次數據傳輸。
(2) 數據加載和發送過程。
數據加載和發送的過程都是為發送數據而設定的,所以將它們放在一起進行介紹,可以用4個狀態來實現上述的過程,即空閑、加載、發送和發送完成。其中的空閑狀態是UART內核復位后的空閑狀態,與上面介紹的數據接收過程的空閑狀態一致。數據加載過程在數據發送過程之前進行。UART內核復位后進入空閑狀態,當探測到發送控制信號有效時,即send=‘1,便會進入加載狀態開始數據加載。在進入加載狀態的同時,UART內核會將移位寄存器、計數器復位,并且通過選擇信號使得移位寄存器的輸入為發送數據緩沖器模塊產生的串行數據序列,使得移位寄存器和計數器的工作時鐘為系統時鐘。進入加載狀態后,在UART內核控制下,發送數據緩沖器模塊會將完整的待發送序列加載到移位寄存器的數據輸入端,發送的序列是和系統時鐘同步的,移位寄存器在系統時鐘的驅動下不斷讀入輸入端數據并保存在內部寄存器內。在移位寄存器加載數據的同時,計數器也在時鐘的驅動下進行計數,由于都是工作在系統時鐘下,所以當所有數據被加載時,計數器也達到了計數的上閾(即串行數據的總量),此時overflow=‘1,通知UART內核進入發送狀態。UART內核進入發送狀態的同時會改變幾個選擇信號,比如將移位寄存器的時鐘設為波特率時鐘,將計數器時鐘設為波特率的提示信號,最重要的是將輸出信號送到RS 232的發送端口TxD上。發送的過程和接收類似,移位寄存器在波特率時鐘的驅動下內部寄存器的數據串行的發送出去,同時計數器在波特率發生器的提示信號驅動下進行計數。UART內核在計數器到達計數上閾后便進入發送完成模式,并且輸出發送完成信號。
3 UART頂層模塊的仿真測試
將上述各個模塊的VHDL代碼生成原理圖符號,并在原理圖編輯工具中將各個模塊連接起組成1個完整的UART模塊。為了驗證UART模塊的正確性,對UART的發送過程和接收過程分別進行了波形仿真。為便于觀察波形,波特率產生器設置為4個系統時鐘產生一個完整的波特率時鐘。圖9是UART模塊接收過程的仿真波形圖。
由仿真波形圖可以看出,接收端RxD上的數據序列為0101010101,起始位‘0后為數據位“10101010”,最后一位為停止位‘1。在10個波特率時鐘之后,UART發出1個接收完成信號recv=‘1,并在數據輸出端“new_data”將接收的數據輸出給后續數據處理模塊。由于發送數據時首先發送數據的最低位,因此接收的數據應為“01010101”,將光條放置數據輸出端“new_data”的數據輸出波形上,可以從數據欄看到此時數據輸出端new_data=“01010101”,UART數據接收功能完全正確。
圖10為UART發送過程仿真波形。由圖可以看出,send=‘1后待發送數據為“01010101”,將待發送數據加上起始位和停止位,并從最低位開始發送,則發送端txd上的數據序列為“0101010101”,發送停止位后,發送結束信號send_over=‘1。圖10證明UART數據發送功能完全正確。
4 結 語
介紹了UART在可編程邏輯器件FPGA上的實現,并通過實際電路驗證了設計的功能,使用FPGA不僅可以方便地用串口協議與PC機進行串行通信,而且擴展了板級系統的接口功能。應用在可編程器件FPGA內部,可以很大程度地減少電路板的使用面積,并提高系統的穩定性和可編程性。
參考文獻
[1]劉韜,樓興華.FPGA數字電子系統設計與開發實例導航.北京:人民郵電出版社,2005.
[2]侯伯亨.VHDL硬件描述語言與數字邏輯電路設計.西安:西安電子科技大學出版社,1999.
[3]褚振勇,齊亮.FPGA設計及應用.2版.西安:西安電子科技大學出版社,2006.
[4]朱明程.FPGA原理及應用設計[M].北京:電子工業出版社,2001.
[5]MEYER-BAESE U.數字信號處理的FPGA實現[M].劉凌,胡永生,譯.北京:清華大學出版社,2003.
[6]聶濤,許世宏.基于FPGA的UART設計.現代電子技術,2006,29(2):127-129.
作者簡介 楊宗國 男,1981年出生,太原理工大學碩士研究生。研究方向為信號與信息處理。
李艷萍 女,1963年出生,副教授,碩士生導師。研究方向為移動通信系統的信道估計與信號檢測。