摘 要:介紹了應(yīng)用現(xiàn)場可編程門陣列(FPGA)設(shè)計(jì)和實(shí)現(xiàn)通用異步收發(fā)器UART的方法。采用有限狀態(tài)機(jī)模型形式化描述了UART的功能,在此基礎(chǔ)上用硬件描述語言VHDL編程實(shí)現(xiàn)了UART,并使用Quartus Ⅱ軟件中的嵌入式邏輯分析儀SignalTapⅡ?qū)?shù)據(jù)傳輸進(jìn)行了檢測,驗(yàn)證了設(shè)計(jì)的正確性。
關(guān)鍵詞:FPGA; UART; 有限狀態(tài)機(jī); SignalTapⅡ
中圖分類號:TP332 文獻(xiàn)標(biāo)識碼:A
文章編號:1004-373X(2010)11-0154-03
Design and Realization of UART Based on FPGA
HE Yong
(College of Computer Science Information, Guizhou University, Guiyang 550025, China)
Abstract: A method to design and realize the universal asynchronous receiver/transmitter(UART) based on the field programmable gate array(FPGA) is introduced.The functions of UART are described formally by using the finite state machine model, by the way, UART is realized on the basis of VHDL. Moreover, the data transmission is detected with SignalTapⅡ which is an embedded logic analyzer in Quartus Ⅱ. The result proves the validity of the design.
Keywords: FPGA; UART; finite state machine; SignalTapⅡ
0 引 言
通用異步收發(fā)器(Universal Asynchronous Receiver/Transmitter,UART)可以和各種標(biāo)準(zhǔn)串行接口,如RS 232和RS 485等進(jìn)行全雙工異步通信,具有傳輸距離遠(yuǎn)、成本低、可靠性高等優(yōu)點(diǎn)[1]。一般UART由專用芯片如8250,16450來實(shí)現(xiàn),但專用芯片引腳都較多,內(nèi)含許多輔助功能,在實(shí)際使用時往往只需要用到UART的基本功能,使用專用芯片會造成資源浪費(fèi)和成本提高。
一般而言UART和外界通信只需要兩條信號線RXD和TXD,其中RXD是UART的接收端,TXD是UART的發(fā)送端, 接收與發(fā)送是全雙工形式。由于可編程邏輯器件技術(shù)的快速發(fā)展,F(xiàn)PGA的功能日益強(qiáng)大,其開發(fā)周期短、可重復(fù)編程的優(yōu)點(diǎn)也越來越明顯,在FPGA芯片上集成UART功能模塊并和其他模塊組合可以很方便地實(shí)現(xiàn)一個能與其他設(shè)備進(jìn)行串行通信的片上系統(tǒng)。
1 UART功能設(shè)計(jì)
1.1 UART的工作原理
異步通信時,UART發(fā)送/接收數(shù)據(jù)的傳輸格式如圖1所示,一個字符單位由開始位、數(shù)據(jù)位、停止位組成。
圖1 異步通信字符傳輸格式
異步通信的一幀傳輸經(jīng)歷以下步驟:
(1) 無傳輸。發(fā)送方連續(xù)發(fā)送信號,處于信息“1”狀態(tài)。
(2) 起始傳輸。發(fā)送方在任何時刻將傳號變成空號,即“1”跳變到“0”,并持續(xù)1位時間表明發(fā)送方開始傳輸數(shù)據(jù)。而同時,接收方收到空號后,開始與發(fā)送方同步,并期望收到隨后的數(shù)據(jù)。
(3) 奇偶傳輸。數(shù)據(jù)傳輸之后是可供選擇的奇偶位發(fā)送或接收。
(4) 停止傳輸。最后是發(fā)送或接收的停止位,其狀態(tài)恒為“1”。
發(fā)送或接收一個完整的字節(jié)信息,首先是一個作為起始位的邏輯“0”位,接著是8個數(shù)據(jù)位,然后是停止位邏輯“1”位,數(shù)據(jù)線空閑時為高或“1”狀態(tài)。起始位和停止位的作用是使接收器能把局部時鐘與每個新開始接收的字符再同步。異步通信沒有可參照的時鐘信號,發(fā)送器可以隨時發(fā)送數(shù)據(jù),任何時刻串行數(shù)據(jù)到來時,接收器必須準(zhǔn)確地發(fā)現(xiàn)起始位下降沿的出現(xiàn)時間,從而正確采樣數(shù)據(jù)[2]。
設(shè)計(jì)時可參考由專用芯片實(shí)現(xiàn)的UART的功能并進(jìn)行一定精簡,如可以用FPGA的片內(nèi)RAM替代UART的FIFO[2-3],不用單獨(dú)在UART模塊中實(shí)現(xiàn)。設(shè)計(jì)的基本原則是保留最主要的功能,基于FPGA的UART系統(tǒng)由波特率時鐘發(fā)生器、接收器和發(fā)送器3個子模塊組成,如圖2所示。
圖2 UART功能框圖
1.2 接收器設(shè)計(jì)
比較而言,UART發(fā)送器的設(shè)計(jì)相對容易,只要每隔一個發(fā)送周期并按照數(shù)據(jù)幀格式輸出數(shù)據(jù)即可,本文將對接收器的設(shè)計(jì)和實(shí)現(xiàn)做詳細(xì)說明,發(fā)送器的設(shè)計(jì)方法基本相同。
接收器的工作過程如下,在接收數(shù)據(jù)寄存器被讀出一幀數(shù)據(jù)或系統(tǒng)開始工作以后,接收進(jìn)程被啟動。接收進(jìn)程啟動之后,檢測起始位,檢測到有效起始位后,以約定波特率的時鐘開始接收數(shù)據(jù),根據(jù)數(shù)據(jù)位數(shù)的約定,計(jì)數(shù)器統(tǒng)計(jì)接收位數(shù)。一幀數(shù)據(jù)接收完畢之后,如果使用了奇偶校驗(yàn),則檢測校驗(yàn)位,如無誤則接收停止位。停止位接收完畢后,將接收數(shù)據(jù)轉(zhuǎn)存到數(shù)據(jù)寄存器中。
為確保接收器可靠工作,在接收端開始接收數(shù)據(jù)位之前,處于搜索狀態(tài),這時接收端以16倍波特率的速率讀取線路狀態(tài),檢測線路上出現(xiàn)低電平的時刻。因?yàn)楫惒絺鬏數(shù)奶攸c(diǎn)是以起始位為基準(zhǔn)同步的。然而,通信線上的噪音也極有可能使傳號“1”跳變到空號“0”。所以接收器以16倍的波特率對這種跳變進(jìn)行檢測,直至在連續(xù)8個接收時鐘以后采樣值仍然是低電平,才認(rèn)為是一個真正的起始位,而不是噪音引起的,其中若有一次采樣得到的為高電平則認(rèn)為起始信號無效,返回初始狀態(tài)重新等待起始信號的到來。找到起始位以后,就開始接收數(shù)據(jù),最可靠的接收應(yīng)該是接收時鐘的出現(xiàn)時刻正好對著數(shù)據(jù)位的中央。由于在起始位檢測時,已使時鐘對準(zhǔn)了位中央,用16倍波特率的時鐘作為接收時鐘,就是為了確保在位寬的中心時間對接收的位序列進(jìn)行可靠采樣,當(dāng)采樣計(jì)數(shù)器計(jì)數(shù)結(jié)束后所有數(shù)據(jù)位都已經(jīng)輸入完成。最后對停止位的高電平進(jìn)行檢測,若正確檢測到高電平,說明本幀的各位正確接收完畢,將數(shù)據(jù)轉(zhuǎn)存到數(shù)據(jù)寄存器中,否則出錯。
采用有限狀態(tài)機(jī)模型可以更清晰明確地描述接收器的功能,便于代碼實(shí)現(xiàn)[4-6]。接收器的狀態(tài)轉(zhuǎn)換圖如圖3所示,為突出主要過程,圖中省略了奇偶校驗(yàn)的情況。接收器狀態(tài)機(jī)由5個工作狀態(tài)組成,分別是空閑狀態(tài)、起始位確認(rèn)、采樣數(shù)據(jù)位、停止位確認(rèn)和數(shù)據(jù)正確,觸發(fā)狀態(tài)轉(zhuǎn)換的事件和在各個狀態(tài)執(zhí)行的動作見圖中的文字說明。
圖3 接收器狀態(tài)機(jī)狀態(tài)轉(zhuǎn)換圖
在狀態(tài)機(jī)模型的基礎(chǔ)上,使用VHDL來描述接收器功能,其主要代碼如下:
--狀態(tài)類型說明,定義各狀態(tài)子類型
type states is(u_idle,u_start,u_data,u_stop,u_move);
signal current_state, next_ state: states :=u_idle;
--時序進(jìn)程,狀態(tài)機(jī)運(yùn)轉(zhuǎn)和狀態(tài)轉(zhuǎn)換進(jìn)程
process(div16)
begin
if (div16′event and div16=1)then current_state<=next_state;
end if;
end process;
--組合進(jìn)程,各個狀態(tài)的工作過程和狀態(tài)轉(zhuǎn)換方式--在每個狀態(tài)中,執(zhí)行規(guī)定動作并根據(jù)條件賦值next_state
process(current_state)
begin
case current_state is
when u_idle =>--狀態(tài)0,空閑狀態(tài),檢測起始位
when u_start => --狀態(tài)1,起始位確認(rèn)
when u_data => --狀態(tài)2,采樣數(shù)據(jù)位
when u_stop => --狀態(tài)3,停止位確認(rèn)
when u_move=>--狀態(tài)4,數(shù)據(jù)幀正確,數(shù)據(jù)裝入數(shù)據(jù)寄存器
when others => next_states<=u_idle;
end case;
end process;
實(shí)現(xiàn)用16倍波特率時鐘確定起始位的具體方法是設(shè)計(jì)兩個輸入數(shù)據(jù)位寄存器rxd1和rxd2,使用語句“rxd1<=rxd;rxd2<=rxd1;”接收數(shù)據(jù)并進(jìn)行判斷。當(dāng)檢測到rxd1=0并且rxd2=1時可以確定下降沿發(fā)生,連續(xù)7個時鐘rxd2=0即確定檢測到起始位,之后為了確保在數(shù)據(jù)位中央接收數(shù)據(jù),同樣用16倍波特率時鐘對數(shù)據(jù)位進(jìn)行采樣。接收數(shù)據(jù)的方法是設(shè)計(jì)一個寄存器rxd_buf(7 downto 0),用語句“rxd_buf(7) <= rxd2; rxd_buf(6 DOWNTO 0) <= rxd_buf(7 DOWNTO 1);”實(shí)現(xiàn)移位寄存器右移操作,執(zhí)行8次后接收到一個完整數(shù)據(jù)。
1.3 波特率發(fā)生器設(shè)計(jì)
波特率發(fā)生器實(shí)質(zhì)是設(shè)計(jì)一個分頻器,用于產(chǎn)生和RS 232通信同步的時鐘[7]。在系統(tǒng)中用一個計(jì)數(shù)器來完成這個功能,分頻系數(shù)N決定了波特率的數(shù)值。該計(jì)數(shù)器一般工作在一個頻率較高的系統(tǒng)時鐘下,當(dāng)計(jì)數(shù)到N/2時將輸出置為高電平,再計(jì)數(shù)到N/2的數(shù)值后將輸出置為低電平,如此反復(fù)即可得到占空比50%的波特率時鐘,具體的波特率依賴于所使用的系統(tǒng)時鐘頻率和N的大小。如系統(tǒng)時鐘頻率是40 MHz,要求波特率是9 600,則16倍波特率時鐘的周期約等于260個系統(tǒng)時鐘周期,則計(jì)數(shù)器取260/2=130時,當(dāng)計(jì)數(shù)溢出時輸出電平取反就可以得到16倍約定波特率的時鐘。
使用VHDL來描述波特率發(fā)生器的完整代碼如下:
entity baud_generator is
port(clk,reset:in std_logic;
div16:out std_logic);
end baud_generator;
architecture beh of baud_generator is
begin
process(clk,reset)
variable cnt:integer;
begin
if (reset=′0′) then cnt:=0; div16<=′0′;
--設(shè)置分頻系數(shù),即確定波特率
elsif clk′event and clk=′1′ then
if cnt=130-1 then
cnt:=0;div16 <= not div16;
else cnt:=cnt+1;
end if;
end if;
end process;
end beh;
2 數(shù)據(jù)傳輸測試
隨著邏輯設(shè)計(jì)復(fù)雜性的不斷增加,僅依賴于軟件方式的仿真測試來了解系統(tǒng)的硬件功能有很多的局限性[8],應(yīng)用QuartusⅡ集成開發(fā)環(huán)境中提供的SignalTapⅡ嵌入式邏輯分析儀,可以將測試信息隨設(shè)計(jì)文件下載于目標(biāo)芯片中,用以捕獲目標(biāo)芯片內(nèi)部系統(tǒng)信號節(jié)點(diǎn)處的信息或總線上的數(shù)據(jù)流,而又不影響原硬件系統(tǒng)的正常工作。測試信息通過器件的JTAG端口傳出,并送入計(jì)算機(jī)進(jìn)行顯示和分析,這是一種高效的硬件測試手段,并很好地結(jié)合了傳統(tǒng)的系統(tǒng)測試方法。
本設(shè)計(jì)在Altera Cyclone系列的EP1C6Q240C8芯片上進(jìn)行了驗(yàn)證,使用QuartusⅡ軟件將編譯好的.pof格式文件以AS模式下載到配置芯片EPCS1中[9]。在計(jì)算機(jī)端運(yùn)行串口調(diào)試助手軟件,將數(shù)據(jù)從計(jì)算機(jī)送出,并利用FPGA上的UART模塊進(jìn)行接收,將發(fā)送數(shù)據(jù)與SignalTapⅡ獲取的波形進(jìn)行對比,經(jīng)多次測試表明收發(fā)數(shù)據(jù)完全相同。
以其中一次的測試為例進(jìn)行說明,從PC上輸入ASCII碼的“6”,設(shè)定波特率發(fā)生器時鐘作為SignalTapⅡ的采樣時鐘,采樣波形如圖4所示,其中“recstart”表示開始接收數(shù)據(jù)幀標(biāo)志;“div16”表示16倍波特率時鐘;“cnt_rxd”表示數(shù)據(jù)位采樣計(jì)數(shù)器,一次完整的采樣計(jì)數(shù)從0h~9h共10次采樣(1個起始位,8個數(shù)據(jù)位,1個停止位);“rxd”表示串口的接收端;“rxd_buf”表示移位寄存器,當(dāng)數(shù)據(jù)停止位確認(rèn)后,移位寄存器輸出收到的數(shù)據(jù)“36h”,表明了該UART工作穩(wěn)定可靠。
圖4 嵌入式邏輯分析儀獲得的波形
應(yīng)特別注意的是當(dāng)利用SignalTapⅡ進(jìn)行測試工作結(jié)束后,在生成最終產(chǎn)品前,應(yīng)將SignalTapⅡ從芯片中除去,以免占用額外的資源,然后再重新編譯下載[10]。全程編譯后報(bào)告消耗邏輯單元142個,只占芯片總資源的2%,沒有占用芯片的存儲單元和PLL單元,對于一個中大規(guī)模的FPGA芯片而言這是非常少的資源消耗。
3 結(jié) 語
基于FPGA設(shè)計(jì)和實(shí)現(xiàn)UART,可以用片上很少的邏輯單元實(shí)現(xiàn)UART的基本功能。與傳統(tǒng)設(shè)計(jì)相比,能有效減少系統(tǒng)的PCB面積,降低系統(tǒng)的功耗,提高設(shè)計(jì)的穩(wěn)定性和可靠性,并可方便地進(jìn)行系統(tǒng)升級和移植。
本設(shè)計(jì)具有較大的靈活性,通過調(diào)整波特率發(fā)生器的分頻參數(shù),就可以使其工作在不同的頻率。采用16倍波特率的采樣時鐘,可以實(shí)時有效探測數(shù)據(jù)的起始位,并可對數(shù)據(jù)位進(jìn)行“對準(zhǔn)”中央采樣,保證了所采樣數(shù)據(jù)的正確性。該模塊可以作為一個完整的IP核移植進(jìn)各種FPGA中,在實(shí)際應(yīng)用時可嵌入到其他系統(tǒng)中,很容易實(shí)現(xiàn)和遠(yuǎn)端上位機(jī)的異步通信。
參考文獻(xiàn)
[1]張德,馬淑芬,李海,等.專用異步串行通信電路的FPGA實(shí)現(xiàn)[J].微計(jì)算機(jī)信息,2005,21(3):152-153.
[2]常勝,黃啟俊.基于異步FIFO實(shí)現(xiàn)不同時鐘域間數(shù)據(jù)傳遞的設(shè)計(jì)[J].電子設(shè)計(jì)應(yīng)用,2004(8):57-59.
[3]CUMMINGS C E, ALFKE Peter. Simulation and synthesis techniques for asynchronous FIFO design with asynchronous pointer comparisons[M]. \\: SNUG, 2002.
[4]韓俊剛,杜慧敏.數(shù)字硬件的形式化驗(yàn)證[M].北京:北京大學(xué)出版社,2001.
[5]茅劍鋒,趙千川.異步電路驗(yàn)證算法[J].計(jì)算機(jī)學(xué)報(bào),2004,27(1):67-78.
[6]蘇繼強(qiáng),沈云付.基于模型檢查的VHDL到FSM的轉(zhuǎn)換[J].計(jì)算機(jī)工程與設(shè)計(jì),2008,29(22):5840-5842.
[7]潘松,黃繼業(yè).EDA技術(shù)與VHDL[M].2版.北京:清華大學(xué)出版社,2008.
[8]億特科技.CPLD/FPGA應(yīng)用系統(tǒng)設(shè)計(jì)與產(chǎn)品開發(fā)[M].北京:人民郵電出版社,2005.
[9]Altera Corporation. Altera Digital Library[M]. \\: Altera, 2002.
[10]金德鵬,沙燕萍.Altera FPGA在數(shù)字通信系統(tǒng)設(shè)計(jì)中的應(yīng)用[J].電子技術(shù)應(yīng)用,2005(4):54-56.