《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 可編程邏輯 > 設(shè)計應(yīng)用 > 用FPGA器件實現(xiàn)UART核心功能的一種方法
用FPGA器件實現(xiàn)UART核心功能的一種方法
摘要: 對于多串口的設(shè)備或需要加密通訊的場合使用UART也不是最合適的。如果設(shè)計上用到了FPGA/CPLD器件,,那么就可以將所需要的UART功能集成到FPGA內(nèi)部。
關(guān)鍵詞: FPGA UART
Abstract:
Key words :

串行外設(shè)都會用到RS232-C異步串行接口,,傳統(tǒng)上采用專用的集成電路即UART實現(xiàn),如TI,、EXAR,、EPIC的550、452等系列,,但是我們一般不需要使用完整的UART的功能,,而且對于多串口的設(shè)備或需要加密通訊的場合使用UART也不是最合適的。如果設(shè)計上用到了FPGA/CPLD器件,,那么就可以將所需要的UART功能集成到FPGA內(nèi)部,,本人最近在用XILINX的XCS30做一個設(shè)計的時候,就使用VHDL將UADT的核心功能集成了,,從而使整個設(shè)計更加緊湊,,更小巧、穩(wěn)定,、可靠,,下面就談?wù)勗O(shè)計方法。

分析UART的結(jié)構(gòu),,可以看出UART主要由數(shù)據(jù)總線接口,、控制邏輯和狀態(tài)接口、波特率發(fā)生器,、發(fā)送和接受等部分組成,,各部分間關(guān)系如圖一。

用FPGA器件實現(xiàn)UART核心功能的一種方法

 

了解了UART的各部分組成結(jié)構(gòu)后,,下面對各部分的功能進(jìn)行詳細(xì)的分析,。我們假定所要設(shè)計的UART為:數(shù)據(jù)位為7位,、8位可選,,波特率可選,,效驗方式為奇、偶,、無等效驗方式,,下面的分析都是在這個假定的基礎(chǔ)上進(jìn)行。

一,、波特率發(fā)生部分

從圖一可以看出,,UART的接收和發(fā)送是按照相同的波特率進(jìn)行收發(fā)的(當(dāng)然也可以實現(xiàn)成對的不同波特率進(jìn)行收發(fā)),波特率是可以通過CPU的總線接口設(shè)置的,。UART收發(fā)的每一個數(shù)據(jù)寬度都是波特率發(fā)生器輸出的時鐘周期的16倍,,即假定當(dāng)前按照9600bps進(jìn)行收發(fā),那么波特率發(fā)生器輸出的時鐘頻率應(yīng)為9600*16Hz,,當(dāng)然這也是可以改變的,,我們只是按照UART的方法進(jìn)行設(shè)計。

我們假定提供的時鐘為1.8432MHz,,那么可以很簡單地用CPU寫入不同的數(shù)值到波特率保持寄存器,,然后用計數(shù)器的方式生成所需要的各種波特率,這個值的計算原則就是1843200/(16*所期望的波特率),,如果希望輸出9600Hz的波特率,,那么這個值就是1843200/(16*9600)=12(0CH)。

二,、 發(fā)送部分

這里應(yīng)重點分析幾個問題:首先是何時CPU可以往發(fā)送保持寄存器(THR)寫人數(shù)據(jù),?也就是說CPU要寫數(shù)據(jù)到THR時必須判一個狀態(tài),當(dāng)前是否可寫,?很明顯如果不判這個條件,,發(fā)送的數(shù)據(jù)會出錯,除非CPU寫入THR的頻率低于當(dāng)前傳輸?shù)牟ㄌ芈?,而這種情況是極少出現(xiàn)的,。其次是CPU寫入數(shù)據(jù)到THR后,何時THR的數(shù)據(jù)傳送到發(fā)送移位寄存器(TSR)并何時移位,?即如何處理THR和TSR的關(guān)系,?再次是數(shù)據(jù)位有7、8位兩種,,校驗位有三種形式,,這樣發(fā)送一個字節(jié)可能有9、10,、11位三種串行長度,,所以我們必須按照所設(shè)置的傳輸情況進(jìn)行處理。數(shù)據(jù)位、效驗方式可以通過CPU寫一個端口來設(shè)置,,發(fā)送和接受都根據(jù)這個設(shè)置進(jìn)行,,由于這部分很簡單,所以我就不給出程序了,。

