吳志勇,郭元興,劉雨沁
(中國電子科技集團公司第三十研究所,四川 成都 610041)
UART(Universal Asynchronous Receiver Transmitter,通用異步收發(fā)器)是一種廣泛使用的低速串行接口,遵循的協議是RS-232C標準。該標準規(guī)定的典型數據傳輸速率為300 b/s﹑1 200 b/s﹑2 400 b/s﹑9 600 b/s﹑38 400 b/s﹑115 200 b/s等。盡管市場上有專用的UART接口芯片和IP核,但部分接口芯片和IP核僅能支持幾種固定的傳輸速率,無法覆蓋RS-232C標準規(guī)定的所有傳輸速率。同時,隨著外接設備的日益豐富,部分設備可能具有非標準速率的UART接口,而專用的UART接口芯片及IP核無法與這些設備通信。因此,設計一種波特率連續(xù)可調的UART接口具有較高的實用價值。
UART的具體幀格式如圖1所示。每幀數據由起始位﹑數據位﹑校驗位和停止位四部分組成。其中,起始位為低電平,持續(xù)一個比特時間,數據位長度可為5 bit﹑6 bit﹑7 bit﹑8bit;校驗位的模式有無校驗﹑奇校驗和偶校驗;停止位為高電平,持續(xù)時間可為1 bit或2 bit。當沒有數據發(fā)送時,發(fā)送和接收引腳都保持高電平[1]。

圖1 UART幀格式
發(fā)送端有數據發(fā)送時,先發(fā)送一個比特的起始位,以表示通信的開始,然后發(fā)送有效數據。有效數據的低位在前,高位在后,之后再傳送校驗位,最后發(fā)送停止位。
接收端處于監(jiān)聽狀態(tài),當監(jiān)聽到低電平的起始位后,就按照約定的波特率接收數據。
FPGA具有設計靈活﹑可自行定制各種電路的特點,其內部豐富的邏輯資源可讓設計者充分發(fā)揮設計理念,并在設計過程中可使用VHDL語言靈活修改[2]。本設計采用Verilog HDL語言,并在Xilinx的XC6SLX150T-3FGG676I FPGA上進行驗證。本設計主要包含發(fā)送模塊﹑接收模塊和中斷模塊,系統(tǒng)框圖如圖2所示。

圖2 系統(tǒng)示例
部分UART接口的實現方式是由給定波特率來計算工作時鐘頻率[3-5],利用時鐘頻率的改變來實現波特率的切換。這種方式僅能實現有限種波特率的切換,無法實現波特率的連續(xù)可調。本設計在固定工作時鐘頻率下,由用戶以參數的形式改變比特持續(xù)時間來實現波特率的連續(xù)可調。
比特持續(xù)時間是指在指定波特率下,傳輸線上單個比特持續(xù)的時鐘周期數。根據波特率的定義:每秒傳輸字符的個數,即可計算比特持續(xù)時間N。假設UART接口的工作時鐘頻率為F,指定波特率為B,則可計算出比特持續(xù)時間:通過改變比特持續(xù)時間來調節(jié)波特率具有以下優(yōu)點:

(1)FPGA的工作時鐘頻率單一,時序收斂性更好;
(2)UART接口的工作時鐘頻率F越高,數據傳輸速率的精度就越高;
(3)在UART工作頻率保持不變的條件下,通過改變參數N的值就能得到連續(xù)可調的波特率;
(4)接收模塊在接收每個比特時可以計數當前接收到的0和1的個數,并進行大數判決,以過濾接收線上的毛刺,提高UART接口的抗干擾能力。
發(fā)送模塊主要包含TX FIFO和發(fā)送單元。TX FIFO采用Xilinx的IP Core Generator生成,用戶將待發(fā)送的數據寫入TX FIFO。發(fā)送單元采用有限狀態(tài)機來設計,其狀態(tài)轉換如圖3所示。
當檢測到TX FIFO非空時,發(fā)送模塊從IDLE狀態(tài)進入transmit狀態(tài),并讀取TX FIFO中的待發(fā)送數據,在transmit狀態(tài)發(fā)送一個比特數據。當處于transmit狀態(tài)時,計數器count計數當前比特的持續(xù)時鐘周期數。當count的值大于等于比特持續(xù)時間N時,表示當前比特發(fā)送完畢,進而判斷當前數據幀是否發(fā)送完畢。如未發(fā)送完畢,則進入shift狀態(tài),將待發(fā)送數據移位,進行下一個比特發(fā)送,直到當前數據幀的停止位發(fā)送完畢,回到IDLE狀態(tài)。
接收模塊主要由RX FIFO和接收單元組成。RX FIFO用于存放接收到的串口數據,采用Xilinx的IP Core Generator生成。接收單元采用有限狀態(tài)機來設計,其狀態(tài)轉換如圖4所示。
接收單元處于監(jiān)聽狀態(tài),當檢測到接收線上的下降沿后,由IDLE狀態(tài)進入start狀態(tài)。在start狀態(tài)中,計數器count計數時鐘周期數,并統(tǒng)計信號線上0和1的個數。當時鐘周期數大于等于比特持續(xù)時間N時,表示當前比特接收完畢,進而通過大數判決確定接收到的比特值是否為數據幀的起始位。如果是,則進入receive狀態(tài),以接收數據幀的剩余比特值;如果不是,則表示接收單元監(jiān)聽到的下降沿是由干擾信號引起的,將重新回到IDLE狀態(tài)監(jiān)聽。
在receive狀態(tài)接收一個比特數據,在接收每個比特值時都統(tǒng)計0和1的個數,并進行大數判決,以提高抗干擾能力。每接收完一個比特值就轉移到shift狀態(tài),對接收到的比特值進行移位,并判斷當前數據幀是否接收完畢。如接收完畢,則回到IDLE狀態(tài);否則,重新進入receive狀態(tài)繼續(xù)接收。

