摘 要:在基于FPGA芯片的工程實踐中,經常需要FPGA與上位機或其他處理器進行通信,為此設計了用于短距離通信的UART接口模塊。該模塊的程序采用VHDL語言編寫,模塊的核心發送和接收子模塊均采用有限狀態機設計,詳述了各子模塊的設計思路和方法,給出了它們的仿真時序圖。綜合實現后,將程序下載到FPGA芯片中,運行正確無誤。又經長時間發送和接收測試,運行穩定可靠。相對參數固定的設計,該UART的波特率、數據位寬、停止位寬、校驗位使能及校驗模式選擇均可以在線設置,為FPGA與其他設備的通信提供了一種可靠途徑,具備較強的實用價值。
0 引 言
通用異步收發器(universal asynchronous receivertransmitter,UART)盡管自20世紀70年代就已出現,但因其簡單可靠,目前仍是一種使用廣泛的串行通信接口。各種微處理器,不論是單片機,還是DSP、ARM,UART都是基本外圍模塊。許多場合如系統監控、數據采集都要用到串口通信[1-3],甚至要用多個串口,如開發串口服務器[4-6]。此時通常采用專用芯片,如16C554、VK3224等擴展串口。專用芯片使用簡單,然而缺乏靈活性,同時專用芯片集成的串口數量也有限,有時需使用多個芯片才能滿足要求[5],增加了系統的復雜度,降低了可靠性。
FPGA(field programmable gate array)作為一種可編程芯片,其資源豐富、工作效率高,常用于高速數據采集、算法的高速并行執行[7-8]。用戶可通過硬件描述語言或電路原理圖,設計出個性化的高性能電路模塊,具有設計靈活,升級方便的優點。
在基于FPGA的工程實踐中,常需要其與串口設備通信,但在Xilinx現有的開發環境ISE中沒有相關的IP核。目前也有使用FPGA設計UART的例子[9-13]后,但有的參數固定,缺乏通用性。本文設計和實現了參數可在線配置的UART接口模塊,為FPGA與其他設備通信提供了一種可靠途徑。
1 UART串行通信簡介
標準的RS232接口常采用DB-9連接器,其有2根數據線,6根控制線,1根信號地線。本文設計的UART符合RS232串行通信標準,但在實際中,RS232標準中諸多控制信號使用較少,故文中的UART只使用其中的3根信號線,即TXD、RXD和信號地,這也是很多微處理器UART模塊所采用的信號線。
UART屬于異步通信接口,通信雙方需約定好波特率。國際上規定了一系列標準的波特率,如9 600b/s、19 200b/s、115 200b/s等。UART每一數據幀,依次由起始位(1位)、數據位(5~8位),奇偶校驗位(可選的1位)以及停止位(1~2位)組成。其中數據位部分是從最低位先開始傳送的;奇偶校驗位是對1幀數據中的數據部分和校驗位計算,使‘1’的個數滿足奇數個或偶數個。當UART空閑時,收發引腳RXD與TXD均是高電平。一旦需要發送數據,則首先向TXD引腳輸出低電平作為起始位,表示1幀數據的開始。而在接收數據時,檢測到起始位將啟動一次數據接收流程。
2 系統設計
本文設計的UART通信接口主要由波特率產生模塊、發送模塊、接收模塊以及微處理器接口模塊組成。各模塊使用VHDL語言來表述,模塊之間的信號連接是通過頂層文件中的元件例化語句實現。

