楊 洋,和 蕾,王 旭,錢祥利,陳 飛,李 靜
(山東管理學院智能工程學院,山東濟南 250357)
通用異步收發傳輸(Universal Asynchronous Rece iver/Transmitter,UART)遵循串行通信協議標準[1],以其通信線路簡單、信息傳輸穩定等特點,被廣泛應用于各種微處理器與嵌入式系統,并作為標準外設之一。
UART 采用異步全雙工通信模式,由于沒有專用時鐘信息線,因此數據發送方與接收方必須采用相同的傳輸速率,稱之為波特率,常用波特率有4 800 bps、9600 bps、19200bps、38 400bps、43000 bps、56 000 bps、57 600 bps、115 200 bps 等。UART 數據傳輸鏈路以數據幀為基本單元,如圖1 所示,一幀數據包括起始位、數據位、校驗位與停止位,其中數據位長度為5~8 bit,校驗模式可選奇校驗或偶校驗,并可以選擇是否采用校驗位,停止位長度可選1 bit、1.5 bit、2 bit,采用何種數據格式將視當前UART 鏈路傳輸要求而定。

圖1 UART串行異步通信數據格式
UART 通信鏈路的建立要求發送設備與接收設備具有一致的波特率與數據格式,否則會導致通信失敗。為了使接收設備能夠適應來自各種不同波特率發送設備的通信鏈路,而無需事先建立波特率,很多MCU 或嵌入式處理器在硬件或軟件層面集成了自動波特率檢測功能[2-4],能夠自動檢測到主設備的波特率并進行配置,達到自適應的目的。但是傳統的方法僅局限于波特率的自適應檢測,尚不能對數據格式進行自動配置,當串行通信鏈路數據格式變更時,就無法自動建立通信鏈路。為了改變現有技術存在的弊端,使UART 串行通信自適應的方法擁有更強的實用性,文中提出了串行通信參數自適應的概念,介紹了一種可靠的實現串行通信波特率、數據格式自動配置的方法,并基于Xilinx Artix-7 FPGA實現了UART 接口的模塊化設計與仿真驗證。
UART 串行通信參數自動配置在數據鏈路層進行,新的傳輸鏈路發起或者改變當前波特率、數據格式時,將進行通信參數的自適應配置。通信參數自適應采用特征值匹配的方法,包括參數配置字的發送、接收以及參數自適應與配置。如圖2 所示,配置字的固定長度為10 位,從功能上劃分為字頭波特率同步碼與數據格式配置碼。從機首先接收并檢測波特率同步碼,得到串行通信波特率,并以此波特率接收配置字節的數據格式配置碼,并將其寫入參數配置寄存器(SERIAL_CONFIG),完成通信參數的自動配置,建立串行通信的連接。

圖2 串行通信配置字節格式以及接收模式
傳統的自動波特率檢測方法主要有兩種:最小數法與固定數據傳輸法[5-6],最小數法是通過不斷檢測最小的脈沖寬度并與數據位脈寬比較,得到串行通信波特率值;固定數據傳輸法是通過發送特定配置數據來實現波特率信息的傳輸。第一種方法的缺點是波特率的識別與判定非常依賴于發送數據的內容,需要不斷重復檢測,檢測效率低、握手時間慢??紤]到該設計不僅要完成波特率自適應檢測,還需要進行數據格式的自動配置,所以將波特率與數據格式捆綁為參數特征值,采用固定參數數據傳輸的方法。
為高效、快速地實現波特率檢測,對傳統的固定數據傳輸法進行改進,采用特征值匹配法[7]與查表法[8]相結合的方式。如圖2 所示,配置字節中前3 位設定為波特率同步碼,將其作為波特率檢測的特征值,接收機利用邊沿檢測電路捕獲特征值,并通過時鐘計數器測量邊沿時間,完成對波特率同步碼的時間測量[9]。為消除邊沿檢測有可能引發的亞穩態,采用兩級D 觸發器進行邊沿檢測[10]。時鐘計數區間包含2 bit 脈沖寬度,采用100 MHz 的系統時鐘作為時鐘激勵,其頻率遠大于波特率。通過計算可得,通信采用115 200 bps 的波特率時,時鐘計數的時間測量誤差比小于0.12%,因此,能夠保證很高的時間測量精度。波特率的理論計算公式為:

