王志學
(廣東輕工職業技術學院,廣東 廣州 510000)
UART(Universal Asynchronous Receiver/Transmitter,通用異步收/發器),用于控制計算機與串行設備之間的數據通信,它提供了外設用到的RS-232C數據終端設備接口,使計算機可以和調制解調器或其它使用RS-232C接口的串行設備進行通信。常見的UART有8250、8251、NS16450、NS16550等,這些芯片做的比較復雜,功能齊全。但是由于結構和功能相對固定,因而不能根據我們的實際需要去裁剪和移植。當我們不需要用到完整的UART功能和一些輔助功能時,就可以將需要的UART功能集成到FPGA上,從而大大的減少了體積、簡化了電路,也提高了系統的可靠性、穩定性和靈活性。
UART是一種串行數據總線,用于異步通信,并且雙向通信,可實現全雙工傳輸和接收。基本的UART只需要兩條信號線(TXD、RXD)和一條地線就可以完成數據的相互通信,接收和發送互不干擾,這樣就大大節省了傳輸費用。由于UART是異步通信,所以需要對數據進行同步。基本的UART幀格式如圖1所示:

圖1 UART幀格式
從圖中可以看出,串行異步通信的幀格式包括四個部分:起始位、數據位、校驗位和停止位。起始位在一個字符中占一位,并且必須為0,表示字符的開始;起始位后面是數據位,一般為5至8位,由串行通信的初始化程序設定,數據的排列方式是低位在前,高位在后。數據位后面是校驗位,該位可根據實際需要可選可不選;一個字符的最后是停止位,該位必須存在,表示一個字符的結束。停止位可以是1位、1.5位或2位。異步通信的這種由起始位開始,停止位結束所構成的一串二進制數即為幀,從微觀來看,異步通信時一位一位的傳輸的,從宏觀來看,又是一幀一幀傳輸的。在一幀數據中的每一位之間的時間間隔是一樣的,但是幀與幀之間的時間間隔是隨機的。
本文采用模塊設計的方法,并且針對實際要求,將整個軟件劃分為波特率發生器模塊、接收啟動模塊、接收模塊和發送模塊四個部分。各模塊功能分析如下:
波特率發生器實際上就是一個簡單的分頻器,它的功能是產生和RS-232C通信所采用的波特率同步的時鐘,這樣才能按照RS-232C的時序要求進行數據的收發。而波特率發生器的系數在FPGA實現時一般是固定的,但對于不同的實現,這個系數需要更改(因為FPGA在設計時比較容易改動,而專用芯片不易改動,所以UART專用芯片一般通過添加一個接口以便在使用時改變波特率)。可以在VHDL語言中使用Generic語句,或在Verilog HDL語言中使用parameter語句使問題得到解決。因發送和接收時對時鐘的要求不同,給發送模塊和接收模塊提供的時鐘頻率也不相同。當發送數據時,只需要將數據按照一定的速率串行的輸出就可以了,所以,發送的時鐘和發送的波特率是一致的;但是,在接收數據時,在數據位的什么位置對數據信息進行判斷非常的重要,最理想的情況就是在串行數據每一位的中點對數據進行采樣,因為發送方和接收方的時鐘是不一致的,所以需要對每一位數據的時間進行分段,分段越多,采樣時就越接近中點,并且采樣時出現錯誤的概率也越低,但是,分段越多,采樣的時間也越多,系統的開銷越大,所以,實際設計時,波特率發生器產生的分頻時鐘,是波特率時鐘頻率的16倍。波特率發生器模塊如圖2所示。clk16x是波特率發生器得到的分頻時鐘;clk是時鐘輸入信號;rst是系統復位信號。

圖2 波特率發生器模塊示意圖
由于串行數據幀和接收時鐘是異步的,由高電平轉化為低電平可以視為一個數據幀的起始位。但是,在實際的電路中,會有多方面的原因干擾,為了避免毛刺影響,正確的判斷起始位的到來,采樣時在時鐘的上升沿(即由波特率發生器提供的16倍于波特率的時鐘)檢驗數據是否為低電平,如果接收到的是低電平,則開始計數,如果連續8個時鐘內都是低電平,則表示起始信號有效,即要求接收到的起始位在波特率時鐘采樣過程中有一半是屬于邏輯0才表示接收到的起始位有效。如果在采樣時,有一次檢驗到高電平,即邏輯1時,則認為起始信號無效,返回初始的狀態重新等待下一個起始位信號。當起始位的信號時有效時,每隔16個時鐘采樣一次,這樣就保證了每次采樣都是在數據位的中點。
接收模塊如圖3所示。clk16x是由波特率發生器產生的分頻時鐘;rst是系統復位信號;rxd是來自其他設備的串行數據;data_ready表示"數據已準備好",在rdn為1的情況下,并行數據轉換完畢就可以輸出,此時將data_ready置為0;在rdn不為1的情況下,串并轉換完成后將此data_ready置1以表示數據己經轉換完畢,可以輸出了,通知接收模塊每隔16個clk16x周期采樣一次,接收UART幀中剩余的數據位,否則,接收模塊不工作。dout<7:0>是接收模塊將接收到的串行數據轉換成的并行數據,送給發送模塊的輸入信號din<7:0>。

圖3 接收模塊示意圖
發送模塊相對于接收模塊要容易處理得多。只要每隔16個clk16x周期輸出1位即可,次序遵循1位起始位,8位數據位,1位停止位。發送模塊如圖4所示。din<7:0>是將要發送出去的并行數據;clk16x、rst信號同接收模塊;wrn是數據發送的啟動信號;txd是發送出去的串行數據信號。

圖4 發送模塊示意圖
用FPGA實現UART功能,減少了系統的面積,降低了系統的功耗,提高了系統的穩定性,同時,由于數據幀和波特率都比較容易改變,大大的提高了系統設計的靈活性和可移植性。
[1]史故臣,石旭剛,左緒勇.基于FPGA的UART設計與實現[J].中國新通信,2009.4:62-64
[2]聶濤,許世宏.基于 FPGA 的 UART 設計[J].現代電子技術,2006,29(2):127-129
[3]播松,黃繼業.EDA 技術與 VHDL[M]北京:清華大學出版社,2007
[4]楊宗國,李艷萍.基于FPGA的UART模塊的設計[J].現代電子技術,2009,2:19-22
[5]黃智偉,王彥.FPGA系統設計與實踐[M].北京:電子工業出版社,2005
[6]潘松,王國棟.VHDL使用教程.電子科技大學出版社.1999