【摘 要】本論文采用VHDL語言描述硬件功能,利用Altera公司的FPGA芯片,采用模塊化設(shè)計(jì)方法設(shè)計(jì)UART(通用異步收發(fā)器)的各個(gè)模塊,在QuartusII和ModelSim環(huán)境下進(jìn)行設(shè)計(jì)、編譯、仿真和下載。而上位機(jī)利用VC6.0實(shí)現(xiàn)PC機(jī)與UART的通信。最后的通信測(cè)試表明系統(tǒng)數(shù)據(jù)完全正確。
【關(guān)鍵詞】UART FPGA VHDL VC
【中圖分類號(hào)】TN02【文獻(xiàn)標(biāo)識(shí)碼】A【文章編號(hào)】1006-9682(2009)01-0023-03
【Abstract】This paper described the hardware functions by VHDL and designed the UART modules in modularization method by using FPGA COMS chip of Altera company, which was designed, compiled, simulated and downloaded in QuartusII and ModelSim. However, upper machine used VC6.0 to realize the communication between PC and UART. The final simulation results show the system data is completed correct.
【Key words】UART FPGA VHDL VC
一、引 言
UART(Universal Asynchronous Receiver Transmitter)通用異步收發(fā)器、是一種應(yīng)用非常廣泛的短距離串行傳輸接口,主要應(yīng)用于短距離、低速低成本的微機(jī)與下位機(jī)的實(shí)時(shí)通訊中,串行外設(shè)接口芯片的型號(hào)有很多,如16550等,然而這類芯片本身已經(jīng)相當(dāng)復(fù)雜,有的甚至含有許多輔助的功能模塊(如FIFO),但是實(shí)際應(yīng)用中常常不需要使用如此完整的UART的功能以及這些輔助功能。本文以VHDL語言進(jìn)行基于FPGA的硬件邏輯設(shè)計(jì),利用IC領(lǐng)域最通用的仿真工具M(jìn)odelSim進(jìn)行模塊級(jí)的仿真,用QuartusII軟件進(jìn)行頂層和RTL級(jí)的仿真和觀察;用VC軟件實(shí)現(xiàn)能夠?qū)崟r(shí)保存數(shù)據(jù)到上位機(jī)的串口通信軟件;最后FPGA和上位機(jī)通過串口相連進(jìn)行大批量數(shù)據(jù)傳輸試驗(yàn),功能一切正常,整個(gè)UART綜合后消耗了190多個(gè)LE,一般的FPGA都可以輕松實(shí)現(xiàn)。與目前流行的l6C550串行數(shù)據(jù)通信的UART相比,雖然速度還達(dá)不到,但是對(duì)于一般低速數(shù)據(jù)傳輸還是很有應(yīng)用價(jià)值的,而且性能穩(wěn)定,并能在此設(shè)計(jì)基礎(chǔ)上更容易擴(kuò)展為URAT IP CORE,利于ASIC設(shè)計(jì)的重復(fù)利用。
二、系統(tǒng)設(shè)計(jì)與硬件實(shí)現(xiàn)
本設(shè)計(jì)的基本框圖如圖2.1所示。系統(tǒng)采用在FPGA內(nèi)部實(shí)現(xiàn)UART邏輯功能[1],UART通過外部接的一個(gè)MCU對(duì)其進(jìn)行總線控制,UART的串行接收和串行發(fā)送端口則通過一個(gè)電平轉(zhuǎn)換芯片直接和PC機(jī)的串口相連接。
本設(shè)計(jì)的MCU采用通用MC5-51系列芯片。設(shè)計(jì)的UART模塊接口中有8位的數(shù)據(jù)發(fā)送總線,8位的數(shù)據(jù)接收總線,以及出錯(cuò)提信號(hào),數(shù)據(jù)發(fā)送信號(hào),發(fā)送完成反饋信號(hào),數(shù)據(jù)接收到信號(hào),總共有20根數(shù)據(jù)線,另外包括MCU的一些人機(jī)接口信號(hào),因此需要的信號(hào)線較多,所以選用包含有32個(gè)可編程I/O的AT89S52芯片。
本設(shè)計(jì)中采用了EP1C3T144這款FPGA來實(shí)現(xiàn)UART功能。Cyclone系列FPGA是從根本上針對(duì)低成本進(jìn)行設(shè)計(jì),它是成本敏感大批量應(yīng)用的最佳方案。Cyclone系列FPGA的價(jià)格和功能滿足了市場(chǎng),通過產(chǎn)品迅速面市來確定領(lǐng)先優(yōu)勢(shì)。消費(fèi)、通信、計(jì)算機(jī)外設(shè)、工業(yè)和汽車等低成本大批量應(yīng)用市場(chǎng)都可選用Cyclone FPGA。
三、UART實(shí)現(xiàn)
1.UART的幀格式
在異步傳送中串行發(fā)送一個(gè)數(shù)據(jù)字節(jié)的位定時(shí)關(guān)系。發(fā)送一個(gè)完整的字節(jié)信息,首先是一個(gè)作為起始位的邏輯“0”位,接著是8個(gè)數(shù)據(jù)位,然后是1個(gè)、1.5個(gè)或2個(gè)停止位(邏輯“1”位),數(shù)據(jù)線空閑時(shí)呈現(xiàn)“1”狀態(tài)。在發(fā)送字符的8位數(shù)據(jù)部分中,先發(fā)送數(shù)據(jù)的最低位,最后發(fā)送最高位。每個(gè)位持續(xù)的時(shí)間是固定的,由發(fā)送器本地時(shí)鐘控制,每秒發(fā)送的數(shù)據(jù)位個(gè)數(shù),就是“波特率”。起始位和停止位起著很重要的作用。顯然,他們標(biāo)志每個(gè)字符的開始和結(jié)束,但更重要的是他們使接收器能把他的局部時(shí)鐘與每個(gè)新開始接收的字符進(jìn)行再同步。異步通信沒有可參考的時(shí)鐘信號(hào),發(fā)送器隨時(shí)都可能發(fā)送數(shù)據(jù),而任何時(shí)刻串行數(shù)據(jù)到來時(shí),接收器必須準(zhǔn)確地發(fā)現(xiàn)起始位下降沿的出現(xiàn)時(shí)間,從而正確地采樣緊接著的有效數(shù)據(jù)位(包括停止位、開始位和奇偶校驗(yàn)位等)。
2.UART的工作流程
UART的工作流程主要分為接收過程和發(fā)送過程。由于這個(gè)過程是根據(jù)不同的狀態(tài)來執(zhí)行的,所以很適合用狀態(tài)機(jī)來實(shí)現(xiàn)這個(gè)過程。
發(fā)送過程的任務(wù)就是把并行總線上的數(shù)據(jù)發(fā)送到串行總線上,具體的實(shí)現(xiàn)過程可以用4個(gè)狀態(tài)來實(shí)現(xiàn),即空閑(IDLE)、加載(LOAD)、發(fā)送(SEND)和發(fā)送完成(END_SEND),其中的空閑狀態(tài)就是UART內(nèi)核復(fù)位后的空閑狀態(tài)。數(shù)據(jù)加載和發(fā)送過程的狀態(tài)轉(zhuǎn)換圖,如圖3.1所示。
數(shù)據(jù)加載過程在數(shù)據(jù)發(fā)送過程之前進(jìn)行。UART內(nèi)核復(fù)位后進(jìn)入空閑狀態(tài),當(dāng)探測(cè)到發(fā)送控制信號(hào)有效時(shí),便會(huì)進(jìn)入加載狀態(tài)開始數(shù)據(jù)加載。在進(jìn)入加載狀態(tài)的同時(shí)。UART內(nèi)核會(huì)將移位寄存器、計(jì)數(shù)器復(fù)位,并且通過選擇信號(hào)使得移位寄存器的輸入為UART內(nèi)核產(chǎn)生的串行數(shù)據(jù)序列,使得移位寄存器和計(jì)數(shù)器的工作時(shí)鐘為系統(tǒng)時(shí)鐘。進(jìn)入加載狀態(tài)后,UART內(nèi)核會(huì)將完整的待發(fā)送序列加載到移位寄存器的數(shù)據(jù)輸入端,發(fā)送的序列是和系統(tǒng)時(shí)鐘同步的,移位寄存器則在系統(tǒng)時(shí)鐘的驅(qū)動(dòng)下不斷讀取輸入端數(shù)據(jù)并且保存在內(nèi)部寄存器內(nèi)。在移位寄存器加載數(shù)據(jù)的同時(shí),計(jì)數(shù)器也達(dá)到了計(jì)數(shù)的上限,它會(huì)產(chǎn)生一個(gè)指示信號(hào)通知UART內(nèi)核進(jìn)入發(fā)送狀態(tài)。
UART內(nèi)核狀態(tài)機(jī)進(jìn)入發(fā)送狀態(tài)的同時(shí)要改變相應(yīng)信號(hào),比如將移位寄存器時(shí)鐘設(shè)置為波特率時(shí)鐘,最重要的是將輸出信號(hào)送到RS-232的發(fā)送端口TxD上。這樣就可以把數(shù)據(jù)從串行端口上發(fā)送出去了。
數(shù)據(jù)的接收過程要比數(shù)據(jù)的發(fā)送過程復(fù)雜。根據(jù)UART協(xié)議的規(guī)定,接收的第一個(gè)低電平的位就標(biāo)志著一個(gè)新數(shù)據(jù)幀的開始,但是一個(gè)數(shù)據(jù)幀中也很有可能包括一個(gè)低電平的位,這樣就會(huì)產(chǎn)生一個(gè)“假起始位”的情況。所以,在數(shù)據(jù)接收的過程當(dāng)中還要包括實(shí)現(xiàn)起始數(shù)據(jù)位的判斷的模塊。
數(shù)據(jù)接收過程的狀態(tài)變換圖如圖3.2所示,可以定義3個(gè)狀態(tài):空閑(IDLE)、接收(RECV)和接收完成(END_RECV)。
UART內(nèi)核模塊在復(fù)位后進(jìn)入空閑狀態(tài)(IDLE),如果信號(hào)監(jiān)測(cè)器監(jiān)測(cè)到數(shù)據(jù)傳輸,會(huì)給UART內(nèi)核發(fā)送一個(gè)指示信號(hào),UART內(nèi)核檢測(cè)到此信號(hào)就會(huì)進(jìn)入接收狀態(tài)。在UART內(nèi)核有空閑狀態(tài)轉(zhuǎn)為接收狀態(tài)過程中,需要進(jìn)行一系列的接收預(yù)備操作,包括將子模塊復(fù)位、選擇移位寄存器串行輸入數(shù)據(jù)、選擇移位寄存器時(shí)鐘等。進(jìn)入接收狀態(tài)后,波特率發(fā)生器開始工作其輸出波特率時(shí)鐘驅(qū)動(dòng)移位寄存器同步地存儲(chǔ)RS-232接收端口上的數(shù)據(jù),并且其提示信號(hào)驅(qū)動(dòng)計(jì)數(shù)器進(jìn)行計(jì)數(shù)。當(dāng)所有數(shù)據(jù)接收完成,計(jì)數(shù)器也到達(dá)計(jì)數(shù)的上限,它會(huì)給UART內(nèi)核發(fā)送一個(gè)信號(hào),使得UART內(nèi)核進(jìn)入接收完成的狀態(tài)。UART內(nèi)核進(jìn)入接收完成狀態(tài)的同時(shí),會(huì)檢查奇偶校驗(yàn)的結(jié)果,同時(shí)使得子模塊使能信號(hào)無效以停止各個(gè)子模塊。UART內(nèi)核的接收完成狀態(tài)會(huì)保持一個(gè)時(shí)鐘周期,然后準(zhǔn)備接收下一次的數(shù)據(jù)傳輸,同時(shí)進(jìn)入空閑狀態(tài)(IDLE)。
但是在UART核的內(nèi)部接收狀態(tài)和發(fā)送狀態(tài)的過程不是獨(dú)立的,所以狀態(tài)機(jī)的轉(zhuǎn)移過程是相互交錯(cuò)的,經(jīng)QuartusII綜合后得到的總狀態(tài)轉(zhuǎn)移圖如圖3.3所示。
根據(jù)以上對(duì)數(shù)據(jù)發(fā)送過程和數(shù)據(jù)接收過程的分析可以知道,本UART設(shè)計(jì)的其它輔助模塊還有:信號(hào)檢測(cè)模塊,以為寄存器模塊,波特率發(fā)生器模塊,奇偶校驗(yàn)?zāi)K,選擇器模塊和計(jì)數(shù)器模塊。
(1)信號(hào)檢測(cè)器模塊的功能是監(jiān)測(cè)RS-232輸入端的信號(hào),并且判斷信號(hào)是否為“偽起始信號(hào)”;
(2)移位寄存器模塊是本設(shè)計(jì)中的重要模塊,它在時(shí)鐘信號(hào)的作用下把并行的數(shù)據(jù)轉(zhuǎn)換成串行的數(shù)據(jù),同時(shí)也可能把串行的數(shù)據(jù)轉(zhuǎn)換成并行的數(shù)據(jù);
(3)波特率發(fā)生器模塊的功能是產(chǎn)生和RS-232通信所采用的波特率同步的時(shí)鐘,這樣才能方便地按照RS-232串行通信的時(shí)序要求進(jìn)行數(shù)據(jù)接收和發(fā)送。實(shí)現(xiàn)波特率時(shí)鐘的基本思路就是設(shè)計(jì)一個(gè)計(jì)數(shù)器,該計(jì)數(shù)器工作在速度很高的系統(tǒng)時(shí)鐘下,計(jì)數(shù)滿時(shí)輸出一個(gè)溢出信號(hào)作為指示;
(4)奇偶校驗(yàn)器模塊的作用是根據(jù)奇偶校驗(yàn)的設(shè)置和輸入數(shù)據(jù)實(shí)時(shí)計(jì)算出奇偶校驗(yàn)位,并且送到內(nèi)核模塊中進(jìn)行相應(yīng)處理;
(5)總線選擇模塊的作用是選擇校驗(yàn)的數(shù)據(jù)的在發(fā)送總線上還是在接收總線上;
(6)計(jì)數(shù)器模塊的功能是可控地在輸入時(shí)鐘的驅(qū)動(dòng)下進(jìn)行計(jì)數(shù),計(jì)數(shù)器的計(jì)數(shù)個(gè)數(shù)是并行發(fā)送一個(gè)數(shù)據(jù)所需要的位數(shù)。
四、控制和測(cè)試部分的設(shè)計(jì)與實(shí)現(xiàn)
為了對(duì)UART的功能和各項(xiàng)參數(shù)進(jìn)行測(cè)試和驗(yàn)證,還需要實(shí)現(xiàn)UART控制部分的內(nèi)容??刂撇糠值膬?nèi)容主要包括:①M(fèi)CU總線控制程序的設(shè)計(jì)和實(shí)現(xiàn);②UART模塊測(cè)試平臺(tái)的測(cè)試代碼的編寫;③上位機(jī)測(cè)試軟件的設(shè)計(jì)和實(shí)現(xiàn)。
為了驗(yàn)證UART以及各個(gè)模塊功能的正確性,首先需要進(jìn)對(duì)UART進(jìn)行功能的仿真,由于一個(gè)通用性的UART有很多的測(cè)試種類和情況,用波形圖的方式進(jìn)行仿真顯然不合適,因此,在本設(shè)計(jì)中特意用ModelSim軟件建立UART 的測(cè)試平臺(tái),并且編寫相應(yīng)的TestBench代碼。最后測(cè)試得到的發(fā)送和接收數(shù)據(jù)時(shí)序仿真波形如圖4.1所示。
從圖4.1可以看出當(dāng)send信號(hào)有效后,在txd端口上就串行發(fā)送出總線上的數(shù)據(jù);當(dāng)串行接收信號(hào)由高電平變?yōu)榈碗娖降臅r(shí)候啟動(dòng)信號(hào)的接收,最后在recv信號(hào)上輸出一個(gè)低電平的脈沖,指示接收總線上的數(shù)據(jù)是有效的。從以上的仿真波形可以看出,本設(shè)計(jì)的UART模塊在功能上是完全正確的。
MCU的P0口和P2口連接UART的發(fā)送數(shù)據(jù)總線和接收數(shù)據(jù)總線,P1口連接UART的控制信號(hào),MCU的人機(jī)接口通過P3口和剩余的P1口信號(hào)線進(jìn)行連接。得到相應(yīng)的程序流程圖如所示。
從圖4.2可以看出MCU控制部分的程序主要是一個(gè)不斷判斷P1狀態(tài)的循環(huán)過程。程序根據(jù)對(duì)P1狀態(tài)的譯碼從而執(zhí)行各種處理過程。程序的處理過程是有優(yōu)先級(jí)的,UART出錯(cuò)的優(yōu)先級(jí)最高,其次是接收數(shù)據(jù),接下來是發(fā)送數(shù)據(jù)的過程。
編寫上位機(jī)測(cè)試軟件的主要目的是對(duì)UART進(jìn)行大批量數(shù)據(jù)傳輸測(cè)試驗(yàn)證。網(wǎng)上有很多串口通信測(cè)試軟件[2],但是大部分都沒有文件保存功能,因?yàn)橐玫酱笈繑?shù)據(jù)傳輸測(cè)試必須把接收到的數(shù)據(jù)保存到文件中,所以本設(shè)計(jì)為此編寫而來一個(gè)適合本設(shè)計(jì)的串口數(shù)據(jù)傳輸軟件。完成后的軟件界面如圖4.3所示。
本程序運(yùn)行后自動(dòng)在后臺(tái)建立一個(gè)文件,實(shí)時(shí)保存接收到的數(shù)據(jù),防止在大批量數(shù)據(jù)接收時(shí)串口來不及響應(yīng)的問題。當(dāng)復(fù)選框選中后,也可以臨時(shí)觀察接收到的數(shù)據(jù)。
五、結(jié) 論
用FPGA實(shí)現(xiàn)UART功能,以減小系統(tǒng)的面積,降低系統(tǒng)的功耗,提高設(shè)計(jì)的穩(wěn)定性,可以充分利用FPGA的剩余資源,這種硬件軟件化的方法已成為當(dāng)今電子設(shè)計(jì)領(lǐng)域中的主導(dǎo)趨勢(shì)。在很多串行數(shù)據(jù)通信方面,該UART可以完全代替專用的UART芯片。本設(shè)計(jì)中的UART程序全部用VHDL語言完成[3],并且已經(jīng)下載到本設(shè)計(jì)中設(shè)計(jì)和實(shí)現(xiàn)的硬件系統(tǒng)中測(cè)試完成。
經(jīng)過QuartusII軟件綜合表明(部分模塊單獨(dú)綜合結(jié)果如表所示),本UART消耗的邏輯單元只有196個(gè),相對(duì)一般的FPGA資源這是不多的。并且在批量數(shù)據(jù)傳輸中經(jīng)過長(zhǎng)時(shí)間的測(cè)試,得到的大量數(shù)據(jù)中未發(fā)現(xiàn)有任何錯(cuò)誤(波特率為9600bps)。
參考文獻(xiàn)
1 任曉東. CPLD/FPGA高級(jí)應(yīng)用開發(fā)指南[M].北京:電子工業(yè)出版社,2003:55
2 龔建偉、熊光明. 串口通信編程實(shí)踐[M].北京:電子工業(yè)出版社,2005:55~87
3 潘 松、王國(guó)棟. VHDL實(shí)用教程[M].電子科技大學(xué)出版社,2000:25~257