由于標準波特率在有限的幾個固定數值之間變化,同時為了減小FPGA 運算資源的開銷,可采用查表法得到鏈路波特率。時鐘計數范圍與對應波特率的對照表如表1 所示,由此得到串行通信的波特率。然后將對應的波特率配置碼暫存到通信參數配置寄存器SERIAL_CONFIG 的低4 位,供串行通信接收、發送模塊讀取調用。

表1 波特率、時鐘計數范圍與參數配置寄存器SERIAL_CONFIG低4位配置碼對照表
圖3 為邊沿檢測、時鐘計數與數據格式配置碼接收采樣信號的時序關系,在得到當前通信鏈路的波特率后,通過波特率發生器模塊(Baud Rate Generator)生成波特率采樣時鐘信號[11],完成配置字節中數據格式配置碼(2~7 bit)的接收,此時配置字節的1 bit 起到“偽起始位”的作用,為配置碼接收提供一個波特率位的時間緩沖。波特率發生器是通過對系統時鐘(100 MHz)分頻得到波特率采樣時鐘信號,分頻因子[12]作為時鐘計數寄存器的向上溢出值,其計算方法如下:

圖3 串行通信配置字節接收過程時序關系

數據接收采樣設定在1/2 的分頻因子位置,即在波特率信號周期的中間位置,這樣能夠提高串行通信對波特率誤差的容忍范圍[13-14]。
如表2 所示,數據格式配置碼接收完畢后暫存到SERIAL_CONFIG 的4~9 位。該寄存器能夠被參數接收模塊、數據收發模塊訪問,參數接收模塊對其具有寫入權限,數據收發模塊對其具有讀取權限。

表2 串行通信數據格式對在參數配置寄存器中的配置碼
為實現通信參數自適應的UART 通信方案,基于Xilinx Artix-7 系列FPGA 與Vivado 開發平臺[15],利用Verilog HDL 硬件描述語言,從邏輯電路層面實現了設計。整體設計從功能可劃分為4 個模塊單元:TX module(發送模塊)、Baud Rate Generator(波特率產生器)、Parameters RX(參數接收模塊)與Data RX(數據接收模塊)。基于FPGA 的串行通信功能模塊結構如圖4 所示。

圖4 基于FPGA的串行通信功能模塊結構
在串行通信參數配置完畢后,發送模塊便可對通信參數寄存器進行讀取。如圖4 所示,發送控制器是發送模塊的控制核心,在數據發送鏈路建立之初,讀取寄存器中波特率信息、數據格式信息。發送控制器的主要作用還包括:
1)將波特率時鐘轉化為發送狀態時序。在該時序的控制下,數據字節的各位將按照波特率時鐘頻率發送至TX 總線,無數據傳輸時保持高電平。
2)根據數據格式控制發送內容,包括數據位長、停止位長、有無校驗位,如果存在校驗位,將根據校驗模式添加奇或偶校驗位。通過控制移位寄存器,實現發送數據的并串轉換。
接收模塊在波特率采樣時鐘激勵下進行配置參數與數據的接收,可進一步分為參數接收模塊與數據接收模塊。配置參數的接收優先于數據接收。接收控制器作為接收模塊的控制核心,其主要作用有3個方面:
1)控制波特率檢測、配置參數接收和數據接收(或發送)的優先級劃分,其中波特率檢測具有最高的優先級,數據收發具有最低的優先級。
2)對RX 進行持續邊沿檢測,確定發送起始位的到來,并將波特率時鐘轉化為接收狀態轉化時序。
3)控制接收移位寄存器,對接收數據進行采樣,實現接收數據的串并轉化。按照數據格式,控制接收的數據及數據長度和校驗。
接收控制器對接收優先級的控制是通過有限狀態機[16]來實現的,配置參數寄存器的高2 位用于標識串行通信參數的接收情況(波特率、數據格式)。如圖5 所示,當檢測到信號下降沿,如果通信參數配置完畢,接收狀態機進入左側的配置參數接收狀態支路,否則進入配置參數接收支路。

