王昱煜
本文介紹了一種利用FPGA實現UART通用異步收發器模塊的方法,所設計的UART模塊充分利用了FPGA硬件可編程性、高度集成性、實時性的特點。實踐測試表明,該模塊設計具有高可靠性、便于擴展和移植的優點。
【關鍵詞】FPGA UART 狀態機
通用異步收發器(Universal Asynchronous Receiver Transmitter,UART)是數字通信領域流行和廣泛使用的一種接口設備,它可以和各種標準串行接口,如RS232、RS485等進行異步通信,具有傳輸距離遠、成本低、可靠性高等優點。
一般來說UART通信需要使用專門的接口協議芯片,但是這種協議芯片存在體積較大、接口復雜且成本較高的缺點。此外,這種芯片的結構與功能相對固定,在設計中缺乏靈活性。本文介紹了利用FPGA實現UART通訊的方法,將原來UART專用協議芯片的功能集成到了FPGA中,提高了設計的靈活性與可靠性。
1 UART通訊原理
支持UART的串行接口目前比較常用的有RS232、RS422、RS485等,它們之間的區別主要表現在電氣特性上,但最基本的通訊原理是一樣的。UART模塊接收/發送的都是符合TTL(或CMOS)標準的邏輯電平,與外設之間還需要經過專門的轉換芯片將通訊數據轉化為符合RS232、RS422或RS485標準的電平。
UART作為一種異步串行通訊方式,數據在通訊過程中是字節為單位按位傳輸,一般從最低有效位(LSB)開始。典型的UART通訊數據格式如圖1所示。
2 UART的FPGA實現
UART通訊模塊內部邏輯結構如圖2,可分為控制模塊、接收模塊和發送模塊,各個模塊的主要功能如下:
控制模塊:根據CPU寫入的數據配制UART通訊參數,并根據接收、發送模塊回送的指令產生相應中斷上報給CPU,對接收、發送模塊狀態進行監控、管理;
接收模塊:該模塊主要用于將接收到的串行數據轉化為并行數據,再以本地總線形式發送給CPU。此外,該模塊還將接收過程中的參數上報給控制模塊,用于監控管理以及接收中斷、錯誤中斷的產生。
發送模塊:該模塊主要用于將CPU要發送的數據在控制邏輯的調度下轉化為串行數據后發送出去,此外該模塊還將發送過程中的參數上報給控制模塊,用于監控管理以及發送中斷、錯誤中斷的產生。
2.1 接收模塊的設計
該模塊的數據接收過程通過一個狀態機來實現,其狀態轉移圖如圖3所示,狀態轉移所用的時鐘是波特率時鐘16倍頻clk16x。整個工作流程如下:
2.1.1 系統復位后
狀態機進入idle狀態等待起始位,當接收端電平由高變為低(RXD值由1變為0)時即為檢測到了一個起始位,狀態機進入start狀態;
2.1.2 start狀態下
等待8個clk16x周期后再判斷一次RXD的值,若不為0,則說明之前接收到的是由于線上干擾而引起的虛假起始位,狀態機返回idle狀態;若仍為0則再等待8個clk16x周期后狀態機進入shift狀態;
2.1.3 shift狀態下
模塊每隔16個clk16x周期從RXD上讀取1bit的數據進行移位操作,直到讀完全部8bit數據后,若奇偶校驗被使能,則狀態機進入parity狀態,否則直接進入stop狀態;
2.1.4 parity狀態下
模塊等待16個clk16x周期從RXD上讀取1bit的奇偶校驗位的值,之后狀態機進入stop狀態;
2.1.5 stop狀態下
模塊等待16個clk16x周期從RXD上讀取1bit的停止位的值,之后狀態機進入done狀態,停止位值經取反操作后用做幀錯誤校驗位;
2.1.6 done狀態下
若奇偶校驗被使能,且奇偶檢驗與幀校驗均正確,或奇偶校驗未被使能,但幀校驗正確時,移位寄存器中的8bit數據被存入接收FIFO中,否則該數據被丟棄。狀態機將在1個clk16x周期后返回idle,等待新數據。
2.2 發送模塊的設計
該模塊的數據發送過程通過一個狀態機來實現,其狀態轉移圖如圖4所示,狀態轉移所用的時鐘是波特率時鐘16倍頻clk16x。整個工作流程如下:
2.2.1 系統復位后
狀態機進入idle狀態等待發送FIFO中寫入數據,當FIFO的非空標志被置位時狀態機進入start狀態;
2.2.2 start狀態下
模塊先發送一個數據起始位,同時從FIFO中讀取一個字節的數據放入發送移位寄存器,然后狀態機進入shift狀態;
2.2.3 shift狀態下
模塊按照LSB在前,MSB在后的順序,每間隔16個clk16x周期從移位寄存器中移出1bit的數據,直到移完全部8bit數據后,若奇偶校驗被使能,則狀態機進入parity狀態,否則直接進入stop狀態;
2.2.4 parity狀態下
模塊等待16個clk16x周期從TXD上發出1bit的奇偶校驗位,之后狀態機進入stop狀態;
2.2.5 stop狀態下
模塊等待16個clk16x周期從TXD上發出1bit的停止位(TXD上為1),之后狀態機進入done狀態;
2.2.6 done狀態下
表示一個字節數據發送完成,狀態機在1個clk16x周期后直接回到idle狀態,等待發送新的數據。
2.3 控制模塊的設計
控制模塊的主要作用是根據CPU寫入的參數對UART進行配制,此外還能根據接收/發送模塊的工作狀態產生中斷,并上報給CPU。該模塊內部結構由一個波特率時鐘發生器、三個寄存器以及中斷仲裁邏輯組成。
波特率時鐘發生器能對輸入的系統時鐘進行分頻操作,從而產生相應的波特率16倍頻后的時鐘clk16x。
三個寄存器分別是控制寄存器(conreg)、中斷使能寄存器(int_en_reg)以及狀態寄存器(statusreg)。其中conreg和int_en_reg是只寫存儲器,它們分別用于存儲CPU寫入的UART配制參數以及中斷使能條件,UART即按照這兩個寄存器中被寫入的參數進行工作;statusreg是只讀存儲器,存儲了UART工作時的狀態數據,CPU通過讀取這些狀態信息來做出相應的操作。
控制模塊在中斷被使能的前提下,根據中斷仲裁邏輯,向CPU發送三種中斷:錯誤中斷、接收中斷、發送中斷。這三種中斷的產生條件如下:
(1)錯誤中斷。當接收數據時,若奇偶校驗或幀校驗錯誤,則在接收端RXD上的串行數據全部移入移位寄存器后,該中斷即被置位;
(2)接收中斷。在接收到新數據,并且接收到的數據被保存至接收FIFO后,該中斷即被置位;
(3)發送中斷。在發送數據時,當發送FIFO中的數據被發送移位寄存器讀空以后,該中斷即被置位。
3 結論
本文提出了一種基于FPGA設計和實現UART的方法,通過利用FPGA片上邏輯資源來實現UART的基本功能,其通訊波特率、校驗方法、中斷方式均可根據實際需要進行配制。此外,利用FPGA的可重配置性,還可以在FPGA上方便的實現多路UART通訊擴展,與傳統設計相比,能有效減少系統的PCB面積,降低系統的功耗,提高設計的穩定性和可靠性,并可方便地進行系統升級和移植。
參考文獻
[1]何健標,王宏遠,林靜宜,等.基于最佳接收的UART的設計與實現[J].電子技術應用,2006(8):55-58.
[2]何慧珠,秦麗,張會新.基于FPGA的UART IP設計與實現[J].微計算信息,2008,24(1):223-224.
[3]陳小琴.基于Verilog HDL的多功能信號發生器的設計與實現[J].儀器儀表學報, 2008,29(4):322-324.
[4]季雄,段繼海,胡媛媛,等.基于Verilog HDL的UART設計[J].微計算機信息,2006,6(2):230-232.
[5]趙延,葛利嘉,雙濤,基于FPGA的UART設計實現及其驗證方法[J],現代電子技術,2008(17):163-164.
作者單位
蘇州長風航空電子有限公司 江蘇省蘇州市 215151