摘 要: 實(shí)現(xiàn)了一種無需MCU的USB2.0設(shè)備控制器IP核。使用硬件電路代替?zhèn)鹘y(tǒng)單片機(jī)實(shí)現(xiàn)的MCU和固件功能,支持高速(480 Mb/s)和全速(12 Mb/s)傳輸。所設(shè)計(jì)的IP核在FPGA上經(jīng)過了驗(yàn)證,結(jié)果表明它可以作為獨(dú)立的模塊用于SoC系統(tǒng)中。
關(guān)鍵詞: IP; USB; SoC; MCU
通用串行總線USB(Universal Serial Bus)是現(xiàn)今最為流行的計(jì)算機(jī)接口,它是一種快速、雙向、同步、可動(dòng)態(tài)監(jiān)測(cè)的串行接口[1]。目前大多數(shù)的USB設(shè)計(jì)都是經(jīng)過系統(tǒng)集成,采用現(xiàn)成的商用USB芯片進(jìn)行開發(fā),并沒有涉及到IP(Intellectual Property)核的設(shè)計(jì)與開發(fā)。在SoC(System on Chip)開發(fā)中可以利用已有的IP核開發(fā)成果,縮短系統(tǒng)芯片的設(shè)計(jì)周期,提高效率。本文通過分析USB2.0協(xié)議,實(shí)現(xiàn)了一個(gè)無需外置MCU(Micro Control Unit)的USB2.0設(shè)備控制器IP核,并進(jìn)行了FPGA驗(yàn)證,可用于SoC的集成中。
1 USB2.0設(shè)備控制器系統(tǒng)設(shè)計(jì)
目前USB2.0設(shè)備控制器廣泛使用的系統(tǒng)架構(gòu)是串行接口引擎SIE(Serial Interface Engine) +MCU模式,SIE負(fù)責(zé)解釋USB協(xié)議層的動(dòng)作[2]。一方面,SIE模塊將主機(jī)發(fā)送的信息解釋成后端功能設(shè)備能夠識(shí)別的信息;另一方面,將功能模塊相關(guān)數(shù)據(jù)按照符合USB協(xié)議的格式發(fā)送給主機(jī)。這種傳統(tǒng)的USB設(shè)備控制器設(shè)計(jì)核心是針對(duì)事務(wù)(Transaction)和信息包(Packet)的處理。對(duì)于關(guān)鍵的控制傳輸,則需要外置單片機(jī)和固件的輔助,因?yàn)檫@種傳統(tǒng)的USB設(shè)備控制器不能獨(dú)立完成USB與主機(jī)通信過程中最核心的枚舉過程。
本文使用硬件電路代替?zhèn)鹘y(tǒng)單片機(jī)實(shí)現(xiàn)MCU和固件的功能。整體框架如圖1所示,圖中實(shí)心箭頭代表應(yīng)用與主機(jī)之間的數(shù)據(jù)流。
采用Top-to-Down(自頂向下)的設(shè)計(jì)結(jié)構(gòu)將USB設(shè)備控制器劃分為以下主要功能模塊:
(1)Init模塊:實(shí)現(xiàn)UTMI協(xié)議(USB 2.0 Transceriver Macrocell Interface(UTMI) Specification)的相關(guān)細(xì)節(jié),主要用于控制總線掛起/恢復(fù)模式與速度模式的切換。
(2)Packet模塊:對(duì)接收到的USB格式的信息包進(jìn)行處理,提取其中的數(shù)據(jù),檢驗(yàn)CRC;對(duì)發(fā)送的數(shù)據(jù)進(jìn)行封裝,添加CRC檢驗(yàn)位。
(3)Transaction模塊:對(duì)USB定義的基本事務(wù)(transaction)類型(如IN、OUT、SETUP和PING等)按照協(xié)議規(guī)范處理。以上模塊實(shí)現(xiàn)SIE的功能, 其事務(wù)處理流程如圖2所示。
(4)Serial模塊:例化調(diào)用其他模塊,同時(shí)對(duì)傳輸過程中的錯(cuò)誤進(jìn)行處理。
(5)Descriptor ROM和Control模塊:完成枚舉過程中的控制傳輸。
2 硬件電路代替MCU和固件
2.1方案分析
微控制器的主要功能是負(fù)責(zé)執(zhí)行固件框架程序,協(xié)助完成 USB的控制傳輸。這一部分可以用單片機(jī)或者硬件電路實(shí)現(xiàn),目前常用單片機(jī)實(shí)現(xiàn),優(yōu)點(diǎn)是設(shè)計(jì)簡(jiǎn)單、靈活;缺點(diǎn)是單片機(jī)的速度比較慢,遠(yuǎn)遠(yuǎn)低于硬件電路。
使用硬件電路實(shí)現(xiàn)雖然設(shè)計(jì)復(fù)雜而且靈活度不如單片機(jī),但它的優(yōu)點(diǎn)是:(1)降低協(xié)議開銷,從而得到更快的傳輸速度;(2)降低用戶使用開發(fā)周期,因?yàn)槭褂糜布娐穼?shí)現(xiàn)MCU功能,省去了后期固件和驅(qū)動(dòng)程序的開發(fā);(3)不使用單獨(dú)的單片機(jī),顯著地降低了成本。
2.2 MCU和固件功能模擬
本設(shè)計(jì)中Descriptor ROM模塊用于存儲(chǔ)控制傳輸協(xié)議中需要用到的各種描述符,模擬枚舉過程中固件的功能。例如18 B的設(shè)備描述符定義如下:
constant desc_dev: byte_array(0 to 19) := (
X"12", -- bLength = 18 bytes
X"01", -- bDescriptorType=device descriptor
X"00",
X"02", -- bcdUSB = 2.00
X"02", --bDeviceClass=CDC
X"00", -- bDeviceSubClass = none
X"00", -- bDeviceProtocol = none
X"40", -- bMaxPacketSize0 = 64 bytes
VENDORID(7 downto 0), -- idVendor
VENDORID(15 downto 8),
PRODUCTID(7 downto 0), -- idProduct
PRODUCTID(15 downto 8),
VERSIONBCD(7 downto 0), -- bcdDevice
VERSIONBCD(15 downto 8),
X"01", -- iManufacturer
X"02", -- iProduct
X"03", -- iSerialNumber
X"01", -- bNumConfigurations = 1
X"00", X"00" ); -- 2 bytes padding
([注] byte_array是自定義的數(shù)組類型)
Control模塊模擬MCU的行為,根據(jù)控制傳輸時(shí)主機(jī)請(qǐng)求的類型,在Descriptor ROM中選擇相應(yīng)的描述符返回給主機(jī)。為了精簡(jiǎn)工作流程,設(shè)計(jì)中按照“在保證傳輸正確的基礎(chǔ)上盡量減少中斷”的設(shè)計(jì)原則[3],實(shí)現(xiàn)了設(shè)備控制器最大限度精簡(jiǎn)指令。根據(jù)USB2.0規(guī)定的標(biāo)準(zhǔn)設(shè)備請(qǐng)求的結(jié)構(gòu), Control模塊的主要工作流程圖3所示。
Control模塊代碼的結(jié)構(gòu)主體是一個(gè)三重狀態(tài)機(jī)。圖3是Control模塊簡(jiǎn)化流程示意圖, 沒有標(biāo)出差錯(cuò)處理機(jī)制和其他細(xì)節(jié)??刂苽鬏斨?主機(jī)發(fā)送數(shù)據(jù)域長(zhǎng)度為8 B的請(qǐng)求,當(dāng)Transaction模塊檢測(cè)到Setup類型傳輸時(shí),通知Control模塊,Control模塊檢測(cè)識(shí)別標(biāo)準(zhǔn)USB請(qǐng)求的8 B數(shù)據(jù),進(jìn)行相應(yīng)操作(如SetAddress、GetDesciriptor和GetConfiguration)。按照主機(jī)發(fā)送8 B請(qǐng)求的順序,核心處理步驟如下:
(1)檢測(cè)bmRequestType字節(jié),bmRequestType的D6~5位為00代表USB協(xié)議定義的標(biāo)準(zhǔn)請(qǐng)求(bRequest)。(2)檢查bRequest字節(jié),USB支持11類的標(biāo)準(zhǔn)請(qǐng)求,此步驟可以確定請(qǐng)求的描述符類型。(3)檢查wValue域(2 B),低字節(jié)表示索引號(hào),用來選擇同一種描述符(例如字符串描述符和配置描述符)中具體某個(gè)描述符;高字節(jié)表示描述符的類型編號(hào)。(4)檢查wIndex域,在獲取字符串描述符時(shí)表示字符串的語言ID號(hào)。(5)最后檢查wLength,表示數(shù)據(jù)過程(如果有時(shí))所需要傳輸?shù)淖止?jié)數(shù)。
當(dāng)Endpoint(端點(diǎn))寄存器為“0000” (表示控制端點(diǎn))且內(nèi)部Dscbusy寄存器為‘0’(控制傳輸,但請(qǐng)求的不是描述符)時(shí),選擇發(fā)送給主機(jī)的數(shù)據(jù)是代表當(dāng)前的Device(設(shè)備)、Endpoint和Interface(接口)狀態(tài)的數(shù)據(jù);當(dāng)Endpoint(端點(diǎn))寄存器為“0000”(表示控制端點(diǎn))且Dscbusy寄存器為‘1’時(shí),選擇wValue確定的描述符發(fā)送給主機(jī);其他情況發(fā)送的是來自應(yīng)用系統(tǒng)(Application)的數(shù)據(jù)。
2.3 錯(cuò)誤檢測(cè)和處理的改進(jìn)
USB規(guī)范中列出了種類繁多的錯(cuò)誤的產(chǎn)生及其相應(yīng)的檢測(cè)恢復(fù)方法。對(duì)于傳統(tǒng)的SIE+MCU系統(tǒng),傳輸過程中發(fā)生的任何錯(cuò)誤都向外部MCU提出中斷,固件對(duì)規(guī)范中的錯(cuò)誤類型應(yīng)有處理及恢復(fù)機(jī)制[4]。例如Host發(fā)出 IN令牌包接收到數(shù)據(jù)以后,必須及時(shí)地返回握手包,否則超時(shí)。超時(shí)后,MCU馬上產(chǎn)生中斷并選擇在下一個(gè)IN令牌包來時(shí)重傳上一次數(shù)據(jù)。這種處理的缺點(diǎn)是中斷頻繁、效率比較低。本設(shè)計(jì)中沒有使用MCU,對(duì)錯(cuò)誤的檢測(cè)和處理均是在設(shè)備控制器內(nèi)部進(jìn)行。由于省去了中斷請(qǐng)求與處理的延時(shí),對(duì)傳輸過程中發(fā)生的錯(cuò)誤能夠得到高效的處理。例如對(duì)上述所提到的錯(cuò)誤,Serial選擇在下一個(gè)IN令牌到來時(shí)自動(dòng)重傳上一次數(shù)據(jù),且最多嘗試3次,如果問題依舊存在,作為線路故障處理。這種處理方法能夠充分發(fā)揮硬件電路的高速優(yōu)勢(shì)。
3 系統(tǒng)仿真與FPGA驗(yàn)證
在驗(yàn)證過程中,利用事務(wù)模型建立USB虛擬主機(jī)和應(yīng)用模型完成系統(tǒng)功能仿真,然后綜合代碼、設(shè)置引腳、自動(dòng)布局布線后下載到FPGA內(nèi)驗(yàn)證。本文選用Cypress公司的CY7C68000芯片作為前端的收發(fā)器(PHY)和Xilinx公司的Spartan-3E(XC3S500E -4PQ208C)芯片制作的 FPGA開發(fā)板作為驗(yàn)證USB設(shè)備控制器IP核的平臺(tái)。XC3S500E系統(tǒng)門數(shù)達(dá)50萬,可提供高達(dá)340 MHz的內(nèi)部性能。
枚舉過程屬于控制傳輸,一般分為3個(gè)階段,以Get_descriptor為例,過程如下:
(1)建立階段:如圖4所示,USB主機(jī)首先發(fā)送來一個(gè)SETUP令牌包,PID為0x2d,設(shè)備地址為0x00,端點(diǎn)0x00(控制端點(diǎn))。后面緊跟一個(gè)DATA0的數(shù)據(jù)包,PID為0xc3,后面的數(shù)據(jù)0x80、0x06、0x00、0x01、0x00、0x00、0x12、0x00表示這是一個(gè)Get_Descriptor標(biāo)準(zhǔn)設(shè)備請(qǐng)求的數(shù)據(jù)包。其中PHY_TXVALID、 PHY_TXREADY、 PHY_DATAOUT是符合UTMI定義數(shù)據(jù)發(fā)送接口信號(hào),PHY_RXVALID、PHY_RXACTIVE、PHY_DATAIN是符合UTMI規(guī)范的數(shù)據(jù)接收接口信號(hào)。
(2)數(shù)據(jù)階段:主機(jī)發(fā)出一個(gè)IN包,如圖5所示,PID為0x69,設(shè)備收到IN包后用數(shù)據(jù)包DATA1(PID為0x4b)返回自己的設(shè)備描述符,與前面定義的18 B設(shè)備描述符數(shù)據(jù)一致。主機(jī)收到正確的數(shù)據(jù)包后返回一個(gè)ACK握手包(PID為0xd2),表示接收正確。
(3)狀態(tài)階段:主機(jī)發(fā)出OUT包,但與數(shù)據(jù)階段不同,狀態(tài)階段所發(fā)數(shù)據(jù)包內(nèi)容為空。設(shè)備成功收到數(shù)據(jù)包后應(yīng)答ACK握手包。
本文實(shí)現(xiàn)了一種有別于傳統(tǒng)的MCU+SIE方案的USB2.0設(shè)備控制器IP核設(shè)計(jì)。使用硬件電路代替單片機(jī)實(shí)現(xiàn)MCU和固件功能,顯著地降低了系統(tǒng)硬件規(guī)模和實(shí)現(xiàn)成本。同時(shí)簡(jiǎn)化了錯(cuò)誤檢測(cè)和處理的流程,有利于進(jìn)一步提高USB傳輸速度。FPGA驗(yàn)證表明,該方案實(shí)現(xiàn)的USB2.0設(shè)備控制器IP核有效可行,可以進(jìn)一步完成ASIC設(shè)計(jì),使之作為獨(dú)立模塊添加到SoC系統(tǒng)中。
參考文獻(xiàn)
[1] USB Implementers Forum, Inc. Universal serial bus specification(Rev 2.0)[EB/OL]. (2002-04-xx)[2013-01-24]. http://www.usb.org.
[2] 陳亮,袁志堅(jiān),史大龍,等.內(nèi)嵌8051的USB2.0設(shè)備控制器IP設(shè)計(jì)[J]. 微型機(jī)與應(yīng)用,2012,31(17):28-30.
[3] [美]AXELSON J. USB開發(fā)大全[M]. 李鴻鵬, 鄭瑞霞,陳香凝,等譯. 北京:人民郵電出版社, 2011.
[4] 黃衛(wèi)華,朱向東, 沈緒榜.一種高速USB設(shè)備控制器IP核的設(shè)計(jì)與實(shí)現(xiàn)[J]. 微電子學(xué)與計(jì)算機(jī), 2005,22(5):106-109.