圖4 接收模塊狀態(tài)轉換
為了避免CPU以查詢方式讀取RX FIFO﹑減小CPU的消耗,同時為了減少中斷次數﹑提高CPU的中斷效率,本設計向用戶開放了中斷間隔參數C。中斷間隔C表示從接收完畢當前字符開始到下一個字符起始位到來之間的最小時間間隔。中斷模塊的流程圖如圖5所示。

圖5 中斷模塊流程
假設當前字符接收完畢為t1時刻,下一個字符的起始位到來為t2時刻,計數器在t1時刻開始計數。如果t2-t1≥C,則中斷模塊給出中斷信號,否則清零計數器。CPU接收到UART接口的中斷信號后,便可連續(xù)讀取RX FIFO中的數據,直到將RX FIFO讀空。
本文在Xilinx的XC6SLX150T-3FGG676I FPGA上進行驗證,將UART接口的數據幀格式設置為8 bit數據位﹑無校驗位﹑1 bit停止位,波特率為38 400 Baud,利用FPGA的時鐘管理單元產生200 MHz時鐘提供給UART接口工作。根據式(1)可計算得到比特持續(xù)時間N的值為5 208,即數據幀中的每個比特將持續(xù)5 208個時鐘周期。設置中斷間隔C的值為68 000,即從當前字符幀接收完畢開始,如果在68 000個時鐘周期內仍無新的字符幀到來,則UART接口給出中斷信號。采用將PC機的串口與FPGA的UART接口對接的方式來驗證。
往TX FIFO寫入指定數據0xAA,利用示波器抓取發(fā)送管腳上的時序,得到如圖6所示的波形。

圖6 發(fā)送波形
可以看出,發(fā)出數據的波特率為38 400 Baud,數據值為0010101011,即發(fā)送線上的數據為0xAA,與寫入TX FIFO中的數據相符。
利用PC機上的串口工具發(fā)送數據0xAA給FPGA,同時在FPGA中利用ChipScope抓取寫入RX FIFO中的數據,得到如圖7所示的波形圖。

圖7 接收波形
從圖7可以看出,寫入RX FIFO中的數據為0xAA,即FPGA的UART接口接收到的數據與PC機發(fā)送的數據相同。
利用示波器同時抓取FPGA的接收和中斷管腳的信號,得到如圖8所示的波形圖。

圖8 中斷信號波形
從圖8可以測量出,中斷信號在接收完畢當前字符幀的340 μs后即68 000個時鐘后給出,與設定的參數值相符。
本文設計了一種波特率連續(xù)可調的UART接口,特點如下:
(1)固定UART接口的工作頻率,通過改變字符幀的比特持續(xù)時間實現波特率的改變,并將比特持續(xù)時間作為接口參數開放給用戶,設計的UART接口具有連續(xù)可調的波特率,既能產生RS-232C標準中指定的波特率,又能與具有非標準速率的UART接口通信;
(2)通過高頻計數每個比特持續(xù)期間0和1的個數,采用大數判決的方式確定當前比特值,能夠有效過濾信號線上的毛刺,提高UART接口的抗干擾能力;
(3)將中斷間隔參數開放給用戶,使用戶得以自行設定UART接口中斷CPU的頻率,降低CPU的中斷響應次數,提高了CPU的運行效率。
此外,該模塊可移植到多個FPGA平臺上,具有良好的推廣應用價值。
[1] 趙延,葛利嘉,雙濤.基于FPGA的UART設計實現及其驗證方法[J].現代電子技術,2008,280(17):162-164.
ZHAO Yan,GE Li-jia,SHUANG Tao.Design and Realization of UART and Its Verification Based on FPGA[J].Modern Electronics Technique,2008,280(17):162-164.
[2] 郭曉明,張德.基于FPGA的UART設計與實現[J].電聲技術,2010,34(06):31-37.
GUO Xiao-ming,ZHANG De.UART Design and Realization Based on FPGA[J].Audio Engineering,2010,34(06):31-37.
[3] 牛濤,吳斌,焦風川等.基于FPGA的UART電路的設計[J].電子測量技術,2006,29(03):73-75.
NIU Tao,WU Bin,JIAO Feng-chuan,et al.Design of a Kind of UART Circuit based on FPGA[J].Electronic Measurement Technology,2006,29(03):73-75.
[4] 何慧珠,秦麗,張會新.基于FPGA的UART IP核設計與實現[J].微計算機信息,2008,24(01-02):223-224.
HE Hu-zhu,QIN Li,ZHANG Hui-xin.Design of a UART IP Core Based on FPGA[J].Microcomputer Information,2008,24(01-02):223-224.
[5] 蔣艷紅.基于FPGA的UART設計與應用[J].計算機工程,2008,34(21):225-229.
JIANG Yan-hong.Design and Application of UART Based on FPGA[J].Computer Engineering,2008,34(21):225-229.