圖5 配置參數與數據接收的有限狀態機
配置參數接收狀態包括空閑狀態、時鐘計數狀態、配置碼接收狀態、停止位;數據接收狀態機與配置參數接收狀態機共用空閑與停止位接收狀態,其還包括數據位接收、奇偶校驗。在接收數據位時,在接收控制器的作用下,根據數據位長度及已經接收到的數據位,選擇是否跳轉到下一個狀態,并根據SERIAL_CONFIG 的第6 位確定下一個狀態為校驗狀態還是停止狀態。如果為校驗狀態,則根據SERIAL_CONFIG 的第7 位來確定校驗模式并進行奇(或偶)偶校驗。最后,完成數據的存儲,并且給出數據是否成功接收或者校驗錯誤標識碼。
基于Vivado 仿真平臺進行串行通信參數自適應的功能仿真,主要分兩個部分:串行通信參數的接收、數據的收發。
1)串行通信參數的接收
波特率檢測以及配置參數的接收仿真如圖6所示,仿真波特率為38 400 bps,通信數據格式為8 bit 數據位、奇校驗、1 bit 停止位,配置碼為8b0001_1101。

圖6 波特率檢測以及串行通信參數接收功能仿真
當接收模塊檢測到信號下降沿到來時,并且配置參數寄存器的高2 位為“00”,則進入配置碼接收狀態,在接收控制器的作用下,參數接收狀態機變量(rx_config_status)由“0”(空閑)變為“1”,進行時鐘計數,計數大小為5 208。通過查找表得到波特率為38 400 bps,將其存儲碼(“0111”)寫入配置參數寄存器(SERIAL_CONFIG)的低4 位。
為實現數據格式配置碼的接收,波特率產生器生成38 400 bps 的采樣時鐘baud_clk,接收狀態由“1”跳轉到“2”(接收配置碼),利用采樣時鐘對2~6 bit 進行中間采樣,接收配置碼為“111000”,將其存儲于配置參數寄存器中,同時將寄存器的最高位置1,標識串行通信參數接收完畢。
2)數據的收發
如圖7(a)所示,仿真模擬主機發送16 進制數據0x55,當信號下降沿到來時,接收模塊首先檢測SERIAL_CONFIG 的最高位,如果串行通信參數已經配置完畢,則進入數據接收狀態機。

圖7 串行通信數據收發功能仿真
接收狀態機寄存器變量rx_state 表示空閑狀態(0)、起始位(1)、數據位(2)、校驗位(3)、停止位(4)5 個接收狀態,并在接收控制器的作用下進行狀態的跳轉。波特率產生器生成38 400 bps 對應的采樣時鐘信號baud_clk,進行數據的中間采樣接收,最終完成數據0x55 的成功接收,并進行奇校驗,且校驗無誤。
圖7(b)為發送模塊功能仿真,當發送模塊接收到發送指令信號tx_data_tvalid,對寄存器變量數據tx_data進行并串轉換,輸送至uart_tx 信號線,并由發送控制器計算得到奇校驗碼,添加至數據位尾部一并發送。
為進一步驗證UART自適應串行參數配置接口的可靠性與穩定性,將Artix-7FPGA開發板與PC進行聯機測試。PC 作為主機,集成了參數自適應功能的FPGA 開發板作為從機,在PC端利用串口調試助手發送配置參數,建立串行通信鏈路,進行數據收發測試。
該測試采用中、低、高3 個波特率:9 600 bps、1 200 bps、115 200 bps,分別進行測試,每個波特率分別采用奇校驗、偶校驗、無校驗3 種校驗模式,數據位分別采用5~8 bit、停止位采用1~2 bit 長度,進行多組測試。測試結果表明FPGA 端的自適應串行參數接口能夠準確的獲取串行通信參數,并能夠建立穩定的通信鏈接。
文中基于FPGA實現通用異步串行通信的參數自動配置方法,利用特征值匹配與查表法相結合的方式,成功實現了波特率與數據格式的自適應檢測以及自動配置。基于Xilinx Artix-7 系列FPGA,利用Verilog 硬件描述語言實現了該方案的UART接口的硬件電路設計。仿真與測試表明,該方法能夠快速、穩定地建立串行通信鏈路。整體設計具有很高的完整性和穩定性。
這種方法突破了傳統的波特率自適應方法,不僅可以實現波特率的自適應,同時能夠實現串行通信參數中數據格式的自動配置,對通用串行通信的應用方法進行了補充與完善,具有很高的實用意義。