摘 要: 為了適應(yīng)全數(shù)字化自動(dòng)控制更加廣泛的應(yīng)用,采用現(xiàn)場(chǎng)可編程門(mén)陣列(FPGA)對(duì)異步串行通信控制器(UART)進(jìn)行多模塊的系統(tǒng)設(shè)計(jì)的方法,使串口通信的集成度更高。對(duì)UART系統(tǒng)結(jié)構(gòu)進(jìn)行了模塊化分解,可分為三個(gè)模塊: FPGA波特率發(fā)生器控制模塊、FPGA數(shù)據(jù)發(fā)送模塊及數(shù)據(jù)接收模塊。采用Verilog語(yǔ)言描述硬件功能,利用Xilinx公司的FPGA芯片,在Xilinx ISE Design Suite 13.4環(huán)境下進(jìn)行設(shè)計(jì)、編譯、綜合、下載。采用第三方仿真工具M(jìn)odelSim進(jìn)行模擬仿真。
關(guān)鍵字: FPGA; UART; 多模塊; Verilog; Xilinx ISE
中圖分類號(hào): TN911?34 文獻(xiàn)標(biāo)識(shí)碼: A 文章編號(hào): 1004?373X(2013)13?0071?03
Realization of asynchronous serial communication based on FPGA
TIAN Le1, ZHANG Yong2
(1. School of Electronic and Information, Xi’an Polytechnic University, Xi’an 710048, China;
2. Xinjiang Xinhua energy R D center in Xi’an Electric Co., Ltd., Xi’an 710304, China)
Abstract: In order to adapt to the widely applications of full digital automatic control, a multi?module system is designed with FPGA for UART, to make the integration level of the serial communication higher. The UART system structure is discomposed into three modules: FPGA baud rate generator control module, FPGA data sending module and the data receiving module. The hardware functionality is described by Verilog language. By using FPGA chip of Xilinx, the design, compiling, synthesis and download could be completed in Xilinx ISE Design Suite 13.4 environment. The simulation is conducted by ModelSim.
Keywords: FPGA; UART; multi?module; Verilog; Xilinx ISE
異步串行通信(UART)是一種廣泛應(yīng)用的串行數(shù)據(jù)傳輸協(xié)議,UART[1?3]的要求是傳輸線少,可靠性高而且傳輸距離遠(yuǎn)。UART功能負(fù)責(zé)從總線采集數(shù)據(jù),轉(zhuǎn)換成傳輸格式,然后發(fā)送到串口。也負(fù)責(zé)從串口接收數(shù)據(jù),檢查和刪除附加的位,并傳送結(jié)果數(shù)據(jù)給總線。異步串行通信廣泛的應(yīng)用于軍事、工業(yè)、自動(dòng)控制、儀器、通信、醫(yī)藥、話音圖像處理等眾多領(lǐng)域[4?6]。現(xiàn)實(shí)應(yīng)用中多采用專用集成芯片實(shí)現(xiàn)UART功能,如8250、8250A、16450、16C451、16C551等[7]。但在實(shí)際應(yīng)用中,一般只需要UART的幾個(gè)主要功能,專用芯片成本比較大且造成資源的浪費(fèi)[8?9]。近年來(lái)隨著電子設(shè)計(jì)技術(shù)的日趨成熟,特別是FPGA在集成度和速度上的大幅提高,可以用一個(gè)芯片構(gòu)成一個(gè)復(fù)雜的系統(tǒng)。一個(gè)芯片就能完成處理計(jì)算、通信、控制等多功能,而且成本大幅度降低[10?11]。根據(jù)以上考慮,本文采用FPGA實(shí)現(xiàn)UART 功能。
1 UART通信原理
串行通信分為兩種類型:同步通信方式和異步通信方式。UART即通用異步串行通信收發(fā)器。UART的一幀數(shù)據(jù)由起始位、數(shù)據(jù)位、奇偶校驗(yàn)位和停止位組成。數(shù)據(jù)在傳輸過(guò)程中是通過(guò)一個(gè)字符接一個(gè)字符進(jìn)行傳輸來(lái)實(shí)現(xiàn)通信的。每一幀的信息在傳送前傳輸線處于高電平狀態(tài)。在傳送一個(gè)字符信息的時(shí)候,每一個(gè)字符的接收是靠起始位來(lái)同步的,字符的前面是一位起始位,首先發(fā)送起始位為低電平,一般用下降沿通知收方傳輸開(kāi)始,然后發(fā)送起始位之后的數(shù)據(jù)位,數(shù)據(jù)位的傳送先低位后高位,字符本身由5~8位數(shù)據(jù)位組成。
數(shù)據(jù)位后面是奇偶校驗(yàn)位,奇偶校驗(yàn)位后的是停止位,標(biāo)志著一幀字符結(jié)束。停止位后為高電平,為空閑位,并為下一個(gè)字符的開(kāi)始傳送做準(zhǔn)備。在發(fā)送、接收數(shù)據(jù)時(shí),數(shù)據(jù)的幀與幀之間如果有間隙,就要在停止位之后附加空閑位,停止位后面是不定長(zhǎng)度的空閑位。停止位和空閑位都規(guī)定高電平,這樣可以保證起始位開(kāi)始處有一個(gè)下降沿。如圖1所示。
圖1 UART的一幀數(shù)據(jù)
1.1 系統(tǒng)設(shè)計(jì)與硬件實(shí)現(xiàn)
異步通信允許在串行鏈路上進(jìn)行全雙工的通信。本文把異步通信電路作為一個(gè)整體來(lái)實(shí)現(xiàn),數(shù)據(jù)接收經(jīng)過(guò)MAX232進(jìn)行電平轉(zhuǎn)換后經(jīng)FPGA串口模塊的RXD端輸入,由FPGA進(jìn)行串/并轉(zhuǎn)換后,8位有效數(shù)據(jù)進(jìn)入總線,再進(jìn)入處理芯片。數(shù)據(jù)發(fā)送經(jīng)數(shù)據(jù)處理后經(jīng)由總線進(jìn)入FPGA串口模塊,8位有效數(shù)據(jù)在FPGA中進(jìn)行并行轉(zhuǎn)換為串行數(shù)據(jù)后由TXD端輸出到MAX232的12管腳,在MAX232種經(jīng)過(guò)電平轉(zhuǎn)換后由TXD端輸出,系統(tǒng)基本結(jié)構(gòu)框圖如圖2所示。
圖2 系統(tǒng)基本結(jié)構(gòu)框圖
幀格式采用1位開(kāi)始位,8位數(shù)據(jù)位,1位停止位,波特率為115 200,根據(jù)采用的幀格式,需要發(fā)送的數(shù)據(jù)為10位(1位開(kāi)始位、8位數(shù)據(jù)位、1位停止位),在發(fā)送完這10位后,就應(yīng)該停止發(fā)送,并使發(fā)送端電平處于邏輯1,然后等候下次的發(fā)送。
1.2 FPGA波特率發(fā)生器模塊
串口通信,就是RS 232/RS 485通信,要求通信的雙方波特率等通信格式一樣才可以通信成功。在電子通信領(lǐng)域,波特率(Baud Rate)即調(diào)制速率,指的是信號(hào)被調(diào)制以后在單位時(shí)間內(nèi)的變化,即單位時(shí)間內(nèi)載波參數(shù)變化的次數(shù)。它是對(duì)符號(hào)傳輸速率的一種度量,1 Baud即指每秒傳輸1個(gè)符號(hào)。在基于FPGA實(shí)現(xiàn)通用異步通信時(shí),波特率發(fā)生器是一個(gè)必不可少的部分。波特率發(fā)生器實(shí)際上就是一個(gè)分頻器,可以根據(jù)給定的系統(tǒng)時(shí)鐘頻率和要求的波特率算出波特率分頻因子,算出的波特率分頻因子作為分頻器的分頻數(shù)從而產(chǎn)生所需的時(shí)鐘頻率。在設(shè)定發(fā)送和接收使用相同的波特率的情況下,UART只需要一個(gè)波特率發(fā)生器就可以了。
系統(tǒng)提供的時(shí)鐘頻率為10 MHz,數(shù)據(jù)信號(hào)的傳輸速率為115 200 Hz,波特率發(fā)生器產(chǎn)生的時(shí)鐘對(duì)數(shù)據(jù)信號(hào)進(jìn)行采樣,設(shè)定對(duì)傳輸?shù)臄?shù)據(jù)信號(hào)進(jìn)行3倍采樣,則波特率發(fā)生器產(chǎn)生的頻率為:
3×115 200=345 600 Hz
那么就可以根據(jù)給定的系統(tǒng)時(shí)鐘和要求的波特率計(jì)算出分頻因子:
1×107/345 600=28.94
對(duì)時(shí)鐘進(jìn)行28.94分頻是很難實(shí)現(xiàn)的,因此取整數(shù)30作為分頻因子。盡管這樣會(huì)使得分頻得到的時(shí)鐘會(huì)比所需的 345 600 Hz高3.5%,但這樣微小的變化不會(huì)影響實(shí)際電路的工作。其仿真圖如圖3所示。
1.3 FPGA數(shù)據(jù)發(fā)送模塊
發(fā)送過(guò)程就是把并行總線上的數(shù)據(jù)發(fā)送到串行總線上。數(shù)據(jù)發(fā)送的過(guò)程可以分為空閑狀態(tài)、加載狀態(tài)、發(fā)送狀態(tài)和發(fā)送完成狀態(tài)。空閑狀態(tài)就是UART內(nèi)核復(fù)位后的空閑狀態(tài),等待加載狀態(tài)。UART進(jìn)入空閑狀態(tài)后,當(dāng)檢測(cè)到發(fā)送控制信號(hào)有效時(shí),就進(jìn)行加載狀態(tài)并開(kāi)始進(jìn)行數(shù)據(jù)的加載。加載狀態(tài)就是發(fā)送模塊按照串行發(fā)送的順序?qū)⒁l(fā)送的這一幀數(shù)據(jù)加載到移位寄存器內(nèi),將移位寄存器和計(jì)數(shù)器都復(fù)位,使移位寄存器和計(jì)數(shù)器的工作時(shí)鐘為系統(tǒng)時(shí)鐘。當(dāng)計(jì)數(shù)器達(dá)到了計(jì)數(shù)的上限時(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上。在發(fā)送狀態(tài),也需要計(jì)數(shù)器的控制,當(dāng)計(jì)數(shù)器達(dá)到了計(jì)數(shù)的上限時(shí),它會(huì)產(chǎn)生一個(gè)信號(hào)通知UART內(nèi)核進(jìn)入發(fā)送完成狀態(tài)。當(dāng)UART內(nèi)核狀態(tài)機(jī)進(jìn)入發(fā)送狀態(tài)后,并產(chǎn)生發(fā)送完成中斷信號(hào)。這樣就可以把數(shù)據(jù)從串行端口上發(fā)送出去了。發(fā)送數(shù)據(jù)和接收數(shù)據(jù)的狀態(tài)轉(zhuǎn)換圖如圖4所示。
圖3 波特率發(fā)生器30分頻
圖4 發(fā)送數(shù)據(jù)和接收數(shù)據(jù)的狀態(tài)轉(zhuǎn)換圖
發(fā)送一幀數(shù)據(jù)的部分程序如下:
′send :
begin
if(cnt>=8′h21) //cnt=33
nstate <=′send_over ;
else
begin
case(state)
bit0 : begin txd <= 0; state <= bit1; end
bit1 : begin txd <= d_in[0]; state <= bit2; end
bit2 : begin txd <= d_in[1]; state <= bit3; end
bit3 : begin txd <= d_in[2]; state <= bit4; end
bit4 : begin txd <= d_in[3]; state <= bit5; end
bit5 : begin txd <= d_in[4]; state <= bit6; end
bit6 : begin txd <= d_in[5]; state <= bit7; end
bit7 : begin txd <= d_in[6]; state <= bit8; end
bit8 : begin txd <= d_in[7]; state <= bit9; end
bit9 : begin txd <= 0; state <= bit10 ; end
bit10 : begin txd <=1; end
endcase
end
發(fā)送一幀數(shù)據(jù)的仿真結(jié)果如圖5所示。
1.4 FPGA數(shù)據(jù)接收模塊
數(shù)據(jù)的接收與數(shù)據(jù)的發(fā)送相比要復(fù)雜些。在數(shù)據(jù)的接收過(guò)程中,UART的接收模塊首先要進(jìn)行的是對(duì)起始位的檢驗(yàn)。一般當(dāng)接收的第一個(gè)是低電平,就標(biāo)志著一個(gè)數(shù)據(jù)幀的開(kāi)始,但是在一個(gè)數(shù)據(jù)幀中間也有可能包括—個(gè)低電平的位,系統(tǒng)有可能默認(rèn)為這個(gè)低電平為起始位,這樣就會(huì)產(chǎn)生一個(gè)“假的起始位”。所以,在數(shù)據(jù)接收的過(guò)程當(dāng)中還要包括對(duì)數(shù)據(jù)起始位的判斷。所以數(shù)據(jù)的接收過(guò)程可以分為空閑狀態(tài)、起始位檢測(cè)狀態(tài)、數(shù)據(jù)位讀取狀態(tài)、讀取停止?fàn)顟B(tài)、準(zhǔn)備完成接收和停止位讀取狀態(tài)。在判斷起始位低電平后,觸發(fā)接收過(guò)程,進(jìn)入數(shù)據(jù)位讀取狀態(tài)使串行總線的輸入數(shù)據(jù)不斷被讀取并且保存在寄存器內(nèi),計(jì)數(shù)器也到達(dá)計(jì)數(shù)的上限時(shí),接收完成之后并進(jìn)入準(zhǔn)備完成接收狀態(tài),UART控制器會(huì)在輸出結(jié)果之前對(duì)已經(jīng)接收的數(shù)據(jù)進(jìn)行奇偶校驗(yàn)。然后進(jìn)入停止位讀取狀態(tài)。在每一種狀態(tài),如果使能信號(hào)無(wú)效時(shí)都轉(zhuǎn)回空閑狀態(tài)。最后UART 控制器準(zhǔn)備下一次的數(shù)據(jù)接收并重置控制器內(nèi)的信號(hào)檢測(cè)器。
圖5 發(fā)送一幀數(shù)據(jù)
在接收數(shù)據(jù)過(guò)程中,會(huì)有一些其他原因使信號(hào)產(chǎn)生反轉(zhuǎn)。為了消除毛刺,在接收數(shù)據(jù)時(shí),采用3選2的方法消除誤差。也就是這個(gè)字符的值是至少有兩次采樣的值相等的值。
采用3選2方法接收數(shù)據(jù)的程序如下:
always @( posedge clk)
begin
if(pstate==′read_data)
begin
d1_out[i]=rxd ;
i<=i+1;
if(i==3′b11)
begin
if( d1_out[0]==d1_out[1])
d_out[i1]<=d1_out[0];
else if ( d1_out[0]==d1_out[2])
d_out[i1]<=d1_out[0];
else
d_out[i1]<=d1_out[1];
i<=0;
i1<=i1+1;
end
end
end
接收一幀數(shù)據(jù)的仿真結(jié)果如圖6所示。
圖6 接收一幀數(shù)據(jù)
在波特率為115 200情況下對(duì)UART進(jìn)行仿真,結(jié)果如圖7所示。通過(guò)仿真波形可以看出,設(shè)計(jì)結(jié)果正確地發(fā)送和接收一幀數(shù)據(jù)并產(chǎn)生相應(yīng)的中斷。
圖7 接收一幀數(shù)據(jù)和發(fā)送一幀數(shù)據(jù)
2 結(jié) 論
本文介紹了一種基于 FPGA實(shí)現(xiàn)異步串行通信功能,采用多模塊的方法實(shí)現(xiàn)異步串行通信功能,可以方便用戶根據(jù)需要進(jìn)行裁減、便于理解和調(diào)試。本文運(yùn)用Verilog語(yǔ)言進(jìn)行設(shè)計(jì)異步串行并行收發(fā)器的 IP核電路。
用FPGA 實(shí)現(xiàn)UART 功能,充分利用了FPGA的剩余資源,相對(duì)于專用UART芯片,減小系統(tǒng)PCB板的面積,降低系統(tǒng)的功耗,提高系統(tǒng)的穩(wěn)定性。近年來(lái)在電子設(shè)計(jì)領(lǐng)域中,這種硬件軟件化的方法已經(jīng)成為一種流行趨勢(shì)。該設(shè)計(jì)采用Xilinx公司的Spartan3E系列中器件XC3S100E。通過(guò) ISE軟件進(jìn)行時(shí)序仿真和硬件測(cè)試各項(xiàng)通信指標(biāo)均滿足要求,整個(gè)設(shè)計(jì)的正確性和完整性得到驗(yàn)證,各項(xiàng)功能均達(dá)到預(yù)期的要求。
參考文獻(xiàn)
[1] 杜慧敏,李宥謀,趙全良.基于Verilog的FPGA設(shè)計(jì)基礎(chǔ)[M].西安:西安電子科技大學(xué)出版社,2006.
[2] 何燕.51單片機(jī)與FPGA的UART通信模式研究[J].電腦知識(shí)與技術(shù),2009(21):5873?5875.
[3] 謝宏,葛棋棋.腦電信號(hào)無(wú)線采集系統(tǒng)設(shè)計(jì)[J].現(xiàn)代電子技術(shù),2010,33(18):21?24.
[4] 王偉.Verilog HDL程序設(shè)計(jì)與應(yīng)用[M].北京:人民郵電出版社,2005.
[5] 夏宇聞.Verilog數(shù)字系統(tǒng)設(shè)計(jì)教程[M].北京:北京航空航天大學(xué)出版社,2003.
[6] 曹會(huì)華,賀占莊.基于有限狀態(tài)機(jī)實(shí)現(xiàn)全雙工可編程UART[J].計(jì)算機(jī)技術(shù)與發(fā)展,2007,17(2):53?55.
[7] 汪灝,郭二輝.通用異步串行收發(fā)器UART核在DSP芯片中的設(shè)計(jì)與實(shí)現(xiàn)[J].中國(guó)集成電路,2011,20(3):36?39.
[8] 劉浩淼,卞樹(shù)檀.基于CPLD的RS 232串口通信實(shí)現(xiàn)[J].電子設(shè)計(jì)工程,2011(12):153?155.
[9] 李洋洋,吳武臣.基于斷言的驗(yàn)證方法在UART模塊中的應(yīng)用研究[J].微電子學(xué)與計(jì)算機(jī),2012(1):151?153.
[10] 張成立.基于FPGA的生命探測(cè)儀算法研究與系統(tǒng)設(shè)計(jì)[J].物聯(lián)網(wǎng)技術(shù),2012,2(3):46?50.
[11] 王一平,王代強(qiáng).基于NiosⅡ的UART設(shè)計(jì)與實(shí)現(xiàn)[J].電子設(shè)計(jì)工程,2012(17):166?168.