文獻(xiàn)標(biāo)識碼: A
文章編號: 0258-7998(2013)01-0037-03
通用異步收發(fā)器UART(Universal Asynchronous Receiver/Transmitter)是串行通信的重要組成部分,其基本功能是實現(xiàn)數(shù)據(jù)的串行化/反串行化和錯誤校驗,這也是所有的UART設(shè)計都能實現(xiàn)的基本功能,但是其他各種功能都兼顧的設(shè)計非常少。參考文獻(xiàn)[1]設(shè)計了一個在MCU中運(yùn)用非常廣泛的UART接口,其功能比較全面,但是波特率產(chǎn)生器采用整數(shù)分頻的設(shè)計,導(dǎo)致系統(tǒng)只有在特定系統(tǒng)時鐘、特定波特率的情況下誤差才會比較小,不能滿足高波特率和非標(biāo)準(zhǔn)波特率的要求;參考文獻(xiàn)[2]設(shè)計的UART IP基本功能良好,但是不支持紅外、自動波特率檢測等功能;參考文獻(xiàn)[3]的設(shè)計只支持中斷模式,不支持DMA模式,不能滿足大量數(shù)據(jù)高速傳輸?shù)男枨?,且中斷總是打斷CPU的操作,效率較低。本文提出了一種多功能UART模塊的設(shè)計,并利用Verilog HDL語言進(jìn)行實現(xiàn)。本設(shè)計能滿足多模導(dǎo)航基帶芯片中的不同需求(如相關(guān)器數(shù)據(jù)的傳輸?shù)?,同時降低誤差,保證衛(wèi)星數(shù)據(jù)的正確性。
1 UART電路主要模塊設(shè)計
本設(shè)計采用標(biāo)準(zhǔn)的UART傳輸協(xié)議,字符幀由起始位、數(shù)據(jù)位、奇偶校驗位和停止位四部分組成[4]。UART電路包括UART總控模塊UART_CTRL、波特率產(chǎn)生器UART_BFG、數(shù)據(jù)發(fā)送模塊TRANSMITTER、數(shù)據(jù)接收模塊RECEIVER和FIFO模塊,其總體結(jié)構(gòu)圖如圖1所示。
1.1 接收模塊
串行數(shù)據(jù)幀和接收數(shù)據(jù)時鐘是異步的,由邏輯1跳變?yōu)檫壿?可視為一個數(shù)據(jù)幀的開始,所以接收器首先需要判斷起始位,常用的方法有三倍速采樣法和起始位中斷捕捉定時采樣法。據(jù)經(jīng)驗可知,數(shù)據(jù)的中間采樣值可靠性較高,可以采用中間時刻采樣法[2],并且,接收和發(fā)送單元的數(shù)據(jù)采樣率為波特率的16倍,可降低由于時鐘不匹配引起的誤采樣。接收器采用狀態(tài)機(jī)[2]實現(xiàn),狀態(tài)機(jī)的描述如下:
(1)RX_IDLE:當(dāng)UART接收器復(fù)位時,F(xiàn)SM處于這一狀態(tài)。在該狀態(tài)中,狀態(tài)機(jī)一直等待RXD電平跳變,即出現(xiàn)下降沿。檢測到起始位后,進(jìn)入RX_START狀態(tài)。
(2)RX_START:在該狀態(tài)下,在采樣時鐘的上升沿對URXD低電平進(jìn)行計數(shù)。當(dāng)計數(shù)為8(即確保在起始位的中間點(diǎn))時,轉(zhuǎn)到RX_DATA狀態(tài);如果邏輯零的個數(shù)少于8,則認(rèn)為是毛刺,跳回RX_IDLE狀態(tài)。
(3)RX_DATA:在該狀態(tài)下,每隔16個采樣時鐘采樣1 bit串行數(shù)據(jù),接收8 bit異步數(shù)據(jù)并進(jìn)行串/并轉(zhuǎn)換。同樣是對采樣時鐘的上升沿進(jìn)行計數(shù),當(dāng)計數(shù)值為16時進(jìn)行數(shù)據(jù)采樣。如果起始位為16位,則可以保證數(shù)據(jù)位都是在中點(diǎn)處被采樣,同時進(jìn)行串/并轉(zhuǎn)換。當(dāng)探測已經(jīng)接收到相應(yīng)位的數(shù)據(jù)后,進(jìn)入奇偶校驗狀態(tài)。
(4)RX_PARITY:該狀態(tài)的主要功能是奇偶校驗,通過對實際接收到的數(shù)據(jù)的奇偶性與發(fā)送過來的奇偶校驗位進(jìn)行比較,判斷奇偶校驗錯誤狀態(tài)。
(5)RX_STOP:對停止位進(jìn)行采樣,并且判斷停止位是否為1。若停止位不正確,則幀錯狀態(tài)位置1。
將接收到的數(shù)據(jù)和錯誤狀態(tài)數(shù)據(jù)一起寫入到接收FIFO中。接收到錯誤的數(shù)據(jù)后不馬上產(chǎn)生錯誤中斷,一旦數(shù)據(jù)被讀出,此時錯誤狀態(tài)也一起被讀出,立即產(chǎn)生錯誤中斷。
1.2 發(fā)送模塊
發(fā)送器實現(xiàn)的功能是將輸入的8 bit并行數(shù)據(jù)變成串行數(shù)據(jù),同時在數(shù)據(jù)位頭部加入起始位,在數(shù)據(jù)位尾部加奇偶校驗位和停止位。發(fā)送模塊的設(shè)計比較簡單,其狀態(tài)機(jī)與接收模塊相對應(yīng),在此不再贅述。
1.3 波特率產(chǎn)生模塊
波特率發(fā)生器一般采用分頻器實現(xiàn),傳統(tǒng)的采用整數(shù)分頻器實現(xiàn)的誤差在某些系統(tǒng)時鐘下超出了可控范圍,如在參考時鐘為16.37 MHz、波特率為460 Kb/s的情況下,誤差達(dá)到了11.2%,會導(dǎo)致數(shù)據(jù)傳輸?shù)腻e誤。因此,本設(shè)計采用小數(shù)分頻器實現(xiàn)相對準(zhǔn)確的波特率。另外,在收發(fā)的過程中,可以改變波特率寄存器的值,但實際波特率的改變發(fā)生在當(dāng)前幀傳輸完成之后。波特率產(chǎn)生模塊的電路結(jié)構(gòu)圖如圖2所示。
小數(shù)分頻的實現(xiàn)方法有很多,但其基本原理是一樣的,即在若干個分頻周期中采取某種方法使某幾個周期多計或少計一個數(shù),從而在整個分頻周期內(nèi)總體平均分頻數(shù)為小數(shù)分頻[5]。
通過采用小數(shù)分頻,大大降低了實際波特率與要求波特率之間的誤差。在正常情況下,誤差不應(yīng)超過2%,如果超過了,則需要相應(yīng)地提高系統(tǒng)時鐘來降低誤差。表1列出了19.2 MHz情況下的整數(shù)分頻和小數(shù)分頻波特率誤差對應(yīng)表,可以看到采用小數(shù)分頻的波特率誤差明顯較小。
在本設(shè)計中,發(fā)送器、接收器和波特率產(chǎn)生模塊是主要模塊。FIFO(先進(jìn)先出)模塊是數(shù)字電路設(shè)計中比較常用的模塊,本文復(fù)用了通用的FIFO模塊,在文中就不再贅述。UART的控制模塊主要負(fù)責(zé)對寄存器的相關(guān)操作,通過APB總線實現(xiàn),其電路設(shè)計比較簡單,也不再贅述。
2 UART模塊的其他功能
2.1 自動波特率檢測
UART接收通道在接收數(shù)據(jù)之前,如果發(fā)送端的波特率不清楚,可進(jìn)行自動波特率檢測。實現(xiàn)方法是:發(fā)送端間隔發(fā)送檢測字,間隔時間為傳輸一幀所需的時間。接收方UART根據(jù)start位來確定是否有數(shù)據(jù)在傳輸,當(dāng)其檢測到下降沿時就進(jìn)入RX_START的狀態(tài)中,在波特率不明確的情況下,并不產(chǎn)生采樣時鐘,用PCLK進(jìn)行采樣計數(shù)。由于start位為1 bit,根據(jù)計數(shù)值可知這1 bit所占用的時間。如果接收數(shù)據(jù)完成后,接收到的數(shù)據(jù)是約定值,則證明波特率檢測成功,可以將檢測到的值存儲于寄存器中。自動波特率檢測原理公式如下:
1/baudrate=count×(1/PCLK)(1)
根據(jù)式(1)可得發(fā)送端的波特率。實現(xiàn)自動波特率檢測無需專門的模塊設(shè)計,在接收器模塊內(nèi)就可以實現(xiàn)。
2.2 自檢測模式
Loopback(自檢測)模式是UART內(nèi)部的一種自測功能。當(dāng)UART出現(xiàn)問題時可以先自測,將控制寄存器中Loopback位使能,UART可以將內(nèi)部的發(fā)送(TXD)和接收(RXD)連接在一起,確定內(nèi)部的數(shù)據(jù)通路沒有問題。
2.3 紅外傳輸功能
本設(shè)計的UART支持IrDA 1.0協(xié)議,所以使用紅外時最高波特率為115.2 Kb/s。通過寄存器的紅外控制位選擇紅外使能,可以實現(xiàn)紅外脈沖。IrDA數(shù)據(jù)通路如圖3所示[1]。
2.4 DMA模式
本設(shè)計UART不僅支持查詢、中斷模式,還支持DMA模式以提高連續(xù)傳輸?shù)哪芰?,能夠高效地傳輸基帶芯片相關(guān)器中的大量數(shù)據(jù)。CPU除了在開始和結(jié)束時處理中斷外,在傳輸過程中也可以進(jìn)行其他工作。
3 仿真驗證和綜合結(jié)果
3.1 仿真驗證
本文采用Altera公司EP3SL150F1152的FPGA芯片進(jìn)行實測,使用VCS仿真工具,并利用VERA語言和Verification IP進(jìn)行驗證。仿真結(jié)果如圖4、圖5所示。
圖4是波特率自動檢測的仿真波形。002號波形是未知波特率的接收端波特率產(chǎn)生器的分頻值,在未知的情況下為0;005號波形是發(fā)送端波特率產(chǎn)生器的分頻值,為567H。從002號波形的變化可以看到,發(fā)送端發(fā)送檢測字41H,接收端在接收完一個檢測字41H后,可計算出波特率分頻值為567H。001號波形是接收端的接收移位寄存器,將串行數(shù)據(jù)轉(zhuǎn)化為并行數(shù)據(jù),接收完成后得到41H,也證明了數(shù)據(jù)的正確傳輸。這種波特率檢測的方法迅速準(zhǔn)確,一般情況下發(fā)一次檢測字就能檢測出發(fā)送端的波特率。
圖5是數(shù)據(jù)紅外傳輸?shù)姆抡娌ㄐ?。編碼模塊將待發(fā)送的001號波形編碼成符合紅外協(xié)議的002號波形發(fā)送出去,接收端接收到005號波形要經(jīng)過譯碼模塊譯碼成006號波形輸出給接收器。由圖中可以看到,發(fā)送寄存器發(fā)送了3個值2cH、78H、65H,在經(jīng)過編碼、譯碼模塊后,接收器能夠接收到正確的值。008號波形中高電平脈沖表示一個數(shù)據(jù)接收成功;007號波形接收移位寄存器中的數(shù)據(jù)正是發(fā)送端發(fā)送的3個值,證明數(shù)據(jù)能夠正確傳輸。本設(shè)計支持協(xié)議中5 bit、6 bit、7 bit、8 bit數(shù)據(jù)的傳輸,圖5中采用的是6 bit數(shù)據(jù)位。
3.2 綜合結(jié)果
UART接口包括UART接口模塊(接收和發(fā)送模塊)、兩個FIFO模塊(深度為32、寬度為8)、UART波特率產(chǎn)生模塊和UART控制模塊,在0.18 μm CMOS的工藝下用Synopsys的Design Compiler對模塊進(jìn)行綜合,將UART接口的輸入時鐘PCLK設(shè)置為100 MHz,模塊總面積為19 620.7 μm2,約合1962邏輯門、7 848個晶體管。
本文提出了一個功能全面的UART IP核的設(shè)計,并采用Verilog HDL語言實現(xiàn)[6]。在與PC機(jī)的長時間串口通信實驗中能夠正確進(jìn)行傳輸,在不同的波特率設(shè)置下都能正確工作。同時,用示波器觀測傳輸波形可知,波特率誤差小于1%。設(shè)計完成后,在VERA平臺上進(jìn)行了仿真驗證,最后下載到FPGA平臺上實現(xiàn),與PC的串口相連,采用串口大師軟件進(jìn)行實測,其在全雙工模式下也能正常工作,實測的結(jié)果顯示其性能和功能都能滿足要求。
參考文獻(xiàn)
[1] Samsung.S3C2410A:user manual revision 1.0[Z].2004.
[2] 趙海登,劉曉文,胡景軍,等.基于FPGA的UART IP核的設(shè)計實現(xiàn)[J].通信技術(shù),2009,5(42):177-178.
[3] 張松,董玲,于宗光,等.一種適合于SoC集成的UART核的設(shè)計實現(xiàn)[J].微電子學(xué)與計算機(jī),2005,22(9):12.
[4] Wang Yongcheng,Song Kefei.A new approach to relize UART[C].International Conference on Electronic & Mechanical Engineering and Information Technology,2011:2751.
[5] 周殿鳳,周素成,王俊華.基于FPGA的任意輸注分頻器的設(shè)計[J].信息化研究,2010,36(2):59-60.
[6] 王金明.數(shù)字系統(tǒng)設(shè)計與Verilog HDL第二版[M].北京:電子工業(yè)出版社,2005.