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