楊 洋,和 蕾,王 旭,錢(qián)祥利,陳 飛,李 靜
(山東管理學(xué)院智能工程學(xué)院,山東濟(jì)南 250357)
通用異步收發(fā)傳輸(Universal Asynchronous Rece iver/Transmitter,UART)遵循串行通信協(xié)議標(biāo)準(zhǔn)[1],以其通信線路簡(jiǎn)單、信息傳輸穩(wěn)定等特點(diǎn),被廣泛應(yīng)用于各種微處理器與嵌入式系統(tǒng),并作為標(biāo)準(zhǔn)外設(shè)之一。
UART 采用異步全雙工通信模式,由于沒(méi)有專(zhuān)用時(shí)鐘信息線,因此數(shù)據(jù)發(fā)送方與接收方必須采用相同的傳輸速率,稱之為波特率,常用波特率有4 800 bps、9600 bps、19200bps、38 400bps、43000 bps、56 000 bps、57 600 bps、115 200 bps 等。UART 數(shù)據(jù)傳輸鏈路以數(shù)據(jù)幀為基本單元,如圖1 所示,一幀數(shù)據(jù)包括起始位、數(shù)據(jù)位、校驗(yàn)位與停止位,其中數(shù)據(jù)位長(zhǎng)度為5~8 bit,校驗(yàn)?zāi)J娇蛇x奇校驗(yàn)或偶校驗(yàn),并可以選擇是否采用校驗(yàn)位,停止位長(zhǎng)度可選1 bit、1.5 bit、2 bit,采用何種數(shù)據(jù)格式將視當(dāng)前UART 鏈路傳輸要求而定。
圖1 UART串行異步通信數(shù)據(jù)格式
UART 通信鏈路的建立要求發(fā)送設(shè)備與接收設(shè)備具有一致的波特率與數(shù)據(jù)格式,否則會(huì)導(dǎo)致通信失敗。為了使接收設(shè)備能夠適應(yīng)來(lái)自各種不同波特率發(fā)送設(shè)備的通信鏈路,而無(wú)需事先建立波特率,很多MCU 或嵌入式處理器在硬件或軟件層面集成了自動(dòng)波特率檢測(cè)功能[2-4],能夠自動(dòng)檢測(cè)到主設(shè)備的波特率并進(jìn)行配置,達(dá)到自適應(yīng)的目的。但是傳統(tǒng)的方法僅局限于波特率的自適應(yīng)檢測(cè),尚不能對(duì)數(shù)據(jù)格式進(jìn)行自動(dòng)配置,當(dāng)串行通信鏈路數(shù)據(jù)格式變更時(shí),就無(wú)法自動(dòng)建立通信鏈路。為了改變現(xiàn)有技術(shù)存在的弊端,使UART 串行通信自適應(yīng)的方法擁有更強(qiáng)的實(shí)用性,文中提出了串行通信參數(shù)自適應(yīng)的概念,介紹了一種可靠的實(shí)現(xiàn)串行通信波特率、數(shù)據(jù)格式自動(dòng)配置的方法,并基于Xilinx Artix-7 FPGA實(shí)現(xiàn)了UART 接口的模塊化設(shè)計(jì)與仿真驗(yàn)證。
UART 串行通信參數(shù)自動(dòng)配置在數(shù)據(jù)鏈路層進(jìn)行,新的傳輸鏈路發(fā)起或者改變當(dāng)前波特率、數(shù)據(jù)格式時(shí),將進(jìn)行通信參數(shù)的自適應(yīng)配置。通信參數(shù)自適應(yīng)采用特征值匹配的方法,包括參數(shù)配置字的發(fā)送、接收以及參數(shù)自適應(yīng)與配置。如圖2 所示,配置字的固定長(zhǎng)度為10 位,從功能上劃分為字頭波特率同步碼與數(shù)據(jù)格式配置碼。從機(jī)首先接收并檢測(cè)波特率同步碼,得到串行通信波特率,并以此波特率接收配置字節(jié)的數(shù)據(jù)格式配置碼,并將其寫(xiě)入?yún)?shù)配置寄存器(SERIAL_CONFIG),完成通信參數(shù)的自動(dòng)配置,建立串行通信的連接。
圖2 串行通信配置字節(jié)格式以及接收模式
傳統(tǒng)的自動(dòng)波特率檢測(cè)方法主要有兩種:最小數(shù)法與固定數(shù)據(jù)傳輸法[5-6],最小數(shù)法是通過(guò)不斷檢測(cè)最小的脈沖寬度并與數(shù)據(jù)位脈寬比較,得到串行通信波特率值;固定數(shù)據(jù)傳輸法是通過(guò)發(fā)送特定配置數(shù)據(jù)來(lái)實(shí)現(xiàn)波特率信息的傳輸。第一種方法的缺點(diǎn)是波特率的識(shí)別與判定非常依賴于發(fā)送數(shù)據(jù)的內(nèi)容,需要不斷重復(fù)檢測(cè),檢測(cè)效率低、握手時(shí)間慢??紤]到該設(shè)計(jì)不僅要完成波特率自適應(yīng)檢測(cè),還需要進(jìn)行數(shù)據(jù)格式的自動(dòng)配置,所以將波特率與數(shù)據(jù)格式捆綁為參數(shù)特征值,采用固定參數(shù)數(shù)據(jù)傳輸?shù)姆椒ā?/p>
為高效、快速地實(shí)現(xiàn)波特率檢測(cè),對(duì)傳統(tǒng)的固定數(shù)據(jù)傳輸法進(jìn)行改進(jìn),采用特征值匹配法[7]與查表法[8]相結(jié)合的方式。如圖2 所示,配置字節(jié)中前3 位設(shè)定為波特率同步碼,將其作為波特率檢測(cè)的特征值,接收機(jī)利用邊沿檢測(cè)電路捕獲特征值,并通過(guò)時(shí)鐘計(jì)數(shù)器測(cè)量邊沿時(shí)間,完成對(duì)波特率同步碼的時(shí)間測(cè)量[9]。為消除邊沿檢測(cè)有可能引發(fā)的亞穩(wěn)態(tài),采用兩級(jí)D 觸發(fā)器進(jìn)行邊沿檢測(cè)[10]。時(shí)鐘計(jì)數(shù)區(qū)間包含2 bit 脈沖寬度,采用100 MHz 的系統(tǒng)時(shí)鐘作為時(shí)鐘激勵(lì),其頻率遠(yuǎn)大于波特率。通過(guò)計(jì)算可得,通信采用115 200 bps 的波特率時(shí),時(shí)鐘計(jì)數(shù)的時(shí)間測(cè)量誤差比小于0.12%,因此,能夠保證很高的時(shí)間測(cè)量精度。波特率的理論計(jì)算公式為:
由于標(biāo)準(zhǔn)波特率在有限的幾個(gè)固定數(shù)值之間變化,同時(shí)為了減小FPGA 運(yùn)算資源的開(kāi)銷(xiāo),可采用查表法得到鏈路波特率。時(shí)鐘計(jì)數(shù)范圍與對(duì)應(yīng)波特率的對(duì)照表如表1 所示,由此得到串行通信的波特率。然后將對(duì)應(yīng)的波特率配置碼暫存到通信參數(shù)配置寄存器SERIAL_CONFIG 的低4 位,供串行通信接收、發(fā)送模塊讀取調(diào)用。
表1 波特率、時(shí)鐘計(jì)數(shù)范圍與參數(shù)配置寄存器SERIAL_CONFIG低4位配置碼對(duì)照表
圖3 為邊沿檢測(cè)、時(shí)鐘計(jì)數(shù)與數(shù)據(jù)格式配置碼接收采樣信號(hào)的時(shí)序關(guān)系,在得到當(dāng)前通信鏈路的波特率后,通過(guò)波特率發(fā)生器模塊(Baud Rate Generator)生成波特率采樣時(shí)鐘信號(hào)[11],完成配置字節(jié)中數(shù)據(jù)格式配置碼(2~7 bit)的接收,此時(shí)配置字節(jié)的1 bit 起到“偽起始位”的作用,為配置碼接收提供一個(gè)波特率位的時(shí)間緩沖。波特率發(fā)生器是通過(guò)對(duì)系統(tǒng)時(shí)鐘(100 MHz)分頻得到波特率采樣時(shí)鐘信號(hào),分頻因子[12]作為時(shí)鐘計(jì)數(shù)寄存器的向上溢出值,其計(jì)算方法如下:
圖3 串行通信配置字節(jié)接收過(guò)程時(shí)序關(guān)系
數(shù)據(jù)接收采樣設(shè)定在1/2 的分頻因子位置,即在波特率信號(hào)周期的中間位置,這樣能夠提高串行通信對(duì)波特率誤差的容忍范圍[13-14]。
如表2 所示,數(shù)據(jù)格式配置碼接收完畢后暫存到SERIAL_CONFIG 的4~9 位。該寄存器能夠被參數(shù)接收模塊、數(shù)據(jù)收發(fā)模塊訪問(wèn),參數(shù)接收模塊對(duì)其具有寫(xiě)入權(quán)限,數(shù)據(jù)收發(fā)模塊對(duì)其具有讀取權(quán)限。
表2 串行通信數(shù)據(jù)格式對(duì)在參數(shù)配置寄存器中的配置碼
為實(shí)現(xiàn)通信參數(shù)自適應(yīng)的UART 通信方案,基于Xilinx Artix-7 系列FPGA 與Vivado 開(kāi)發(fā)平臺(tái)[15],利用Verilog HDL 硬件描述語(yǔ)言,從邏輯電路層面實(shí)現(xiàn)了設(shè)計(jì)。整體設(shè)計(jì)從功能可劃分為4 個(gè)模塊單元:TX module(發(fā)送模塊)、Baud Rate Generator(波特率產(chǎn)生器)、Parameters RX(參數(shù)接收模塊)與Data RX(數(shù)據(jù)接收模塊)?;贔PGA 的串行通信功能模塊結(jié)構(gòu)如圖4 所示。
圖4 基于FPGA的串行通信功能模塊結(jié)構(gòu)
在串行通信參數(shù)配置完畢后,發(fā)送模塊便可對(duì)通信參數(shù)寄存器進(jìn)行讀取。如圖4 所示,發(fā)送控制器是發(fā)送模塊的控制核心,在數(shù)據(jù)發(fā)送鏈路建立之初,讀取寄存器中波特率信息、數(shù)據(jù)格式信息。發(fā)送控制器的主要作用還包括:
1)將波特率時(shí)鐘轉(zhuǎn)化為發(fā)送狀態(tài)時(shí)序。在該時(shí)序的控制下,數(shù)據(jù)字節(jié)的各位將按照波特率時(shí)鐘頻率發(fā)送至TX 總線,無(wú)數(shù)據(jù)傳輸時(shí)保持高電平。
2)根據(jù)數(shù)據(jù)格式控制發(fā)送內(nèi)容,包括數(shù)據(jù)位長(zhǎng)、停止位長(zhǎng)、有無(wú)校驗(yàn)位,如果存在校驗(yàn)位,將根據(jù)校驗(yàn)?zāi)J教砑悠婊蚺夹r?yàn)位。通過(guò)控制移位寄存器,實(shí)現(xiàn)發(fā)送數(shù)據(jù)的并串轉(zhuǎn)換。
接收模塊在波特率采樣時(shí)鐘激勵(lì)下進(jìn)行配置參數(shù)與數(shù)據(jù)的接收,可進(jìn)一步分為參數(shù)接收模塊與數(shù)據(jù)接收模塊。配置參數(shù)的接收優(yōu)先于數(shù)據(jù)接收。接收控制器作為接收模塊的控制核心,其主要作用有3個(gè)方面:
1)控制波特率檢測(cè)、配置參數(shù)接收和數(shù)據(jù)接收(或發(fā)送)的優(yōu)先級(jí)劃分,其中波特率檢測(cè)具有最高的優(yōu)先級(jí),數(shù)據(jù)收發(fā)具有最低的優(yōu)先級(jí)。
2)對(duì)RX 進(jìn)行持續(xù)邊沿檢測(cè),確定發(fā)送起始位的到來(lái),并將波特率時(shí)鐘轉(zhuǎn)化為接收狀態(tài)轉(zhuǎn)化時(shí)序。
3)控制接收移位寄存器,對(duì)接收數(shù)據(jù)進(jìn)行采樣,實(shí)現(xiàn)接收數(shù)據(jù)的串并轉(zhuǎn)化。按照數(shù)據(jù)格式,控制接收的數(shù)據(jù)及數(shù)據(jù)長(zhǎng)度和校驗(yàn)。
接收控制器對(duì)接收優(yōu)先級(jí)的控制是通過(guò)有限狀態(tài)機(jī)[16]來(lái)實(shí)現(xiàn)的,配置參數(shù)寄存器的高2 位用于標(biāo)識(shí)串行通信參數(shù)的接收情況(波特率、數(shù)據(jù)格式)。如圖5 所示,當(dāng)檢測(cè)到信號(hào)下降沿,如果通信參數(shù)配置完畢,接收狀態(tài)機(jī)進(jìn)入左側(cè)的配置參數(shù)接收狀態(tài)支路,否則進(jìn)入配置參數(shù)接收支路。
圖5 配置參數(shù)與數(shù)據(jù)接收的有限狀態(tài)機(jī)
配置參數(shù)接收狀態(tài)包括空閑狀態(tài)、時(shí)鐘計(jì)數(shù)狀態(tài)、配置碼接收狀態(tài)、停止位;數(shù)據(jù)接收狀態(tài)機(jī)與配置參數(shù)接收狀態(tài)機(jī)共用空閑與停止位接收狀態(tài),其還包括數(shù)據(jù)位接收、奇偶校驗(yàn)。在接收數(shù)據(jù)位時(shí),在接收控制器的作用下,根據(jù)數(shù)據(jù)位長(zhǎng)度及已經(jīng)接收到的數(shù)據(jù)位,選擇是否跳轉(zhuǎn)到下一個(gè)狀態(tài),并根據(jù)SERIAL_CONFIG 的第6 位確定下一個(gè)狀態(tài)為校驗(yàn)狀態(tài)還是停止?fàn)顟B(tài)。如果為校驗(yàn)狀態(tài),則根據(jù)SERIAL_CONFIG 的第7 位來(lái)確定校驗(yàn)?zāi)J讲⑦M(jìn)行奇(或偶)偶校驗(yàn)。最后,完成數(shù)據(jù)的存儲(chǔ),并且給出數(shù)據(jù)是否成功接收或者校驗(yàn)錯(cuò)誤標(biāo)識(shí)碼。
基于Vivado 仿真平臺(tái)進(jìn)行串行通信參數(shù)自適應(yīng)的功能仿真,主要分兩個(gè)部分:串行通信參數(shù)的接收、數(shù)據(jù)的收發(fā)。
1)串行通信參數(shù)的接收
波特率檢測(cè)以及配置參數(shù)的接收仿真如圖6所示,仿真波特率為38 400 bps,通信數(shù)據(jù)格式為8 bit 數(shù)據(jù)位、奇校驗(yàn)、1 bit 停止位,配置碼為8b0001_1101。
圖6 波特率檢測(cè)以及串行通信參數(shù)接收功能仿真
當(dāng)接收模塊檢測(cè)到信號(hào)下降沿到來(lái)時(shí),并且配置參數(shù)寄存器的高2 位為“00”,則進(jìn)入配置碼接收狀態(tài),在接收控制器的作用下,參數(shù)接收狀態(tài)機(jī)變量(rx_config_status)由“0”(空閑)變?yōu)椤?”,進(jìn)行時(shí)鐘計(jì)數(shù),計(jì)數(shù)大小為5 208。通過(guò)查找表得到波特率為38 400 bps,將其存儲(chǔ)碼(“0111”)寫(xiě)入配置參數(shù)寄存器(SERIAL_CONFIG)的低4 位。
為實(shí)現(xiàn)數(shù)據(jù)格式配置碼的接收,波特率產(chǎn)生器生成38 400 bps 的采樣時(shí)鐘baud_clk,接收狀態(tài)由“1”跳轉(zhuǎn)到“2”(接收配置碼),利用采樣時(shí)鐘對(duì)2~6 bit 進(jìn)行中間采樣,接收配置碼為“111000”,將其存儲(chǔ)于配置參數(shù)寄存器中,同時(shí)將寄存器的最高位置1,標(biāo)識(shí)串行通信參數(shù)接收完畢。
2)數(shù)據(jù)的收發(fā)
如圖7(a)所示,仿真模擬主機(jī)發(fā)送16 進(jìn)制數(shù)據(jù)0x55,當(dāng)信號(hào)下降沿到來(lái)時(shí),接收模塊首先檢測(cè)SERIAL_CONFIG 的最高位,如果串行通信參數(shù)已經(jīng)配置完畢,則進(jìn)入數(shù)據(jù)接收狀態(tài)機(jī)。
圖7 串行通信數(shù)據(jù)收發(fā)功能仿真
接收狀態(tài)機(jī)寄存器變量rx_state 表示空閑狀態(tài)(0)、起始位(1)、數(shù)據(jù)位(2)、校驗(yàn)位(3)、停止位(4)5 個(gè)接收狀態(tài),并在接收控制器的作用下進(jìn)行狀態(tài)的跳轉(zhuǎn)。波特率產(chǎn)生器生成38 400 bps 對(duì)應(yīng)的采樣時(shí)鐘信號(hào)baud_clk,進(jìn)行數(shù)據(jù)的中間采樣接收,最終完成數(shù)據(jù)0x55 的成功接收,并進(jìn)行奇校驗(yàn),且校驗(yàn)無(wú)誤。
圖7(b)為發(fā)送模塊功能仿真,當(dāng)發(fā)送模塊接收到發(fā)送指令信號(hào)tx_data_tvalid,對(duì)寄存器變量數(shù)據(jù)tx_data進(jìn)行并串轉(zhuǎn)換,輸送至uart_tx 信號(hào)線,并由發(fā)送控制器計(jì)算得到奇校驗(yàn)碼,添加至數(shù)據(jù)位尾部一并發(fā)送。
為進(jìn)一步驗(yàn)證UART自適應(yīng)串行參數(shù)配置接口的可靠性與穩(wěn)定性,將Artix-7FPGA開(kāi)發(fā)板與PC進(jìn)行聯(lián)機(jī)測(cè)試。PC 作為主機(jī),集成了參數(shù)自適應(yīng)功能的FPGA 開(kāi)發(fā)板作為從機(jī),在PC端利用串口調(diào)試助手發(fā)送配置參數(shù),建立串行通信鏈路,進(jìn)行數(shù)據(jù)收發(fā)測(cè)試。
該測(cè)試采用中、低、高3 個(gè)波特率:9 600 bps、1 200 bps、115 200 bps,分別進(jìn)行測(cè)試,每個(gè)波特率分別采用奇校驗(yàn)、偶校驗(yàn)、無(wú)校驗(yàn)3 種校驗(yàn)?zāi)J?,?shù)據(jù)位分別采用5~8 bit、停止位采用1~2 bit 長(zhǎng)度,進(jìn)行多組測(cè)試。測(cè)試結(jié)果表明FPGA 端的自適應(yīng)串行參數(shù)接口能夠準(zhǔn)確的獲取串行通信參數(shù),并能夠建立穩(wěn)定的通信鏈接。
文中基于FPGA實(shí)現(xiàn)通用異步串行通信的參數(shù)自動(dòng)配置方法,利用特征值匹配與查表法相結(jié)合的方式,成功實(shí)現(xiàn)了波特率與數(shù)據(jù)格式的自適應(yīng)檢測(cè)以及自動(dòng)配置?;赬ilinx Artix-7 系列FPGA,利用Verilog 硬件描述語(yǔ)言實(shí)現(xiàn)了該方案的UART接口的硬件電路設(shè)計(jì)。仿真與測(cè)試表明,該方法能夠快速、穩(wěn)定地建立串行通信鏈路。整體設(shè)計(jì)具有很高的完整性和穩(wěn)定性。
這種方法突破了傳統(tǒng)的波特率自適應(yīng)方法,不僅可以實(shí)現(xiàn)波特率的自適應(yīng),同時(shí)能夠?qū)崿F(xiàn)串行通信參數(shù)中數(shù)據(jù)格式的自動(dòng)配置,對(duì)通用串行通信的應(yīng)用方法進(jìn)行了補(bǔ)充與完善,具有很高的實(shí)用意義。