文獻(xiàn)標(biāo)識碼: A
文章編號: 0258-7998(2013)01-0037-03
通用異步收發(fā)器UART(Universal Asynchronous Receiver/Transmitter)是串行通信的重要組成部分,其基本功能是實(shí)現(xiàn)數(shù)據(jù)的串行化/反串行化和錯誤校驗(yàn),這也是所有的UART設(shè)計(jì)都能實(shí)現(xiàn)的基本功能,但是其他各種功能都兼顧的設(shè)計(jì)非常少。參考文獻(xiàn)[1]設(shè)計(jì)了一個在MCU中運(yùn)用非常廣泛的UART接口,其功能比較全面,但是波特率產(chǎn)生器采用整數(shù)分頻的設(shè)計(jì),導(dǎo)致系統(tǒng)只有在特定系統(tǒng)時鐘、特定波特率的情況下誤差才會比較小,不能滿足高波特率和非標(biāo)準(zhǔn)波特率的要求;參考文獻(xiàn)[2]設(shè)計(jì)的UART IP基本功能良好,但是不支持紅外、自動波特率檢測等功能;參考文獻(xiàn)[3]的設(shè)計(jì)只支持中斷模式,不支持DMA模式,不能滿足大量數(shù)據(jù)高速傳輸?shù)男枨螅抑袛嗫偸谴驍郈PU的操作,效率較低。本文提出了一種多功能UART模塊的設(shè)計(jì),并利用Verilog HDL語言進(jìn)行實(shí)現(xiàn)。本設(shè)計(jì)能滿足多模導(dǎo)航基帶芯片中的不同需求(如相關(guān)器數(shù)據(jù)的傳輸?shù)?,同時降低誤差,保證衛(wèi)星數(shù)據(jù)的正確性。
1 UART電路主要模塊設(shè)計(jì)
本設(shè)計(jì)采用標(biāo)準(zhǔn)的UART傳輸協(xié)議,字符幀由起始位、數(shù)據(jù)位、奇偶校驗(yàn)位和停止位四部分組成[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)驗(yàn)可知,數(shù)據(jù)的中間采樣值可靠性較高,可以采用中間時刻采樣法[2],并且,接收和發(fā)送單元的數(shù)據(jù)采樣率為波特率的16倍,可降低由于時鐘不匹配引起的誤采樣。接收器采用狀態(tài)機(jī)[2]實(shí)現(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)行計(jì)數(shù)。當(dāng)計(jì)數(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)行計(jì)數(shù),當(dāng)計(jì)數(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)入奇偶校驗(yàn)狀態(tài)。
(4)RX_PARITY:該狀態(tài)的主要功能是奇偶校驗(yàn),通過對實(shí)際接收到的數(shù)據(jù)的奇偶性與發(fā)送過來的奇偶校驗(yàn)位進(jìn)行比較,判斷奇偶校驗(yà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ā)送器實(shí)現(xiàn)的功能是將輸入的8 bit并行數(shù)據(jù)變成串行數(shù)據(jù),同時在數(shù)據(jù)位頭部加入起始位,在數(shù)據(jù)位尾部加奇偶校驗(yàn)位和停止位。發(fā)送模塊的設(shè)計(jì)比較簡單,其狀態(tài)機(jī)與接收模塊相對應(yīng),在此不再贅述。
1.3 波特率產(chǎn)生模塊
波特率發(fā)生器一般采用分頻器實(shí)現(xiàn),傳統(tǒng)的采用整數(shù)分頻器實(shí)現(xiàn)的誤差在某些系統(tǒng)時鐘下超出了可控范圍,如在參考時鐘為16.37 MHz、波特率為460 Kb/s的情況下,誤差達(dá)到了11.2%,會導(dǎo)致數(shù)據(jù)傳輸?shù)腻e誤。因此,本設(shè)計(jì)采用小數(shù)分頻器實(shí)現(xiàn)相對準(zhǔn)確的波特率。另外,在收發(fā)的過程中,可以改變波特率寄存器的值,但實(shí)際波特率的改變發(fā)生在當(dāng)前幀傳輸完成之后。波特率產(chǎn)生模塊的電路結(jié)構(gòu)圖如圖2所示。
小數(shù)分頻的實(shí)現(xiàn)方法有很多,但其基本原理是一樣的,即在若干個分頻周期中采取某種方法使某幾個周期多計(jì)或少計(jì)一個數(shù),從而在整個分頻周期內(nèi)總體平均分頻數(shù)為小數(shù)分頻[5]。
通過采用小數(shù)分頻,大大降低了實(shí)際波特率與要求波特率之間的誤差。在正常情況下,誤差不應(yīng)超過2%,如果超過了,則需要相應(yīng)地提高系統(tǒng)時鐘來降低誤差。表1列出了19.2 MHz情況下的整數(shù)分頻和小數(shù)分頻波特率誤差對應(yīng)表,可以看到采用小數(shù)分頻的波特率誤差明顯較小。
在本設(shè)計(jì)中,發(fā)送器、接收器和波特率產(chǎn)生模塊是主要模塊。FIFO(先進(jìn)先出)模塊是數(shù)字電路設(shè)計(jì)中比較常用的模塊,本文復(fù)用了通用的FIFO模塊,在文中就不再贅述。UART的控制模塊主要負(fù)責(zé)對寄存器的相關(guān)操作,通過APB總線實(shí)現(xiàn),其電路設(shè)計(jì)比較簡單,也不再贅述。
2 UART模塊的其他功能
2.1 自動波特率檢測
UART接收通道在接收數(shù)據(jù)之前,如果發(fā)送端的波特率不清楚,可進(jìn)行自動波特率檢測。實(shí)現(xiàn)方法是:發(fā)送端間隔發(fā)送檢測字,間隔時間為傳輸一幀所需的時間。接收方UART根據(jù)start位來確定是否有數(shù)據(jù)在傳輸,當(dāng)其檢測到下降沿時就進(jìn)入RX_START的狀態(tài)中,在波特率不明確的情況下,并不產(chǎn)生采樣時鐘,用PCLK進(jìn)行采樣計(jì)數(shù)。由于start位為1 bit,根據(jù)計(jì)數(shù)值可知這1 bit所占用的時間。如果接收數(shù)據(jù)完成后,接收到的數(shù)據(jù)是約定值,則證明波特率檢測成功,可以將檢測到的值存儲于寄存器中。自動波特率檢測原理公式如下:
1/baudrate=count×(1/PCLK)(1)
根據(jù)式(1)可得發(fā)送端的波特率。實(shí)現(xiàn)自動波特率檢測無需專門的模塊設(shè)計(jì),在接收器模塊內(nèi)就可以實(shí)現(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è)計(jì)的UART支持IrDA 1.0協(xié)議,所以使用紅外時最高波特率為115.2 Kb/s。通過寄存器的紅外控制位選擇紅外使能,可以實(shí)現(xiàn)紅外脈沖。IrDA數(shù)據(jù)通路如圖3所示[1]。
2.4 DMA模式
本設(shè)計(jì)UART不僅支持查詢、中斷模式,還支持DMA模式以提高連續(xù)傳輸?shù)哪芰?,能夠高效地傳輸基帶芯片相關(guān)器中的大量數(shù)據(jù)。CPU除了在開始和結(jié)束時處理中斷外,在傳輸過程中也可以進(jìn)行其他工作。
3 仿真驗(yàn)證和綜合結(jié)果
3.1 仿真驗(yàn)證
本文采用Altera公司EP3SL150F1152的FPGA芯片進(jìn)行實(shí)測,使用VCS仿真工具,并利用VERA語言和Verification IP進(jìn)行驗(yàn)證。仿真結(jié)果如圖4、圖5所示。
圖4是波特率自動檢測的仿真波形。002號波形是未知波特率的接收端波特率產(chǎn)生器的分頻值,在未知的情況下為0;005號波形是發(fā)送端波特率產(chǎn)生器的分頻值,為567H。從002號波形的變化可以看到,發(fā)送端發(fā)送檢測字41H,接收端在接收完一個檢測字41H后,可計(jì)算出波特率分頻值為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è)計(jì)支持協(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è)計(jì),并采用Verilog HDL語言實(shí)現(xiàn)[6]。在與PC機(jī)的長時間串口通信實(shí)驗(yàn)中能夠正確進(jìn)行傳輸,在不同的波特率設(shè)置下都能正確工作。同時,用示波器觀測傳輸波形可知,波特率誤差小于1%。設(shè)計(jì)完成后,在VERA平臺上進(jìn)行了仿真驗(yàn)證,最后下載到FPGA平臺上實(shí)現(xiàn),與PC的串口相連,采用串口大師軟件進(jìn)行實(shí)測,其在全雙工模式下也能正常工作,實(shí)測的結(jié)果顯示其性能和功能都能滿足要求。
參考文獻(xiàn)
[1] Samsung.S3C2410A:user manual revision 1.0[Z].2004.
[2] 趙海登,劉曉文,胡景軍,等.基于FPGA的UART IP核的設(shè)計(jì)實(shí)現(xiàn)[J].通信技術(shù),2009,5(42):177-178.
[3] 張松,董玲,于宗光,等.一種適合于SoC集成的UART核的設(shè)計(jì)實(shí)現(xiàn)[J].微電子學(xué)與計(jì)算機(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ì)[J].信息化研究,2010,36(2):59-60.
[6] 王金明.數(shù)字系統(tǒng)設(shè)計(jì)與Verilog HDL第二版[M].北京:電子工業(yè)出版社,2005.