摘 要:在基于FPGA芯片的工程實踐中,經(jīng)常需要FPGA與上位機或其他處理器進行通信,為此設計了用于短距離通信的UART接口模塊。該模塊的程序采用VHDL語言編寫,模塊的核心發(fā)送和接收子模塊均采用有限狀態(tài)機設計,詳述了各子模塊的設計思路和方法,給出了它們的仿真時序圖。綜合實現(xiàn)后,將程序下載到FPGA芯片中,運行正確無誤。又經(jīng)長時間發(fā)送和接收測試,運行穩(wěn)定可靠。相對參數(shù)固定的設計,該UART的波特率、數(shù)據(jù)位寬、停止位寬、校驗位使能及校驗模式選擇均可以在線設置,為FPGA與其他設備的通信提供了一種可靠途徑,具備較強的實用價值。
0 引 言
通用異步收發(fā)器(universal asynchronous?。颍澹悖澹椋觯澹颍簦颍幔睿螅恚椋簦簦澹?,UART)盡管自20世紀70年代就已出現(xiàn),但因其簡單可靠,目前仍是一種使用廣泛的串行通信接口。各種微處理器,不論是單片機,還是DSP、ARM,UART都是基本外圍模塊。許多場合如系統(tǒng)監(jiān)控、數(shù)據(jù)采集都要用到串口通信[1-3],甚至要用多個串口,如開發(fā)串口服務器[4-6]。此時通常采用專用芯片,如16C554、VK3224等擴展串口。專用芯片使用簡單,然而缺乏靈活性,同時專用芯片集成的串口數(shù)量也有限,有時需使用多個芯片才能滿足要求[5],增加了系統(tǒng)的復雜度,降低了可靠性。
FPGA(field?。穑颍铮纾颍幔恚恚幔猓欤濉。纾幔簦濉。幔颍颍幔┳鳛橐环N可編程芯片,其資源豐富、工作效率高,常用于高速數(shù)據(jù)采集、算法的高速并行執(zhí)行[7-8]。用戶可通過硬件描述語言或電路原理圖,設計出個性化的高性能電路模塊,具有設計靈活,升級方便的優(yōu)點。
在基于FPGA的工程實踐中,常需要其與串口設備通信,但在Xilinx現(xiàn)有的開發(fā)環(huán)境ISE中沒有相關的IP核。目前也有使用FPGA設計UART的例子[9-13]后,但有的參數(shù)固定,缺乏通用性。本文設計和實現(xiàn)了參數(shù)可在線配置的UART接口模塊,為FPGA與其他設備通信提供了一種可靠途徑。
1 UART串行通信簡介
標準的RS232接口常采用DB-9連接器,其有2根數(shù)據(jù)線,6根控制線,1根信號地線。本文設計的UART符合RS232串行通信標準,但在實際中,RS232標準中諸多控制信號使用較少,故文中的UART只使用其中的3根信號線,即TXD、RXD和信號地,這也是很多微處理器UART模塊所采用的信號線。
UART屬于異步通信接口,通信雙方需約定好波特率。國際上規(guī)定了一系列標準的波特率,如9?。叮埃埃猓?、19?。玻埃埃猓?、115?。玻埃埃猓蟮?。UART每一數(shù)據(jù)幀,依次由起始位(1位)、數(shù)據(jù)位(5~8位),奇偶校驗位(可選的1位)以及停止位(1~2位)組成。其中數(shù)據(jù)位部分是從最低位先開始傳送的;奇偶校驗位是對1幀數(shù)據(jù)中的數(shù)據(jù)部分和校驗位計算,使‘1’的個數(shù)滿足奇數(shù)個或偶數(shù)個。當UART空閑時,收發(fā)引腳RXD與TXD均是高電平。一旦需要發(fā)送數(shù)據(jù),則首先向TXD引腳輸出低電平作為起始位,表示1幀數(shù)據(jù)的開始。而在接收數(shù)據(jù)時,檢測到起始位將啟動一次數(shù)據(jù)接收流程。
2 系統(tǒng)設計
本文設計的UART通信接口主要由波特率產(chǎn)生模塊、發(fā)送模塊、接收模塊以及微處理器接口模塊組成。各模塊使用VHDL語言來表述,模塊之間的信號連接是通過頂層文件中的元件例化語句實現(xiàn)。
整個設計的結構框圖如圖1所示。設計和實現(xiàn)的UART通信模塊主要功能如下:
1)實現(xiàn)了串行數(shù)據(jù)的發(fā)送和接收。
2)停止位可設置(1位或2位)。
3)可設置是否啟用奇偶校驗功能,以及校驗模式設置即選擇奇校驗還是偶校驗。
4)波特率可配置。標準的波特率系列中從9 600~115?。玻埃埃猓缶稍O置,同時還支持自定義的波特率。
5)設計了微處理器接口,通過接口可訪問UART內(nèi)部寄存器,配置UART參數(shù),讀寫收發(fā)數(shù)據(jù)。
該UART 通信接口包含2 個數(shù)據(jù)緩沖寄存器(TxHolder和RxHolder)、3 個控制寄存器(UartCon、UartBaud及UartIntEn)、3 個狀態(tài)寄存器(UartState、UartError、UartIntPend)??紤]到需要在線更新UART參數(shù),設計UartCon與UartBaud為雙緩沖寄存器。第一級緩沖用于存儲外部處理器寫入的配置數(shù)據(jù),第二級緩沖即用于設置UART內(nèi)核。當UART內(nèi)核空閑時,才將第二級緩沖內(nèi)容更新為第一級緩沖內(nèi)容,防止破壞收發(fā)中的數(shù)據(jù)。
3?。眨粒遥愿髂K的設計
下面詳細介紹UART各模塊的設計思路和方法,同時給出了主要模塊的行為仿真時序圖。
3.1 波特率發(fā)生模塊
波特率發(fā)生模塊的作用是產(chǎn)生UART工作所需的時鐘信號,其頻率定為實際波特率的16倍。波特率發(fā)生模塊本質(zhì)是1個可預置初值的計數(shù)器,每當計數(shù)達到預置值時輸出高電平,其余值輸出低電平。
3.2 發(fā)送模塊
發(fā)送模塊按照用戶設置,將TxHolder中的并行數(shù)據(jù)串行發(fā)送出去,其核心為1個有限狀態(tài)機,其狀態(tài)轉換如圖2所示。
1)Idle狀態(tài)
當系統(tǒng)上電復位之后,發(fā)送狀態(tài)機即進入此狀態(tài)。若不向發(fā)送緩沖器寫入數(shù)據(jù),那么TxDataValid為低電平,表示發(fā)送緩沖器空,狀態(tài)機始終在此狀態(tài)循環(huán)等待,TXD引腳輸出高電平。
2)Start狀態(tài)
一旦向發(fā)送緩沖器TxHolder 中寫入數(shù)據(jù),TxDataValid即變?yōu)楦唠娖?。狀態(tài)機由Idle狀態(tài)切換到Start狀態(tài),TXD輸出低電平,輸出起始位。
3)Shift狀態(tài)
1位波特時間過后,狀態(tài)機無條件的轉換到Shift狀態(tài),即使能發(fā)送移位寄存器,開始將并行數(shù)據(jù)逐位右移,實現(xiàn)并串轉換并輸出到TXD。當輸出的數(shù)據(jù)個數(shù)達到Databit設定的數(shù)據(jù)位寬時,便轉換到Parity或者Stop_1bt狀態(tài),否則仍轉換到該狀態(tài)。
4)Parity狀態(tài)
若數(shù)據(jù)位部分發(fā)送完畢,且奇偶校驗使能位ParityEn=‘1’時,則轉換到該狀態(tài)。該狀態(tài)下,根據(jù)已發(fā)送的數(shù)據(jù)和選擇的校驗模式,發(fā)送校驗位。
5)Stop_1bit狀態(tài)
無論停止位為1位還是2位,都先轉換到Stop_1bit狀態(tài),先輸出1位停止位。由該狀態(tài)轉換下一狀態(tài)時,次態(tài)會有多種情況。若設置了stopbit為‘1’即選擇2位停止位時,次態(tài)為stop_2bit;若stopbit為‘0’且發(fā)送緩沖器為空時,次態(tài)即轉換到idle狀態(tài),否則轉換到start狀態(tài)開始新一輪的數(shù)據(jù)發(fā)送。
6)Stop_2bit狀態(tài)
若選擇2位停止位時,才會進入此狀態(tài)。持續(xù)1個波特時間后,根據(jù)TxDataValid狀態(tài),進入Idle狀態(tài)待命,或進入Start狀態(tài)開始新1輪的數(shù)據(jù)發(fā)送。
發(fā)送模塊的行為仿真時序圖如圖3所示。其UART參數(shù)設置為偶校驗、8位數(shù)據(jù)位和1位停止位。txclk為發(fā)送采樣時鐘信號,在該信號的上升沿,發(fā)送狀態(tài)機狀態(tài)翻轉,同時數(shù)據(jù)被送到TxOut(TXD)引腳。圖中TxOut輸出的數(shù)據(jù)為“00100110011”,去掉起始位、校驗位和停止位后即為待發(fā)送的數(shù)據(jù)0x32。由仿真所得發(fā)送模塊的時序圖可知,該模塊各信號仿真結果正確無誤。
3.3 接收模塊
接收模塊主要功能是將RXD引腳接收到的串行數(shù)據(jù)按照配置的通信參數(shù),提取出數(shù)據(jù)部分,存入接受緩沖器,并設置相關狀態(tài)寄存器。其核心是1個接收狀態(tài)機,狀態(tài)轉換如圖4所示。
1)Idle狀態(tài)
復位之后,接收狀態(tài)機便進入此狀態(tài)等待。一旦檢測到RXD為低電平,即一幀數(shù)據(jù)的起始位,狀態(tài)機立即轉換到Start狀態(tài),否則開始數(shù)據(jù)接收標志StartBitFlag為‘0’,狀態(tài)機始終停留在該狀態(tài)。正確捕獲到1幀數(shù)據(jù)的起始位非常重要,它起到同步接收采樣時鐘的作用,是正確接收1幀數(shù)據(jù)的關鍵。
2)Start狀態(tài)
一旦捕獲到起始位,便立即轉入該狀態(tài),啟動一幀數(shù)據(jù)的接收流程。
3)Shift狀態(tài)
起始位之后,狀態(tài)機無條件的轉換到Shift狀態(tài),即開始接收數(shù)據(jù)部分。接收到的每1位數(shù)據(jù)將逐位左移,實現(xiàn)串并轉換。當接收到的數(shù)據(jù)個數(shù)達到Databit設定的數(shù)據(jù)位寬時,即轉換到Parity或者Stop_1bt狀態(tài)。
4)Parity狀態(tài)
當完成數(shù)據(jù)位部分的接收且奇偶校驗使能位ParityEn=‘1’時,則轉入該狀態(tài)。根據(jù)已接收的數(shù)據(jù)和選擇的校驗模式,UART接收模塊將檢查校驗結果,設置相關寄存器。
5)Stop_1bit狀態(tài)
在該狀態(tài)下,檢查RXD信號是否為高電平,否則設置錯誤寄存器,以表示發(fā)生了幀錯誤。
6)Stop_2bit狀態(tài)
只有選擇了2位停止位時,才會進入此狀態(tài)。該狀態(tài)下,需要更新各狀態(tài)寄存器。持續(xù)1個波特的時間后,轉換到Idle狀態(tài)待命,等待捕捉新的1幀數(shù)據(jù)的起始位。
接收模塊的行為仿真時序圖如圖5 所示。仍將UART設置為偶校驗、8位數(shù)據(jù)位,1位停止位。圖中rxclk為接收采樣時鐘信號,該時鐘同步于每1幀數(shù)據(jù)的起始位。rxclkd8為rxclk延遲了半個周期的信號,以便在RXD引腳每1位的中間位置采樣到穩(wěn)定的電平。RxIn(RXD)引腳的信號在rxclkd8上升沿被采樣。圖中RxIn串行輸入的數(shù)據(jù)為“00101101001”,與接收到的數(shù)據(jù)0x5A 一致,且沒有校驗錯誤,接收模塊各信號仿真正確無誤。
3.4 微處理器接口模塊
為方便外部處理器操作,UART模塊提供了專門的微處理器接口信號,包括CS、WR、CLK、ADDR 和DATA。CS為UART模塊的片選信號,所有操作只有在CS為低電平才能有效,否則被忽略。WR為讀寫控制信號,當WR為高電平時,從UART內(nèi)部寄存器讀取數(shù)據(jù),否則寫數(shù)據(jù)到其寄存器。WR同時還控制雙向接口DATA 的方向。當WR為高時,DATA 被設置為輸出,UART內(nèi)部數(shù)據(jù)被輸出到DATA 接口;而WR為低時,DATA 被設置為輸入,外部處理器可把數(shù)據(jù)輸出到DATA接口。ADDR為地址線,用來尋址UART內(nèi)部寄存器。CLK為讀寫時鐘信號,所有的讀寫的操作均是在CLK的上升沿完成,該模塊的仿真波形如圖6所示。
4 驗證測試
在Xilinx公司的FPGA XC3S500E上綜合、實現(xiàn)后,所設計的Uart通信接口模塊實際只耗用了128個寄存器和134個4輸入查找表,占其可用資源比例均不到1%。將程序下載到芯片中經(jīng)實際運行,數(shù)據(jù)收發(fā)正確無誤,實際運行結果如圖7所示。
為進一步測試串口模塊長期運行的穩(wěn)定性與可靠性,進行了如下實驗:使用串口調(diào)試軟件,定時將測試數(shù)據(jù)發(fā)送給UART,再用單片機通過UART的微處理器接口讀收到的數(shù)據(jù),然后再寫回UART的發(fā)送緩沖器,如此可自動完成所設計UART模塊收發(fā)功能的測試。測試結果如表1所示。可以看出,無論波特率低至9 600bps還是高達115?。玻埃埃猓穑螅?jīng)大量數(shù)據(jù)收發(fā)測試,均無出現(xiàn)發(fā)送、接收錯誤,也未出現(xiàn)幀錯誤以及奇偶校驗錯誤,表明所設計的串口通信模塊長時間運行時穩(wěn)定可靠。
5 結 論
本文基于FPGA 設計和實現(xiàn)了通信參數(shù)可在線配置的異步串行通信接口模塊,將程序下載到芯片實際運行,結果表明該接口模塊設計正確,運行穩(wěn)定可靠,為FPGA 與其他設備的通信提供了一種可靠途徑,具有較強的實用價值。同時本設計可作為FPGA 開發(fā)多串口設備的1個基本模塊,通過復制基本模塊,可在1片FPGA 芯片上擴展出多個串口,而數(shù)量僅與FPGA 可用資源有關,滿足多串口場合的需要,開發(fā)出基于FPGA 的多串口設備,替代采用專用串口芯片的傳統(tǒng)設計方案,降低多串口系統(tǒng)的復雜度,提高可靠性。
評論