整個設計的結構框圖如圖1所示。設計和實現的UART通信模塊主要功能如下:
1)實現了串行數據的發送和接收。
2)停止位可設置(1位或2位)。
3)可設置是否啟用奇偶校驗功能,以及校驗模式設置即選擇奇校驗還是偶校驗。
4)波特率可配置。標準的波特率系列中從9 600~115 200b/s均可設置,同時還支持自定義的波特率。
5)設計了微處理器接口,通過接口可訪問UART內部寄存器,配置UART參數,讀寫收發數據。
該UART 通信接口包含2 個數據緩沖寄存器(TxHolder和RxHolder)、3 個控制寄存器(UartCon、UartBaud及UartIntEn)、3 個狀態寄存器(UartState、UartError、UartIntPend)。考慮到需要在線更新UART參數,設計UartCon與UartBaud為雙緩沖寄存器。第一級緩沖用于存儲外部處理器寫入的配置數據,第二級緩沖即用于設置UART內核。當UART內核空閑時,才將第二級緩沖內容更新為第一級緩沖內容,防止破壞收發中的數據。
3 UART各模塊的設計
下面詳細介紹UART各模塊的設計思路和方法,同時給出了主要模塊的行為仿真時序圖。
3.1 波特率發生模塊
波特率發生模塊的作用是產生UART工作所需的時鐘信號,其頻率定為實際波特率的16倍。波特率發生模塊本質是1個可預置初值的計數器,每當計數達到預置值時輸出高電平,其余值輸出低電平。
3.2 發送模塊
發送模塊按照用戶設置,將TxHolder中的并行數據串行發送出去,其核心為1個有限狀態機,其狀態轉換如圖2所示。

1)Idle狀態
當系統上電復位之后,發送狀態機即進入此狀態。若不向發送緩沖器寫入數據,那么TxDataValid為低電平,表示發送緩沖器空,狀態機始終在此狀態循環等待,TXD引腳輸出高電平。
2)Start狀態
一旦向發送緩沖器TxHolder 中寫入數據,TxDataValid即變為高電平。狀態機由Idle狀態切換到Start狀態,TXD輸出低電平,輸出起始位。
3)Shift狀態
1位波特時間過后,狀態機無條件的轉換到Shift狀態,即使能發送移位寄存器,開始將并行數據逐位右移,實現并串轉換并輸出到TXD。當輸出的數據個數達到Databit設定的數據位寬時,便轉換到Parity或者Stop_1bt狀態,否則仍轉換到該狀態。
4)Parity狀態
若數據位部分發送完畢,且奇偶校驗使能位ParityEn=‘1’時,則轉換到該狀態。該狀態下,根據已發送的數據和選擇的校驗模式,發送校驗位。
5)Stop_1bit狀態
無論停止位為1位還是2位,都先轉換到Stop_1bit狀態,先輸出1位停止位。由該狀態轉換下一狀態時,次態會有多種情況。若設置了stopbit為‘1’即選擇2位停止位時,次態為stop_2bit;若stopbit為‘0’且發送緩沖器為空時,次態即轉換到idle狀態,否則轉換到start狀態開始新一輪的數據發送。
6)Stop_2bit狀態
若選擇2位停止位時,才會進入此狀態。持續1個波特時間后,根據TxDataValid狀態,進入Idle狀態待命,或進入Start狀態開始新1輪的數據發送。
發送模塊的行為仿真時序圖如圖3所示。其UART參數設置為偶校驗、8位數據位和1位停止位。txclk為發送采樣時鐘信號,在該信號的上升沿,發送狀態機狀態翻轉,同時數據被送到TxOut(TXD)引腳。圖中TxOut輸出的數據為“00100110011”,去掉起始位、校驗位和停止位后即為待發送的數據0x32。由仿真所得發送模塊的時序圖可知,該模塊各信號仿真結果正確無誤。

3.3 接收模塊
接收模塊主要功能是將RXD引腳接收到的串行數據按照配置的通信參數,提取出數據部分,存入接受緩沖器,并設置相關狀態寄存器。其核心是1個接收狀態機,狀態轉換如圖4所示。

