羅春梅 肖順文 王涌



摘要:本設計采用Verilog_HDL語言設計實現UART系統。該系統由波特率時鐘生成模塊、數據發(fā)送模塊和數據接收模塊等三個模塊組成。經Modelsim模擬仿真顯示,各模塊設計均滿足要求,數據傳輸速率高、數據傳輸準確。
關鍵詞:FPGA;UART;異步串行通信;Modelsim仿真
中圖分類號:TN92 文獻標識碼:A 文章編號:1007-9416(2019)03-0150-02
0 引言
通用異步收發(fā)傳輸器UART(Universal Asynchronous Receiver and Transmitter)使用非常廣泛,只需一根數據傳輸線和幾根信號線就可以完成計算機與外部設備的通信,并且支持全雙工通信,節(jié)約了傳輸成本[1]。本文采用Verilog_HDL語言設計實現UART,這種接口比專用的UART器件更加簡單、資源利用率更高,能夠完成數據的發(fā)送和接收。
1 異步串行通信原理
異步串行通信是以字符為單位進行傳輸的,傳輸時,嚴格按照UART幀格式來進行傳輸。UART數據幀格式包含1位起始位、數據位(可以設置為5~8位)、1位奇偶校驗位(可有可無)、停止位(可以設置為1、1.5或2位)[2]。發(fā)送方就是按照此順序一位一位的來進行發(fā)送,再通過數據傳輸線逐次被接收方接收。UART數據幀格式如圖1所示。
由于異步通信兩端的時鐘不同,所以設置起始位和停止位可以保證發(fā)送和接收同步。本系統采用1位起始位、8位數據位、1位停止位的幀格式,即一幀數據共有10位。
2 UART系統設計
本系統基于FPGA實現UART系統,包括三個主模塊:波特率生成模塊、數據發(fā)送模塊和數據接收模塊。
2.1 波特率時鐘生成模塊
波特率是指每秒傳送的字節(jié)數,是收發(fā)雙方共同約定的系統傳輸速率。本系統的系統時鐘設為50M,對系統時鐘進行分頻就可以生成想要的波特率時鐘[3]。為了能從外部來修改波特率,設置了一個波特率選擇端口,設置該端口的值就可以選擇自己想要的波特率,它的原理其實就是設置了一個數據選擇器,端口取不同值時,使得分頻系數取不同值,由此便改變了波特率。端口取各值時,對應波特率為:00對應9600HZ;01對應19200HZ;10對應38400HZ;11對應115200HZ。
2.2 數據發(fā)送模塊
該模塊的采樣時鐘即為波特率時鐘,假設波特率設置為115200HZ,系統時鐘是50M,則分頻系數[4],完成一幀數據的發(fā)送,需要10個波特率時鐘周期,即為。則一幀數據就需要11個波特率脈沖來進行傳輸,第11個時鐘到來就意味著一幀數據發(fā)送完成。一幀數據的發(fā)送時序圖如圖2所示。
從圖2中可以看出,波特率時鐘到來之前,數據線一直置“1”,在時鐘的第一個上升沿到來時,開始發(fā)送第一位即起始位“0”,之后的每一個時鐘上升沿就發(fā)送一位,而特別需要注意的是,數據位的發(fā)送是由低到高依次發(fā)送。
2.3 數據接收模塊
數據接收過程中,在對傳輸線上的數據進行采樣時,通常將每一位的中間時刻視作是最穩(wěn)定的,所以中間點的采樣電平就被認為是該位的電平。然而在數據接收時,有可能發(fā)生外部干擾促使電平反轉的情況,所以只采樣一次是不準確的[4]。為了解決這個問題,對每一位數據都設置了六次采樣,根據這六次采樣結果來判斷該位的電平狀態(tài),將出現次數較多的采樣電平當作該位的真實電平,若是兩者一樣多,則視為數據不可靠,不執(zhí)行任何操作[5]。一位數據的接收原理圖如圖3所示。
從圖3中,把一位數據分成了16小段,在6個中間時刻對其進行采樣,圖中的①②③④⑤⑥即為六個采樣時刻。根據這種采樣方式可知,實際采樣頻率應該是16倍的波特率。其中,要特別注意起始位的判斷,因為有時候干擾信號也會使得下降沿出現。在數據線上有下降沿出現時,假設它就是起始位,接著在六個中間時刻對它進行采樣,若是6次采樣結果中,低電平出現的次數比較多,那么它就是真正的起始位,否則,它就不是起始位,應當繼續(xù)等待真正的起始位。
3 UART系統仿真測試及分析
編寫測試腳本后,在Modelsim中分別對發(fā)送模塊和接收模塊進行仿真測試,測試結果如圖4、圖5所示。
從圖4中可以看出,在復位信號置高及發(fā)送使能信號有效時,開始發(fā)送數據,此時,uart由空閑狀態(tài)轉換為發(fā)送狀態(tài),在一幀數據發(fā)送完畢后,uart又重新回到空閑狀態(tài),同時輸出一個時鐘周期高電平的發(fā)送結束信號。根據異步串行通信原理可知,待發(fā)送的八位并行數據為10111010時,數據線上的傳輸數據應當依次為0(起始位)、0、1、0、1、1、1、0、1、1(停止位)。與上圖進行對比后發(fā)現,每隔一個波特率時鐘便輸出一位數據,輸出的數據為0010111011[6]。并且此時波特率選擇端口值為11,說明波特率設置為115200HZ,發(fā)送一幀數據應該為86806ns,用光標進行測量,測量數據正確。這說明發(fā)送模塊設計正確,能夠滿足要求。
從圖5可以看出,復位電平置高且串行輸入有下降沿出現時,開始接收數據,在一幀數據接收完畢后,同時輸出接收結束信號。根據異步串行通信原理可知,在串行數據為0010101011時,它的數據位是01010101,則接收模塊收到的8位并行數據應該是10101010。與上圖進行對比后發(fā)現,接收模塊輸出的并行數據正是10101010。這說明接收模塊設計正確,能夠滿足要求。
4 結語
本系統采用Verilog_HDL硬件描述語言來實現通用異步收發(fā)器。根據功能需求,分別對UART的三個主模塊進行了設計。最終的仿真測試結果顯示,該設計完全滿足要求,能夠很好的進行數據的發(fā)送和接收。該設計簡單便捷,實用性高。
參考文獻
[1] 吳厚航.深入淺出玩轉 FPGA[M].北京:北京航空航天大學出版社,2010.
[2] 楊宗國,李艷萍.基于FPGA的UART模塊的設計[J].現代電子技術,2009(2):19-22.
[3] 賈亮,冀源.基于FPGA的串口通信控制器設計[J].微型機與應用,2016,35(22):33-35.
[4] 夏宇聞.Verilog 數字系統設計教程(第三版)[M].北京:北京航空航天大學出版社,2013.
[5] 袁玉卓,曾凱鋒,梅雪松.FPGA自學筆記-設計與驗證[M].北京:北京航空航天大學出版社,2017.
[6] 謝謝.基于FPGA的UART設計[J].電子設計工程,2016,20(16):51-53.
Design and Implementation of UART Based on FPGA
LUO Chun-Mei,XIAO Shun-Wen,WANG Yong
(School of Electronic and Information Engineering,China West Normal University,Nanchong Sichuan? 637009)
Abstract:This design uses Verilog_HDL language to achieve UART system. The system consists of three modules: the baud rate clock generation module, data sending module and data receiving module. Modelsim simulation shows that the design of each module complies with the requirements, with high data transmission rate and accurate data transmission.
Key words:FPGA;UART;Asynchronous serial communication;Modelsim simulation