王志學(xué)
(廣東輕工職業(yè)技術(shù)學(xué)院,廣東 廣州 510000)
UART(Universal Asynchronous Receiver/Transmitter,通用異步收/發(fā)器),用于控制計算機與串行設(shè)備之間的數(shù)據(jù)通信,它提供了外設(shè)用到的RS-232C數(shù)據(jù)終端設(shè)備接口,使計算機可以和調(diào)制解調(diào)器或其它使用RS-232C接口的串行設(shè)備進行通信。常見的UART有8250、8251、NS16450、NS16550等,這些芯片做的比較復(fù)雜,功能齊全。但是由于結(jié)構(gòu)和功能相對固定,因而不能根據(jù)我們的實際需要去裁剪和移植。當我們不需要用到完整的UART功能和一些輔助功能時,就可以將需要的UART功能集成到FPGA上,從而大大的減少了體積、簡化了電路,也提高了系統(tǒng)的可靠性、穩(wěn)定性和靈活性。
UART是一種串行數(shù)據(jù)總線,用于異步通信,并且雙向通信,可實現(xiàn)全雙工傳輸和接收?;镜腢ART只需要兩條信號線(TXD、RXD)和一條地線就可以完成數(shù)據(jù)的相互通信,接收和發(fā)送互不干擾,這樣就大大節(jié)省了傳輸費用。由于UART是異步通信,所以需要對數(shù)據(jù)進行同步?;镜腢ART幀格式如圖1所示:
圖1 UART幀格式
從圖中可以看出,串行異步通信的幀格式包括四個部分:起始位、數(shù)據(jù)位、校驗位和停止位。起始位在一個字符中占一位,并且必須為0,表示字符的開始;起始位后面是數(shù)據(jù)位,一般為5至8位,由串行通信的初始化程序設(shè)定,數(shù)據(jù)的排列方式是低位在前,高位在后。數(shù)據(jù)位后面是校驗位,該位可根據(jù)實際需要可選可不選;一個字符的最后是停止位,該位必須存在,表示一個字符的結(jié)束。停止位可以是1位、1.5位或2位。異步通信的這種由起始位開始,停止位結(jié)束所構(gòu)成的一串二進制數(shù)即為幀,從微觀來看,異步通信時一位一位的傳輸?shù)模瑥暮暧^來看,又是一幀一幀傳輸?shù)摹T谝粠瑪?shù)據(jù)中的每一位之間的時間間隔是一樣的,但是幀與幀之間的時間間隔是隨機的。
本文采用模塊設(shè)計的方法,并且針對實際要求,將整個軟件劃分為波特率發(fā)生器模塊、接收啟動模塊、接收模塊和發(fā)送模塊四個部分。各模塊功能分析如下:
波特率發(fā)生器實際上就是一個簡單的分頻器,它的功能是產(chǎn)生和RS-232C通信所采用的波特率同步的時鐘,這樣才能按照RS-232C的時序要求進行數(shù)據(jù)的收發(fā)。而波特率發(fā)生器的系數(shù)在FPGA實現(xiàn)時一般是固定的,但對于不同的實現(xiàn),這個系數(shù)需要更改(因為FPGA在設(shè)計時比較容易改動,而專用芯片不易改動,所以UART專用芯片一般通過添加一個接口以便在使用時改變波特率)。可以在VHDL語言中使用Generic語句,或在Verilog HDL語言中使用parameter語句使問題得到解決。因發(fā)送和接收時對時鐘的要求不同,給發(fā)送模塊和接收模塊提供的時鐘頻率也不相同。當發(fā)送數(shù)據(jù)時,只需要將數(shù)據(jù)按照一定的速率串行的輸出就可以了,所以,發(fā)送的時鐘和發(fā)送的波特率是一致的;但是,在接收數(shù)據(jù)時,在數(shù)據(jù)位的什么位置對數(shù)據(jù)信息進行判斷非常的重要,最理想的情況就是在串行數(shù)據(jù)每一位的中點對數(shù)據(jù)進行采樣,因為發(fā)送方和接收方的時鐘是不一致的,所以需要對每一位數(shù)據(jù)的時間進行分段,分段越多,采樣時就越接近中點,并且采樣時出現(xiàn)錯誤的概率也越低,但是,分段越多,采樣的時間也越多,系統(tǒng)的開銷越大,所以,實際設(shè)計時,波特率發(fā)生器產(chǎn)生的分頻時鐘,是波特率時鐘頻率的16倍。波特率發(fā)生器模塊如圖2所示。clk16x是波特率發(fā)生器得到的分頻時鐘;clk是時鐘輸入信號;rst是系統(tǒng)復(fù)位信號。
圖2 波特率發(fā)生器模塊示意圖
由于串行數(shù)據(jù)幀和接收時鐘是異步的,由高電平轉(zhuǎn)化為低電平可以視為一個數(shù)據(jù)幀的起始位。但是,在實際的電路中,會有多方面的原因干擾,為了避免毛刺影響,正確的判斷起始位的到來,采樣時在時鐘的上升沿(即由波特率發(fā)生器提供的16倍于波特率的時鐘)檢驗數(shù)據(jù)是否為低電平,如果接收到的是低電平,則開始計數(shù),如果連續(xù)8個時鐘內(nèi)都是低電平,則表示起始信號有效,即要求接收到的起始位在波特率時鐘采樣過程中有一半是屬于邏輯0才表示接收到的起始位有效。如果在采樣時,有一次檢驗到高電平,即邏輯1時,則認為起始信號無效,返回初始的狀態(tài)重新等待下一個起始位信號。當起始位的信號時有效時,每隔16個時鐘采樣一次,這樣就保證了每次采樣都是在數(shù)據(jù)位的中點。
接收模塊如圖3所示。clk16x是由波特率發(fā)生器產(chǎn)生的分頻時鐘;rst是系統(tǒng)復(fù)位信號;rxd是來自其他設(shè)備的串行數(shù)據(jù);data_ready表示"數(shù)據(jù)已準備好",在rdn為1的情況下,并行數(shù)據(jù)轉(zhuǎn)換完畢就可以輸出,此時將data_ready置為0;在rdn不為1的情況下,串并轉(zhuǎn)換完成后將此data_ready置1以表示數(shù)據(jù)己經(jīng)轉(zhuǎn)換完畢,可以輸出了,通知接收模塊每隔16個clk16x周期采樣一次,接收UART幀中剩余的數(shù)據(jù)位,否則,接收模塊不工作。dout<7:0>是接收模塊將接收到的串行數(shù)據(jù)轉(zhuǎn)換成的并行數(shù)據(jù),送給發(fā)送模塊的輸入信號din<7:0>。
圖3 接收模塊示意圖
發(fā)送模塊相對于接收模塊要容易處理得多。只要每隔16個clk16x周期輸出1位即可,次序遵循1位起始位,8位數(shù)據(jù)位,1位停止位。發(fā)送模塊如圖4所示。din<7:0>是將要發(fā)送出去的并行數(shù)據(jù);clk16x、rst信號同接收模塊;wrn是數(shù)據(jù)發(fā)送的啟動信號;txd是發(fā)送出去的串行數(shù)據(jù)信號。
圖4 發(fā)送模塊示意圖
用FPGA實現(xiàn)UART功能,減少了系統(tǒng)的面積,降低了系統(tǒng)的功耗,提高了系統(tǒng)的穩(wěn)定性,同時,由于數(shù)據(jù)幀和波特率都比較容易改變,大大的提高了系統(tǒng)設(shè)計的靈活性和可移植性。
[1]史故臣,石旭剛,左緒勇.基于FPGA的UART設(shè)計與實現(xiàn)[J].中國新通信,2009.4:62-64
[2]聶濤,許世宏.基于 FPGA 的 UART 設(shè)計[J].現(xiàn)代電子技術(shù),2006,29(2):127-129
[3]播松,黃繼業(yè).EDA 技術(shù)與 VHDL[M]北京:清華大學(xué)出版社,2007
[4]楊宗國,李艷萍.基于FPGA的UART模塊的設(shè)計[J].現(xiàn)代電子技術(shù),2009,2:19-22
[5]黃智偉,王彥.FPGA系統(tǒng)設(shè)計與實踐[M].北京:電子工業(yè)出版社,2005
[6]潘松,王國棟.VHDL使用教程.電子科技大學(xué)出版社.1999