通用異步收發(fā)器(UART)是將數(shù)據(jù)從一個系統(tǒng)發(fā)送到另一個系統(tǒng)的最簡單方法。UART通常集成在微控制器中,而且很多現(xiàn)代的IC都包含一個也可以同步通信的UART,稱為通用同步/異步收發(fā)器(USART)。
UART除了在系統(tǒng)中被廣泛使用以外,它還是測試接口是否符合相關(guān)標準的必要工具。下面的測試內(nèi)容通常在待測器件(DUT)的UART 硬件/IP上執(zhí)行,并且采用不同的波特率、數(shù)據(jù)、奇偶校驗和停止位寬度。
1. 基本回環(huán)測試
2. 標準UART發(fā)送與接收測試
3. 奇偶校驗和成幀誤差條件
4. 具有LSB/MSB首選項的UART發(fā)送與接收
5. 時序容差測試
除基本回環(huán)測試外,其它幾種情況都需要專門的驗證平臺來檢查DUT是否兼容于標準的UART接口。并沒有現(xiàn)成可用的這種平臺。公司在測試UART設(shè)計時通常制作定制的驗證套件,進行手動測試,或者使用市場上的標準接口IC或USB-UART橋接器。但是,這些方法的測試范圍很有限。
本文介紹一種通用的UART自動驗證平臺,可用于自動測試UART接口的所有方面。
一、標準的UART幀
圖1給出一個標準的UART幀,并解釋了其中的所有字段。該幀的定義是在考慮了市場上不同的UART規(guī)范后而制定的。因此可以肯定地說,以下結(jié)構(gòu)覆蓋了所有可能的UART數(shù)據(jù)幀組合。
圖1:通用UART幀
從圖1中可以看到,起始位(低位,1位長度)不會因UART版本的不同而變化。幀的其它字段長度可根據(jù)具體應(yīng)用而變化。器件可支持每數(shù)據(jù)包的數(shù)據(jù)位寬度最低為4位,最高是9位。在特定情況下,當設(shè)計需要時數(shù)據(jù)寬度可采用任意值,以保持其它參數(shù)的兼容性,但不一定兼容于標準的UART接口。當需要錯誤校驗時應(yīng)加入奇偶校驗位,而其它情況下可在數(shù)據(jù)包中省去該字段。由于這是單個位奇偶校驗,因此在接收器處最多識別單個位錯誤。停止位(高位,直到下個數(shù)據(jù)包開始)會有不同,取決于接收器接收下個數(shù)據(jù)包的速度有多快,最快的接收器最低是1位,而最慢的接收器最低是4位。
本文下一頁:UART驗證平臺
二、平臺
穩(wěn)健的UART驗證平臺必須測試通信接口的所有特性。為此,平臺需要能夠自動處理所有可能的UART參數(shù)組合。目前UART驗證測試采用手動測試,需要在整個測試過程中使用專用資源,而且由于是手動測試,會消耗大量時間。這時可采用能夠處理重復(fù)測試的UART自動驗證平臺實現(xiàn)流程的自動化,以減少測試工作。
我們可以看到標準的現(xiàn)成工具無法支持其中的多種特性,例如4位和9位數(shù)據(jù)寬度,或2.5位至4.0位停止寬度。因此,需要一種可支持全部甚至更多特性的全新驗證平臺。另一個要求則是實現(xiàn)測試的自動化,這可以減少對DUT執(zhí)行測試時的手動工作。
本文描述的UART自動驗證平臺可支持如下配置:
1. 波特率(bps):50、110、300、600、1200、2400、4800、9600、19200、28800、38400、57600、115200、230400、460800、921600
2. 數(shù)據(jù)寬度(位):1、2、3、4、5、6、7、8、9、10
3. 奇偶校驗位:無、奇數(shù)、偶數(shù)
4. 停止位寬度:1.0、1.5、2.0、2.5、3.0、3.5、4.0
5. TX緩沖器:16幀
6. RX緩沖器:16幀
圖2:UART自動驗證平臺
圖2 給出了包含UART自動驗證平臺所有主要模塊的高級系統(tǒng)視圖:
1. 測試控制器:驗證平臺的核心。這是一個用來收集、處理數(shù)據(jù),并在系統(tǒng)中其它模塊之間轉(zhuǎn)發(fā)數(shù)據(jù)的MCU。它應(yīng)該具有一個USB接口,從而與主計算機進行通信。
2. 發(fā)送與接收FIFO:需要發(fā)送的數(shù)據(jù)幀存儲在發(fā)送FIFO中,從DUT接收到的數(shù)據(jù)幀則存儲在接收FIFO中。MCU從主機收集發(fā)送數(shù)據(jù)包,將其轉(zhuǎn)換為數(shù)據(jù)幀,并載入到發(fā)送FIFO中。接收FIFO負責(zé)轉(zhuǎn)發(fā)從DUT收集的幀,將其轉(zhuǎn)到測試控制器進行數(shù)據(jù)包轉(zhuǎn)換,并轉(zhuǎn)發(fā)至主機。數(shù)據(jù)包緩存是提高系統(tǒng)速度的有效方案。
FIFO通常在MCU的SRAM中實現(xiàn)。這種實現(xiàn)方案僅支持16幀的發(fā)送或接收會話??筛鶕?jù)特定要求提高這一數(shù)字,但要受限于所用的SRAM。
3. 移位寄存器(并行到串行和串行到并行轉(zhuǎn)換器):UART可采用移位寄存器來實現(xiàn)。在發(fā)送比特位時,它可作為并行到串行轉(zhuǎn)換器,在接收時另一個移位寄存器變成串行到并行轉(zhuǎn)換器。兩個寄存器都以雙倍或多倍波特率頻率計時。
待發(fā)送的數(shù)據(jù)包已被轉(zhuǎn)換為幀比特并送入FIFO。幀數(shù)據(jù)被加載到發(fā)送移位寄存器中,并以正確的波特率發(fā)送到DUT。采用類似的方案從DUT接收數(shù)據(jù)包。對接收到的幀以雙倍波特率(或更多)進行采樣,一旦整個數(shù)據(jù)包進入接收移位寄存器中,幀比特位就會被轉(zhuǎn)移到接收FIFO中。
4. PLL和波特率生成器:PLL模塊使用外部11.0592MHz晶體振蕩器生成供所有其它模塊使用的時鐘頻率。PLL使輸入模塊乘以系數(shù)5,以生成55.296MHz的主時鐘頻率。由于所有模塊都采用相同的時鐘源工作,因此不必使用額外的邏輯來同步模塊。
選擇外部振蕩器生成通用UART應(yīng)用所需的精確波特率??蓪?1.0592MHz時鐘源進行分頻,從而為移位寄存器提供標準的波特率時鐘。波特率生成器作用就在于此。這里采用數(shù)字PWM時鐘生成波特率時鐘。通過改變PWM的周期和比較參數(shù)可生成占空比為50%的波特時鐘。占空比可變是使用PWM模塊的另一個優(yōu)勢,相比之下時鐘分頻器只能生成固定占空比的時鐘輸出??勺兊恼伎毡瓤捎脕眚炞CUART接口的時鐘容差和輸出保真度。
5. 控制寄存器:所有參數(shù)和設(shè)置都保存在8位寄存器中。測試控制器的SRAM可用來實現(xiàn)該目的。主計算機通過用來訪問FIFO的相同接口讀取和寫入寄存器。為該平臺提供如下寄存器
a.控制:使用該寄存器傳送即時命令。寄存器的MSB可用來通知測試控制器有新的命令進入寄存器。命令執(zhí)行后該位被清空。所支持的命令及相應(yīng)的值如下所示。
b.狀態(tài):測試控制器使用該寄存器發(fā)布當前測試的結(jié)果,包括傳輸時的錯誤條件。
c.波特率:該寄存器控制下次數(shù)據(jù)傳輸使用的波特率。所支持的波特率及其數(shù)值顯示如下。
d.數(shù)據(jù)寬度:該寄存器控制下次數(shù)據(jù)傳輸使用的數(shù)據(jù)寬度。所支持的數(shù)值為0x01至0x0A(10個值)。
e.校驗位:使用該寄存器設(shè)置校驗位??梢允菬o校驗,奇數(shù)校驗或偶數(shù)校驗,如下所示。
f.停止寬度:該寄存器規(guī)定每個幀使用的停止寬度。所支持的停止寬度如下所示。
g.過采樣率:發(fā)送和接收幀所需的過采樣數(shù)量使用該寄存器進行設(shè)定。邏輯復(fù)雜程度隨所需的過采樣率增加而增加。最小值是2。
h.TX大?。涸摷拇嫫鞅A鬎IFO中發(fā)送幀的數(shù)量。此值既可在發(fā)送FIFO加載數(shù)據(jù)后手動設(shè)置,也可在FIFO加載后自動加載。最大值是16,最小值是1。
i.RX大小:該寄存器保留FIFO中接收幀的數(shù)量。當接收到一個數(shù)據(jù)幀時,寄存器中的這個值增加1,當主機從FIFO中讀取一個幀時,該值減去1。最大值是16,最小值是1。
6. DUT控制與狀態(tài)信號:需要將以上參數(shù)送到DUT。這個模塊從控制寄存器獲取參數(shù),并推送到DUT。使用并行接口向DUT報告當前設(shè)置。此外,平臺具有一個控制信號“START”,用于斷言該信號可初始化DUT。若DUT應(yīng)用了平臺的設(shè)置,并做好測試的準備工作,就會將另一個信號斷言為“READY”。
7. 主計算機:主計算機執(zhí)行測試用的Perl腳本,通過USB端口與平臺進行通信。所有測試案例都實現(xiàn)為Perl腳本,其可生成覆蓋驗證過程的測試序列。此外,主計算機還收集用來檢查測試是否通過的相關(guān)數(shù)據(jù)。該信息連同測試案例都被寫入文件,以便記錄。
8. 待測器件(DUT):測試帶UART接口的目標器件。
從方框圖及其描述中可以看到,平臺使用移位寄存器來實現(xiàn)UART接口。這種方案的優(yōu)勢在于可通過增加移位寄存器的大小來實現(xiàn)擴展性。
三、幀驗證模塊
使用移位寄存器和FIFO實現(xiàn)UART接口其實并不容易,除非有一個用來識別有效幀的邏輯,用于解碼接收到的數(shù)據(jù)。由下降沿檢測器控制的簡單計數(shù)器/定時器能實現(xiàn)此目的。
UART傳輸開始于下降沿,并在固定的時間內(nèi)保持有效。如果我們已知波特率和UART數(shù)據(jù)包設(shè)置,可利用設(shè)定到該時鐘頻率的定時器來計算數(shù)據(jù)包的有效時長。這樣便可在有效期間內(nèi)精確地啟動移位寄存器以便計入接收線路上看到的數(shù)據(jù)或者記出發(fā)送數(shù)據(jù)。
該邏輯的狀態(tài)機實現(xiàn)方案如圖3所示。有兩個流程:一個流程控制移位寄存器使能輸入,另一個用來保持定時器。
圖3:幀驗證狀態(tài)機
狀態(tài)機可用圖4中的模塊表示。狀態(tài)機工作所需的模塊輸入和輸出也在下面予以解釋。
圖4:幀驗證模塊
a. CLK_IN(輸入):此為主時鐘。該時鐘的頻率遠高于波特時鐘。使用該時鐘采樣和檢測START輸入的下降沿。
b. BAUD_CLK(輸入):波特時鐘頻率乘以過采樣率。此時鐘輸入的最小值是波特頻率的兩倍。
c. START(輸入):該輸入的下降沿代表狀態(tài)機的開始。
d. COUNT(輸入):8位幀寬度,用于初始化倒計時定時器周期。
e. FRAME_VALID(輸出):該輸出信號在START輸入的下降沿變高,當計數(shù)器結(jié)束時變低。
f. IRQ(輸出): 該輸出的上升沿代表幀結(jié)束。當計數(shù)器計數(shù)結(jié)束時,該信號在一個主時鐘周期內(nèi)保持高電平。當狀態(tài)機返回空閑狀態(tài)時,值復(fù)位為 ‘0’。
四、UART驗證模塊
我們已經(jīng)有了用來檢測幀的開始和長度的邏輯模塊,現(xiàn)在可以開始設(shè)計UART驗證模塊。對于接收幀驗證模塊,START輸入就是RX線路本身。由于幀發(fā)送在我們的控制之下,因此進入幀驗證模塊(FVB) 的START輸入來自單位寄存器。圖5給出了完整的UART驗證模塊。
圖5:UART驗證方框圖
由于發(fā)送和接收數(shù)據(jù)包的寬度相同,因此計數(shù)寄存器可由TX和RX幀驗證模塊共享。來自這兩個模塊的幀驗證信號可作為各自部分移位寄存器的使能信號。前面已經(jīng)介紹過,發(fā)送部分使用并行到串行轉(zhuǎn)換器,而接收部分使用串行到并行轉(zhuǎn)換器。這兩個轉(zhuǎn)換器都能訪問存儲單個幀的32位存儲單元,并具有左移功能。兩個寄存器在初始化過程中都被置為‘1’s。但只有位的“計數(shù)”數(shù)值有效。
UART驗證模塊隨后連接到輸入、輸出和其它頂層模塊,如圖6所示。這是圖2所示的系統(tǒng)級方框圖的另一個視角。
圖6:UART驗證
UART驗證模塊的波特時鐘采用PWM單元生成。它作為分頻器使用,用來從固定的11.0592MHz輸入時鐘生成所需的時鐘頻率。PWM單元的輸出頻率由所需的波特率和驗證模塊的過采樣率決定。通過改變PWM單元的周期和比較值來生成要求的時鐘頻率。該模塊還可用來生成時鐘抖動和可變的占空比時鐘,用于驗證DUT對波特率變化的容差。驗證平臺的這個功能可模擬所有可能的實際情景。
驗證模塊的中斷請求(IRQ)輸出與兩個軟件中斷服務(wù)程序(ISR)有關(guān) – 一個用于發(fā)送,一個用于接收。這兩個ISR可用來處理發(fā)送和接收FIFO。幀發(fā)送結(jié)束時,調(diào)用發(fā)送ISR將下個幀從FIFO加載到發(fā)送移位寄存器。類似地,當接收數(shù)據(jù)幀時,接收IRQ從接收移位寄存器獲取內(nèi)容并將數(shù)據(jù)推送到接收FIFO中。
圖7給出了接收事件的典型時序圖,圖8給出了發(fā)送事件的時序圖。兩個階段涉及的所有信號也都包含在圖中。這種情況都假設(shè)UART數(shù)據(jù)包包含8位數(shù)據(jù),無校驗位,有1.5位停止寬度。同樣,為了簡化,將過采樣率設(shè)為2,即波特時鐘是實際波特率頻率的兩倍。寄存器內(nèi)容中的有效幀數(shù)據(jù)被標成黃色,原因在于為了填充32位移位寄存器,有些數(shù)據(jù)在初始化過程中被置為‘1’s。
圖7:接收數(shù)據(jù)包
圖8:發(fā)送數(shù)據(jù)包
五、固件
利用固件在微控制器(MCU)中實現(xiàn)簡單的存儲、處理和轉(zhuǎn)發(fā)架構(gòu)。其它功能則在硬件中實現(xiàn),并由MCU進行訪問控制。MCU從主機接收需處理的命令和數(shù)據(jù)。它將待發(fā)送的幀和從DUT接收的幀存儲在SDRM中實現(xiàn)的FIFO內(nèi)。用來處理發(fā)送和接收數(shù)據(jù)包的中斷服務(wù)程序(ISR)通過通用IRQ在MCU中實現(xiàn)。圖9的流程圖給出了基本流程。
圖9:基本固件流程
六、軟件
這部分平臺運行在Windows PC上,采用Perl腳本語言。平臺所需的USB接口庫是針對Perl進行重用的標準USB庫。在硬件驅(qū)動器層上編寫一個UART驗證庫,以支持與平臺之間的通信。
UART驗證庫支持如下API。
a. Platform_Start():必須在執(zhí)行任何操作前調(diào)用;啟動接口。
b. Platform_Stop():必須在退出主腳本之前調(diào)用;停止接口,并顯示最后的通信錯誤信息(如果有)。
c. Platform_GetSupportedBaud():返回支持的波特率列表。
d. Platform_ReportError($_):設(shè)置錯誤值,用于確定最后的錯誤。
e. Platform_CheckPassFail($_):如果輸入是1,通過;否則失敗。
f. Platform_COMMAND($_):從支持列表中向平臺發(fā)送一個命令。
g. Platform_WriteConfig():將整個數(shù)據(jù)包從腳本發(fā)送至MCU。發(fā)送配置之前應(yīng)使用額外的API設(shè)置參數(shù)。
h. Platform_ReadConfig():顯示來自MCU的當前配置。
i. Platform_CopyConfig():將MCU配置復(fù)制到本地腳本緩沖器。并顯示被復(fù)制的值。
j. Platform_SetBaudRate($_):在本地緩沖器中設(shè)置波特率數(shù)值;直到調(diào)用Platform_WriteConfig()時,才能將該值發(fā)送到MCU。
k. Platform_SetDataWidth($_):在本地緩沖器設(shè)置數(shù)據(jù)寬度值;直到調(diào)用Platform_WriteConfig()時,才能將該值發(fā)送到MCU。
l. Platform_SetParityBit($_):在本地緩沖器中設(shè)置校驗位值;直到調(diào)用Platform_WriteConfig()時,才能將該值發(fā)送到MCU。
m. Platform_SetStopWidth($_):在本地緩沖器中設(shè)置停止寬度值;直到調(diào)用Platform_WriteConfig()時,才能將該值發(fā)送到MCU。
n. Platform_SetOverSampleRate($_):在本地緩沖器中設(shè)置過采樣值;直到調(diào)用Platform_WriteConfig()時,才能將該值發(fā)送到MCU。
o. Platform_SetTXSize($_):設(shè)置一次會話中發(fā)送幀的數(shù)量;直到調(diào)用Platform_WriteConfig()時,才能將該值發(fā)送到MCU。
p. Platform_GetRXSize($_):返回RX緩沖器中幀的數(shù)量。
q. Platform_SetRXSize($_):在本地緩沖器中設(shè)置從PSoC3 RX緩沖器中讀取的值的數(shù)量;直到調(diào)用Platform_WriteConfig()時,才能將該值發(fā)送到MCU。
r. Platform_SetTXDataArray(@_):設(shè)置一個會話中要發(fā)送的數(shù)據(jù)幀。這個API會覆蓋利用Platform_SetTXSize($_) API設(shè)置的值(如果有);直到調(diào)用Platform_WriteConfig()時,才能將該值發(fā)送到MCU。
s. Platform_IsDUTReady():如果DUT空閑,返回1;如果DUT被占用,返回0。
七、硬件實現(xiàn)
實現(xiàn)UART自動驗證平臺所需的大部分邏輯都是通過各種類型的模塊在硬件中實現(xiàn)。為實現(xiàn)該平臺的硬件部分,我們需要如下組件:
1. 32位微控制器(MCU) – 1個
2. 用于倍增頻率的PLL – 1個
3. 用于生成波特頻率的PWM單元– 1個
4. 32位移位寄存器– 2個
5. 用于幀驗證模塊狀態(tài)機的CPLD或FPGA – 1個,具有足夠單元
即使我們使用單個硬件單元實現(xiàn)所有模塊,每個模塊的通信和同步仍需很大量工作。如果我們能夠?qū)⑺杏布趩蝹€處理器上實現(xiàn),該平臺就會簡單得多,例如使用賽普拉斯半導(dǎo)體的可編程片上系統(tǒng)(PSoC),這是微控制器(MCU)、可編程模擬、可編程數(shù)字和可編程互聯(lián)的完美組合。像PsoC這樣的集成型處理器還包含很多常用的固定功能塊,例如PWM、移位寄存器、Opamp、ADC和DAC。該處理器系列通常包含8位器件(例如PSoC 1和PSoC 3)以及32位處理器(例如PSoC 4、PSoC 5和PSoC 5LP),使開發(fā)人員能夠根據(jù)應(yīng)用選擇所需的處理能力。片上系統(tǒng)器件還支持內(nèi)部Flash、SRAM和EEPROM,以及復(fù)雜的時鐘樹和可編程時鐘生成器。另外,還提供多種通信接口,例如USB 2.0、I2C、UART、SPI、I2S、LIN和CAN。
帶可編程邏輯的SoC支持UART自動驗證平臺的更多內(nèi)容能夠在硬件(而非軟件)中實現(xiàn)。例如,PsoC具有一個名為通用數(shù)字模塊(UDB)的可編程邏輯陣列。PSoC 3/PSoC 5/PSoC 5LP共有24個UDB,每個包含8個宏單元、PLA(可執(zhí)行16個乘積項)、1個數(shù)據(jù)路徑單元、1個控制單元和1個狀態(tài)單元。這意味著這個系列的PsoC能夠媲美中高端的Altera MAXV 系列CPLD和Xilinx Cool Runner系列。
PsoC器件的編程和調(diào)試可通過PSoC Creator 來執(zhí)行,這是一種基于分層原理圖的設(shè)計工具,能利用預(yù)制組件和原語函數(shù)的加載庫來幫助設(shè)計人員完成系統(tǒng)級設(shè)計方案。這給予了開發(fā)人員足夠的靈活性,使其可以融入模擬和數(shù)字材料清單,同時通過簡單的固件升級實現(xiàn)最后一分鐘的設(shè)計變更。具有多個通信接口的引導(dǎo)加載器亦能實現(xiàn)簡單直接的現(xiàn)場升級。
實現(xiàn)方案采用PSoC 5LP,該器件具有32位ARM Cortex M3內(nèi)核、USB 2.0接口、可編程時鐘/PLL、硬件PWM、24單元UDB、32位移位寄存器以及高度可配置的通用IO。圖10給出了PSoC 5LP的簡化方框圖。
圖10:PSoC 5LP器件的簡化方框圖
組件的固件位于PSoC 5LP中,包含兩個部分:一個是針對數(shù)字/模擬模塊的原理圖輸入,另一個是在ARM Cortex M3 MCU上運行的膠合邏輯。固件的原理圖輸入如圖11所示,圖中給出了波特率PWM、32位移位寄存器,以及發(fā)送和接收部分的幀驗證模塊。
圖11:PSoC 5LP固件的原理圖輸入
設(shè)計采用如下主要組件:
a. Baud_PWM:生成一個是所選波特率兩倍的時鐘。這樣能確保數(shù)據(jù)的正確采樣。
b. ShiftReg_TX:32位移位寄存器,用以將TX幀移出到DUT。
c. ShiftReg_RX:32位移位寄存器,用以從DUT移入RX幀。
d. UART_Counter_TX:遞減計數(shù)器,為TX移位寄存器生成時鐘輸入,整個幀寬度內(nèi)有效。
e. UART_Counter_RX:與UART_Counter_TX在設(shè)計上相同,為RX移位寄存器生成輸入時鐘。
f. Start_TX:控制寄存器,指示來自固件的TX幀的開始。
g. FrameWidth:計數(shù)器的輸入,指示預(yù)期的幀寬度,考慮雙倍采樣率。
h. tx_irq:上升沿標志TX幀的移出已完成。
i. rx_irq:上升沿標志RX幀的移入已完成。
j. StartTest:用來標志在設(shè)置控制線之后,對DUT測試的開始。
k. Ready_IRQ:在來自DUT的上升沿進行觸發(fā),以指明測試狀態(tài)就緒。
l. 其他IO組件:將控制信號發(fā)送到DUT,以便在測試開始前對其進行配置。
UART_Counter_TX和UART_Counter_RX是Verilog語言的定制組件,位于PSoC 5LP的UDB中。它可用來實現(xiàn)之前介紹的幀驗證狀態(tài)機。
圖12:針對PSoC 5LP用Verilog實現(xiàn)的幀驗證組件
這樣就可成功實現(xiàn)針對UART的自動驗證平臺,用以測試不同參數(shù)間的接口,例如波特率(高達921600波特)、數(shù)據(jù)寬度(最大9位)、校驗和停止寬度(最大4位)。該平臺有助于利用單芯片解決方案執(zhí)行UART接口驗證所需的所有測試,從而降低設(shè)計復(fù)雜性以及出現(xiàn)時序相關(guān)問題的幾率。UART自動驗證平臺能減少整個測試期間的手動工作量和對專用資源的要求。