1)Idle狀態
復位之后,接收狀態機便進入此狀態等待。一旦檢測到RXD為低電平,即一幀數據的起始位,狀態機立即轉換到Start狀態,否則開始數據接收標志StartBitFlag為‘0’,狀態機始終停留在該狀態。正確捕獲到1幀數據的起始位非常重要,它起到同步接收采樣時鐘的作用,是正確接收1幀數據的關鍵。
2)Start狀態
一旦捕獲到起始位,便立即轉入該狀態,啟動一幀數據的接收流程。
3)Shift狀態
起始位之后,狀態機無條件的轉換到Shift狀態,即開始接收數據部分。接收到的每1位數據將逐位左移,實現串并轉換。當接收到的數據個數達到Databit設定的數據位寬時,即轉換到Parity或者Stop_1bt狀態。
4)Parity狀態
當完成數據位部分的接收且奇偶校驗使能位ParityEn=‘1’時,則轉入該狀態。根據已接收的數據和選擇的校驗模式,UART接收模塊將檢查校驗結果,設置相關寄存器。
5)Stop_1bit狀態
在該狀態下,檢查RXD信號是否為高電平,否則設置錯誤寄存器,以表示發生了幀錯誤。
6)Stop_2bit狀態
只有選擇了2位停止位時,才會進入此狀態。該狀態下,需要更新各狀態寄存器。持續1個波特的時間后,轉換到Idle狀態待命,等待捕捉新的1幀數據的起始位。
接收模塊的行為仿真時序圖如圖5 所示。仍將UART設置為偶校驗、8位數據位,1位停止位。圖中rxclk為接收采樣時鐘信號,該時鐘同步于每1幀數據的起始位。rxclkd8為rxclk延遲了半個周期的信號,以便在RXD引腳每1位的中間位置采樣到穩定的電平。RxIn(RXD)引腳的信號在rxclkd8上升沿被采樣。圖中RxIn串行輸入的數據為“00101101001”,與接收到的數據0x5A 一致,且沒有校驗錯誤,接收模塊各信號仿真正確無誤。

3.4 微處理器接口模塊
為方便外部處理器操作,UART模塊提供了專門的微處理器接口信號,包括CS、WR、CLK、ADDR 和DATA。CS為UART模塊的片選信號,所有操作只有在CS為低電平才能有效,否則被忽略。WR為讀寫控制信號,當WR為高電平時,從UART內部寄存器讀取數據,否則寫數據到其寄存器。WR同時還控制雙向接口DATA 的方向。當WR為高時,DATA 被設置為輸出,UART內部數據被輸出到DATA 接口;而WR為低時,DATA 被設置為輸入,外部處理器可把數據輸出到DATA接口。ADDR為地址線,用來尋址UART內部寄存器。CLK為讀寫時鐘信號,所有的讀寫的操作均是在CLK的上升沿完成,該模塊的仿真波形如圖6所示。

4 驗證測試
在Xilinx公司的FPGA XC3S500E上綜合、實現后,所設計的Uart通信接口模塊實際只耗用了128個寄存器和134個4輸入查找表,占其可用資源比例均不到1%。將程序下載到芯片中經實際運行,數據收發正確無誤,實際運行結果如圖7所示。

為進一步測試串口模塊長期運行的穩定性與可靠性,進行了如下實驗:使用串口調試軟件,定時將測試數據發送給UART,再用單片機通過UART的微處理器接口讀收到的數據,然后再寫回UART的發送緩沖器,如此可自動完成所設計UART模塊收發功能的測試。測試結果如表1所示。可以看出,無論波特率低至9 600bps還是高達115 200bps,經大量數據收發測試,均無出現發送、接收錯誤,也未出現幀錯誤以及奇偶校驗錯誤,表明所設計的串口通信模塊長時間運行時穩定可靠。

5 結 論
本文基于FPGA 設計和實現了通信參數可在線配置的異步串行通信接口模塊,將程序下載到芯片實際運行,結果表明該接口模塊設計正確,運行穩定可靠,為FPGA 與其他設備的通信提供了一種可靠途徑,具有較強的實用價值。同時本設計可作為FPGA 開發多串口設備的1個基本模塊,通過復制基本模塊,可在1片FPGA 芯片上擴展出多個串口,而數量僅與FPGA 可用資源有關,滿足多串口場合的需要,開發出基于FPGA 的多串口設備,替代采用專用串口芯片的傳統設計方案,降低多串口系統的復雜度,提高可靠性。
電子發燒友App



























評論