引言
通用異步收發器(Universal Asynchronous Receiver/Transmitter,UART)可以和各種標準串行接口,如RS 232和RS 485等進行全雙工異步通信,具有傳輸距離遠、成本低、可靠性高等優點。一般UART由專用芯片如8250,16450來實現,但專用芯片引腳都較多,內含許多輔助功能,在實際使用時往往只需要用到UART的基本功能,使用專用芯片會造成資源浪費和成本提高。
一般而言UART和外界通信只需要兩條信號線RXD和TXD,其中RXD是UART的接收端,TXD是UART的發送端,接收與發送是全雙工形式。由于可編程邏輯器件技術的快速發展,FPGA的功能日益強大,其開發周期短、可重復編程的優點也越來越明顯,在FPGA芯片上集成UART功能模塊并和其他模塊組合可以很方便地實現一個能與其他設備進行串行通信的片上系統。
1 UART功能設計
1.1 UART的工作原理
異步通信時,UART發送/接收數據的傳輸格式如圖1所示,一個字符單位由開始位、數據位、停止位組成。
異步通信的一幀傳輸經歷以下步驟:
(1)無傳輸。發送方連續發送信號,處于信息“1”狀態。
(2)起始傳輸。發送方在任何時刻將傳號變成空號,即“1”跳變到“O”,并持續1位時間表明發送方開始傳輸數據。而同時,接收方收到空號后,開始與發送方同步,并期望收到隨后的數據。
(3)奇偶傳輸。數據傳輸之后是可供選擇的奇偶位發送或接收。
(4)停止傳輸。最后是發送或接收的停止位,其狀態恒為“1”。
發送或接收一個完整的字節信息,首先是一個作為起始位的邏輯“0”位,接著是8個數據位,然后是停止位邏輯“1”位,數據線空閑時為高或“1”狀態。起始位和停止位的作用是使接收器能把局部時鐘與每個新開始接收的字符再同步。異步通信沒有可參照的時鐘信號,發送器可以隨時發送數據,任何時刻串行數據到來時,接收器必須準確地發現起始位下降沿的出現時間,從而正確采樣數據。
設計時可參考由專用芯片實現的UART的功能并進行一定精簡,如可以用FPGA的片內RAM替代UART的FIFO,不用單獨在UART模塊中實現。設計的基本原則是保留最主要的功能,基于FPGA的UART系統由波特率時鐘發生器、接收器和發送器3個子模塊組成,如圖2所示。
1.2 接收器設計
比較而言,UART發送器的設計相對容易,只要每隔一個發送周期并按照數據幀格式輸出數據即可,本文將對接收器的設計和實現做詳細說明,發送器的設計方法基本相同。
接收器的工作過程如下,在接收數據寄存器被讀出一幀數據或系統開始工作以后,接收進程被啟動。接收進程啟動之后,檢測起始位,檢測到有效起始位后,以約定波特率的時鐘開始接收數據,根據數據位數的約定,計數器統計接收位數。一幀數據接收完畢之后,如果使用了奇偶校驗,則檢測校驗位,如無誤則接收停止位。停止位接收完畢后,將接收數據轉存到數據寄存器中。
為確保接收器可靠工作,在接收端開始接收數據位之前,處于搜索狀態,這時接收端以16倍波特率的速率讀取線路狀態,檢測線路上出現低電平的時刻。因為異步傳輸的特點是以起始位為基準同步的。然而,通信線上的噪音也極有可能使傳號“1”跳變到空號“0”。所以接收器以16倍的波特率對這種跳變進行檢測,直至在連續8個接收時鐘以后采樣值仍然是低電平,才認為是一個真正的起始位,而不是噪音引起的,其中若有一次采樣得到的為高電平則認為起始信號無效,返回初始狀態重新等待起始信號的到來。找到起始位以后,就開始接收數據,最可靠的接收應該是接收時鐘的出現時刻正好對著數據位的中央。由于在起始位檢測時,已使時鐘對準了位中央,用16倍波特率的時鐘作為接收時鐘,就是為了確保在位寬的中心時間對接收的位序列進行可靠采樣,當采樣計數器計數結束后所有數據位都已經輸入完成。最后對停止位的高電平進行檢測,若正確檢測到高電平,說明本幀的各位正確接收完畢,將數據轉存到數據寄存器中,否則出錯。
采用有限狀態機模型可以更清晰明確地描述接收器的功能,便于代碼實現。接收器的狀態轉換圖如圖3所示,為突出主要過程,圖中省略了奇偶校驗的情況。接收器狀態機由5個工作狀態組成,分別是空閑狀態、起始位確認、采樣數據位、停止位確認和數據正確,觸發狀態轉換的事件和在各個狀態執行的動作見圖中的文字說明。
在狀態機模型的基礎上,使用VHDL來描述接收器功能,其主要代碼如下:
實現用16倍波特率時鐘確定起始位的具體方法是設計兩個輸入數據位寄存器rxd1和rxd2,使用語句“rxd1<=rxd;rxd2<=rxd1;”接收數據并進行判斷。當檢測到rxdl=O并且rxd2=1時可以確定下降沿發生,連續7個時鐘rxd2=0即確定檢測到起始位,之后為了確保在數據位中央接收數據,同樣用16倍波特率時鐘對數據位進行采樣。接收數據的方法是設計一個寄存器rxd_buf(7 downto 0),用語句“rxd_buf(7)<=rxd2;rxd_buf(6 DOWNTO 0)<=rxd_buf(7 DOWNTO 1);”實現移位寄存器右移操作,執行8次后接收到一個完整數據。
1.3 波特率發生器設計
波特率發生器實質是設計一個分頻器,用于產生和RS 232通信同步的時鐘。在系統中用一個計數器來完成這個功能,分頻系數N決定了波特率的數值。該計數器一般工作在一個頻率較高的系統時鐘下,當計數到N/2時將輸出置為高電平,再計數到N/2的數值后將輸出置為低電平,如此反復即可得到占空比50%的波特率時鐘,具體的波特率依賴于所使用的系統時鐘頻率和N的大小。如系統時鐘頻率是40 MHz,要求波特率是9 600,則16倍波特率時鐘的周期約等于260個系統時鐘周期,則計數器取260/2=130時,當計數溢出時輸出電平取反就可以得到16倍約定波特率的時鐘。
使用VHDL來描述波特率發生器的完整代碼如下:
2 數據傳輸測試
隨著邏輯設計復雜性的不斷增加,僅依賴于軟件方式的仿真測試來了解系統的硬件功能有很多的局限性,應用QuartusⅡ集成開發環境中提供的SignalTapⅡ嵌入式邏輯分析儀,可以將測試信息隨設計文件下載于目標芯片中,用以捕獲目標芯片內部系統信號節點處的信息或總線上的數據流,而又不影響原硬件系統的正常工作。測試信息通過器件的JTAG端口傳出,并送入計算機進行顯示和分析,這是一種高效的硬件測試手段,并很好地結合了傳統的系統測試方法。
本設計在Altera Cyclone系列的EPlC6Q240C8芯片上進行了驗證,使用QuarltusⅡ軟件將編譯好的.pof格式文件以AS模式下載到配置芯片EPCS1中。在計算機端運行串口調試助手軟件,將數據從計算機送出,并利用FPGA上的UART模塊進行接收,將發送數據與SignalTapⅡ獲取的波形進行對比,經多次測試表明收發數據完全相同。
以其中一次的測試為例進行說明,從PC上輸入ASCII碼的“6”,設定波特率發生器時鐘作為SignalTapⅡ的采樣時鐘,采樣波形如圖4所示,其中“recstart”表示開始接收數據幀標志;“divl6”表示16倍波特率時鐘;“cnt_rxd”表示數據位采樣計數器,一次完整的采樣計數從Oh~9h共10次采樣(1個起始位,8個數據位,1個停止位);“rxd”表示串口的接收端;“rxd_buf”表示移位寄存器,當數據停止位確認后,移位寄存器輸出收到的數據“36h”,表明了該UART工作穩定可靠。
應特別注意的是當利用SignalTapⅡ進行測試工作結束后,在生成最終產品前,應將SignalTapⅡ從芯片中除去,以免占用額外的資源,然后再重新編譯下載。全程編譯后報告消耗邏輯單元142個,只占芯片總資源的2%,沒有占用芯片的存儲單元和PLL單元,對于一個中大規模的FPGA芯片而言這是非常少的資源消耗。
3 結語
基于FPGA設計和實現UART,可以用片上很少的邏輯單元實現UART的基本功能。與傳統設計相比,能有效減少系統的PCB面積,降低系統的功耗,提高設計的穩定性和可靠性,并可方便地進行系統升級和移植。
本設計具有較大的靈活性,通過調整波特率發生器的分頻參數,就可以使其工作在不同的頻率。采用16倍波特率的采樣時鐘,可以實時有效探測數據的起始位,并可對數據位進行“對準”中央采樣,保證了所采樣數據的正確性。該模塊可以作為一個完整的IP核移植進各種FPGA中,在實際應用時可嵌入到其他系統中,很容易實現和遠端上位機的異步通信。
-
FPGA
+關注
關注
1629文章
21729瀏覽量
603017 -
芯片
+關注
關注
455文章
50721瀏覽量
423165 -
收發器
+關注
關注
10文章
3424瀏覽量
105961
發布評論請先 登錄
相關推薦
評論