根據(jù)上面的分析,,引進(jìn)了幾個信號:

bigin1、begin2:引入兩個附加移位,,目的是為送出起始位,、停止位而加入串行長度。

txdone7,、txdone8:分別表示7,、8位的結(jié)束標(biāo)志。Txdone<=txdone8 when“8bit”else txdone7;

Paritycycle7,、paritycycle8:分別表示7,、8位下的校驗位。Parity<=parity8 when“8 bit”else parity7;

Writerdy:為0時表示CPU不能將數(shù)據(jù)寫入THR,,為1時可以寫入,。

這樣就可以得到以下信息:在移位時鐘的上升沿檢測到txdone和writerdy都為高電平時,進(jìn)入LOAD狀態(tài)即將THR的數(shù)據(jù)LOAD到TSR,,在下一個時鐘就進(jìn)入移位狀態(tài),。在移位中同時進(jìn)行校驗位的運算,在需要送出校驗位的時候?qū)⑦\算好的校驗位送出,,txdone=1的時候?qū)⒏唠娖剿统?,其它時候移位輸出。

最后還有一個小程序,,那就是寫出writerdy的狀態(tài),,很明顯沒數(shù)據(jù)寫入時為高,而當(dāng)txdone為低時為低,,注意這里也必須同時同步,。圖二給出了一個奇效驗8bit數(shù)據(jù)的發(fā)送時序圖。

用FPGA器件實現(xiàn)UART核心功能的一種方法

 

三,、 接受部分

對于接收同樣存在9,、10、11位三種串行數(shù)據(jù)長度的問題,,必須根據(jù)所設(shè)置的情況而將數(shù)據(jù)完整地取下來,。接收還有一個特別的情況,那就是它的移位的時鐘不是一直存在的,,這個時鐘必須在接受到起始位的中間開始產(chǎn)生,,到停止位的中間結(jié)束,。接受到停止位后,必須給出中斷,,并提供相應(yīng)的校驗出錯,、FRAME錯以及溢出等狀態(tài)。

這樣需引入hunt和idle兩個信號,,其中hunt為高表示捕捉到起始位,,idle為高表示不在移位狀態(tài),利用這兩個信號就可以生成接收所需要的移位時鐘,。

下面還有一個小程序,就是如何將接收的狀態(tài)和標(biāo)志表示出來,。溢出標(biāo)志很簡單,,那就是在idle從低變高,也就是說在接收到一個完整的串行序列后,,去判一下當(dāng)前的中斷是否有效,?(高有效,數(shù)據(jù)沒有被讀走)如果為高那么溢出,,否則沒有,。在移位的時候,同時對接收的數(shù)據(jù)進(jìn)行校驗,,這樣就可以判斷接收的數(shù)據(jù)是否有錯,,在接收完成時判一下當(dāng)前的RX是否為高電平就可以知道FRAME是否有錯,圖三是一個8bit奇校驗的接收時序圖(假定接收正確,,所以沒有給出校驗,、溢出、幀出錯信號),。

 

 

用FPGA器件實現(xiàn)UART核心功能的一種方法

 

 

總結(jié):我在用FPGA做一個設(shè)計的時候,,由于還有資源而且正好用到UART,所以就根據(jù)對UART的認(rèn)識進(jìn)行了設(shè)計,,全部用VHDL進(jìn)行描述,,用SPEEDWAVE進(jìn)行語言級的仿真,用XILINX的F2.1進(jìn)行頂層仿真,,最后和PC的仿真終端進(jìn)行聯(lián)機,,功能一切正常,整個UART所需要的觸發(fā)器為80個左右,,一般的PLD都可以完成,。

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