摘 要: 基于USB 2.0協(xié)議規(guī)范提出了一個(gè)USB 2.0設(shè)備控制器串行接口引擎SIE的IP核的設(shè)計(jì),并內(nèi)嵌8051軟核作為其微控制器進(jìn)行SoC設(shè)計(jì)。所設(shè)計(jì)的SIE核在FPGA開(kāi)發(fā)板上經(jīng)過(guò)驗(yàn)證。
關(guān)鍵詞: 串行接口引擎;通用串行總線;片上系統(tǒng);微控制器
憑借著每年超過(guò)20億新單元的安裝速度,通用串行總線USB(Universal Serial Bus)如今已成為最為流行的計(jì)算機(jī)接口。只要與計(jì)算機(jī)打交道,人們的日常生活已經(jīng)離不開(kāi)USB端口,通過(guò)它們?nèi)藗兛膳c鼠標(biāo)、鍵盤(pán)、掃描儀、數(shù)碼相機(jī)、手機(jī)和平板電腦等人們想象的到的設(shè)備相連接。USB憑借可靠、高速、方便和省電的優(yōu)點(diǎn),已經(jīng)廣泛得到主要的操作系統(tǒng)的支持。
目前大多數(shù)的USB設(shè)計(jì)都是進(jìn)行系統(tǒng)集成,采用現(xiàn)成商用的USB芯片進(jìn)行開(kāi)發(fā),并沒(méi)有涉及到對(duì)IP核的設(shè)計(jì)與開(kāi)發(fā)。本文通過(guò)分析USB 2.0協(xié)議,使用Verilog HDL 硬件描述語(yǔ)言設(shè)計(jì)實(shí)現(xiàn)了一個(gè)USB 2.0設(shè)備控制器串行接口引擎SIE(Serial Interface Engine)核,選取MC8051軟核作為其微控制器,并通過(guò)Wishbone片上總線進(jìn)行連接。
1 USB 2.0設(shè)備控制器系統(tǒng)設(shè)計(jì)
1.1 系統(tǒng)設(shè)計(jì)
根據(jù)USB 2.0設(shè)備控制器所要實(shí)現(xiàn)的功能,本系統(tǒng)采用自頂向下(Top-to-Down)的設(shè)計(jì)結(jié)構(gòu),將設(shè)備控制器劃分為7個(gè)主要功能模塊:物理層收發(fā)器(USB PHY)、UTMI接口、協(xié)議層PL(Protocol Layer)、RAM緩沖區(qū)、存儲(chǔ)器接口和仲裁器、控制和狀態(tài)寄存器及功能總線接口。
USB 2.0 IP核結(jié)構(gòu)框圖如圖1所示。SIE部分的SSRAM、功能總線接口、PHY模塊為可更改的,通過(guò)對(duì)相應(yīng)模塊的更改可使本IP滿(mǎn)足不同應(yīng)用的需求。最下面接口用于連接微控制器)。
由于USB 2.0串行總線上最高速率高達(dá)480 MHz,遠(yuǎn)高于Standard Cell電路的處理能力,因此需要全定制的Transceiver來(lái)進(jìn)行數(shù)據(jù)恢復(fù)。PHY的主要作用是將接收來(lái)的差分信號(hào)進(jìn)行NAZI編碼和位填充[2]。
1.2 各模塊具體實(shí)現(xiàn)
UTMI接口是與PHY相連接的接口模塊,它并不對(duì)輸入和輸出的數(shù)據(jù)進(jìn)行處理,主要用于控制總線掛起/恢復(fù)模式和全速/高速模式的切換。
協(xié)議層PL是USB設(shè)備控制器中最核心的模塊,它負(fù)責(zé)所有的USB數(shù)據(jù)I/O和通信的控制,其中包括DMA和內(nèi)存接口、協(xié)議引擎PE(Protocol Engine)、組包PA(Packet Assembly)和解包PD(packet Disassembly)幾個(gè)子模塊。PL內(nèi)部框架如圖2所示。
PA和PD模塊分別是對(duì)USB包進(jìn)行裝配和拆分。DMA和內(nèi)存接口是PE模塊到內(nèi)存的接口,它提供了直接的內(nèi)存訪問(wèn)(Direct Memory Access)和DMA塊傳輸。協(xié)議引擎PE是PL中的核心模塊,PE處理所有標(biāo)準(zhǔn)USB協(xié)議握手和控制通信,包括SOF標(biāo)記、應(yīng)答(ACK、NACK和NYET)以及對(duì)PING標(biāo)記的回答。PE模塊將端點(diǎn)控制狀態(tài)寄存器(CSR)的值解碼成內(nèi)部控制信號(hào)線,將端點(diǎn)緩沖區(qū)(Buffer)寄存器EP_BUF的值解碼成Buffer的大小和指針。圖3描述了PE核心的基本操作。USB設(shè)備總是等待一個(gè)來(lái)自USB總線主機(jī)的標(biāo)記包,才開(kāi)始執(zhí)行其他的操作。一旦接收到標(biāo)記包,解包模塊將對(duì)其解碼,PE執(zhí)行合適的操作。USB主循環(huán)根據(jù)標(biāo)記包的不同將操作分為特殊包處理、Setup循環(huán)、IN數(shù)據(jù)循環(huán)和OUT數(shù)據(jù)循環(huán)。
存儲(chǔ)器接口和仲裁器實(shí)際上就是一個(gè)2選1的選擇器,選擇SRAM與Wishbone總線(及連接微控制器)還是SRAM與PL層的DMA內(nèi)存接口連接。
2 微控制器模塊
2.1 MC8051主要特性
在USB的通信過(guò)程中,微控制器主要用來(lái)處理各種中斷,識(shí)別主機(jī)發(fā)送的是何種請(qǐng)求,返回相應(yīng)的數(shù)據(jù),從而完成設(shè)備的枚舉和之后的數(shù)據(jù)傳輸。本設(shè)計(jì)采用了MC8051的IP軟核,該IP滿(mǎn)足USB對(duì)微控制器功能的要求。通過(guò)修改MC8051中的固件(Firmware)來(lái)對(duì)SIE的寄存器進(jìn)行配置,以實(shí)現(xiàn)USB 2.0設(shè)備控制器不同的功能。
2.2 8051與USB 2.0 IP核的連接
由于SIE與MC8051使用不同的時(shí)鐘域(SIE使用PHY提供的60 MHz時(shí)鐘,而MC8051使用自身的時(shí)鐘),并且MC8051是個(gè)通用的IP核,其接口并沒(méi)有采用本USB 2.0 IP核的Wishbone兼容接口,而且MC8051是個(gè)8 bit的通用MCU(處理數(shù)據(jù)寬度是8 bit),因此MC8051和本USB 2.0 IP核不能直接相連。
本文設(shè)計(jì)了一個(gè)與Wishbone總線兼容的接口轉(zhuǎn)換模塊,以使MC8051能正確地連接在Wishbone總線上,完成與SIE的數(shù)據(jù)傳輸。轉(zhuǎn)換模塊主要實(shí)現(xiàn)了跨時(shí)鐘域的數(shù)據(jù)傳輸、數(shù)據(jù)位數(shù)轉(zhuǎn)換(8 bit到32 bit和32 bit到8 bit)以及Wishbone總線兼容信號(hào)的加入。實(shí)際上完成了一個(gè)異步FIFO的功能,但比FIFO使用起來(lái)更加靈活,因?yàn)?051執(zhí)行每條指令會(huì)有一定的指令延時(shí),如果使用FIFO,很難保證SIE可以正確的接收到數(shù)據(jù)。跨時(shí)鐘域的數(shù)據(jù)傳輸主要體現(xiàn)在SIE和微控制器之間,SIE主要使用PHY提供的60 MHz的時(shí)鐘,而微控制器MC8051的工作頻率不超過(guò)40 MHz。為了防止跨時(shí)鐘域的數(shù)據(jù)傳輸容易產(chǎn)生的亞穩(wěn)態(tài),在接口轉(zhuǎn)換模塊里采用了“超前送數(shù)”的策略,即MCU讀寫(xiě)命令在有效信號(hào)到達(dá)之前把數(shù)據(jù)放入三態(tài)數(shù)據(jù)端口寄存,讀寫(xiě)信號(hào)到達(dá)之后進(jìn)行數(shù)據(jù)傳輸。
微控制器與SIE之間的數(shù)據(jù)交換可以分為寫(xiě)入地址與數(shù)據(jù)和寫(xiě)地址并讀數(shù)據(jù)兩種方式,分別對(duì)應(yīng)著USB固件中兩種最基本的命令函數(shù)。連接轉(zhuǎn)換模塊通過(guò)狀態(tài)機(jī)來(lái)進(jìn)行控制,接收到數(shù)據(jù)后隨即進(jìn)行數(shù)據(jù)和地址的轉(zhuǎn)換,并將轉(zhuǎn)換好的數(shù)據(jù)和地址存入寄存器中。轉(zhuǎn)換完成后進(jìn)入WE狀態(tài),進(jìn)行判斷。如進(jìn)行寫(xiě)入地址與數(shù)據(jù)則進(jìn)入到WE_AD狀態(tài),該狀態(tài)會(huì)將Wishbone總線的控制位CYC、STB和WE置高同時(shí)輸出轉(zhuǎn)換好的地址與數(shù)據(jù);寫(xiě)地址并讀數(shù)據(jù)則進(jìn)入WE_A,該狀態(tài)將控制位CYC與STB置高,WE為低表示讀過(guò)程,同時(shí)輸入要讀數(shù)據(jù)的地址,WE_A過(guò)后就進(jìn)入RE_DATA讀取數(shù)據(jù)并輸出。
數(shù)據(jù)位數(shù)轉(zhuǎn)換的原理實(shí)際上很簡(jiǎn)單,采用標(biāo)志位對(duì)其進(jìn)行區(qū)分,如圖4所示。其中,WE是寫(xiě)入信號(hào),低電平有效;flag為2 bit的標(biāo)志位;done是轉(zhuǎn)換完成信號(hào);datain和dataout分別是8 bit輸入信號(hào)和轉(zhuǎn)換好的32 bit輸出信號(hào)。8 bit轉(zhuǎn)32 bit的過(guò)程為:在flag為00、01、10、11每段分別向datain中寫(xiě)入1個(gè)8 bit數(shù)據(jù),最先寫(xiě)入的為低8 bit,然后是次8 bit,依次寫(xiě)完。等到done信號(hào)置高后,再按照Wishbone總線數(shù)據(jù)的操作方式進(jìn)行傳輸。32 bit數(shù)據(jù)轉(zhuǎn)8 bit與該過(guò)程相反。
該連接模塊已成功通過(guò)FPGA驗(yàn)證,能夠正確轉(zhuǎn)換與傳輸數(shù)據(jù)。
3 系統(tǒng)驗(yàn)證
3.1 FPGA驗(yàn)證環(huán)境搭建
本文選用Xilinx公司的Virtex-II Pro FPGA開(kāi)發(fā)板作為驗(yàn)證USB 2.0 SIE核的平臺(tái)。選用Cypress公司的CY7C68000芯片作為前端的收發(fā)器(PHY),將USB總線上480 MHz的串行數(shù)據(jù)流轉(zhuǎn)換成8 bit 60 MHz的并行數(shù)據(jù)。系統(tǒng)測(cè)試平臺(tái)架構(gòu)如圖5所示。
CY7C68000與FPGA開(kāi)發(fā)板之間采用100腳Hirose FX2擴(kuò)展插槽相連接,該接口有LVCMOS25的HS_CLKIN高速時(shí)鐘輸入的接口來(lái)作為收發(fā)器PHY_CLK 60 MHz時(shí)鐘的引入。緩沖區(qū)使用ISE軟件自帶的RAM IP核。本設(shè)計(jì)使用ISE 10.1.03對(duì)USB SIE模塊綜合后的FPGA資源使用情況為:Slices數(shù)為1 718個(gè),Slice Flip Flops數(shù)為1 801個(gè),4輸入LUT數(shù)為2 885,最大時(shí)鐘頻率為127.583 MHz,滿(mǎn)足了USB 2.0設(shè)備控制器工作所需的60 MHz時(shí)鐘要求。
3.2 結(jié)果和分析
將程序下載到FPGA實(shí)驗(yàn)板上后,將收發(fā)器CY7C68000連到主機(jī),主機(jī)馬上會(huì)出現(xiàn)一個(gè)“檢測(cè)到新硬件”的消息。這表示設(shè)備枚舉過(guò)程的完成,枚舉就是從設(shè)備讀取一些信息,了解是什么樣的設(shè)備,如何進(jìn)行通信,這樣主機(jī)就可以根據(jù)這些信息來(lái)加載合適的驅(qū)動(dòng)程序。枚舉過(guò)程屬于控制傳輸,一般分為3個(gè)階段,具體過(guò)程如下。
?。?)建立階段。建立階段如圖6所示,USB主機(jī)首先發(fā)送來(lái)一個(gè)SETUP令牌包,PID為0x2d,設(shè)備地址為0x00,端點(diǎn)0x10(控制端點(diǎn))。后面緊跟一個(gè)數(shù)據(jù)包,PID為0xc3是DATA0的數(shù)據(jù)包,后面的數(shù)據(jù)0x80 0x06 0x00 0x01 0x00 0x00 0x40 0x00表示這是一個(gè)Get_Descriptor標(biāo)準(zhǔn)設(shè)備請(qǐng)求的數(shù)據(jù)包。USB設(shè)備收到并檢測(cè)無(wú)誤之后會(huì)返回一個(gè)ACK(PID為0xd2)握手包告訴主機(jī)已收到數(shù)據(jù)。
?。?)數(shù)據(jù)階段。主機(jī)會(huì)發(fā)出一個(gè)IN包,如圖7所示,PID為0x69,設(shè)備收到IN包后用數(shù)據(jù)包DATA1(PID為0x4b)返回它自己的設(shè)備描述符,描述符里有該設(shè)備自身特性的信息。主機(jī)收到數(shù)據(jù)包后會(huì)返回一個(gè)ACK握手包(PID為0xd2),表示數(shù)據(jù)接收正確。
(3)狀態(tài)階段。主機(jī)會(huì)發(fā)出OUT包,但與數(shù)據(jù)階段不同,狀態(tài)階段所發(fā)數(shù)據(jù)包內(nèi)容為空。設(shè)備收到數(shù)據(jù)包后返回一下ACK握手包表示枚舉過(guò)程的結(jié)束。
本文提出的USB 2.0設(shè)備控制器IP的架構(gòu)具有強(qiáng)的實(shí)用性和復(fù)用性。它既可以作為單獨(dú)的設(shè)備芯片使用,也可與其他IP一起進(jìn)行SoC設(shè)計(jì),只需在片上總線上添加相應(yīng)的模塊。單獨(dú)設(shè)計(jì)的接口轉(zhuǎn)換模塊成功完成內(nèi)嵌8051微控制器核的設(shè)計(jì),也可以利用該模塊外接一個(gè)51系列微控制器,具有很強(qiáng)的靈活性。在操作系統(tǒng)上添加相應(yīng)的驅(qū)動(dòng)程序即可進(jìn)行數(shù)據(jù)傳輸?shù)膶?shí)驗(yàn)。
參考文獻(xiàn)
[1] Universal serial bus specification(Rev 2.0)[S]. www.usb.org, 2002.4.
[2] USB 2.0 transceriver macrocell interface(UTMI) Specification (Version 1.05)[S].2001.3.
[3] 周立功.USB 2.0與OTG規(guī)范及開(kāi)發(fā)指南[M].北京:北京航空航天大學(xué)出版社,2004.
[4] AXELSON J.USB開(kāi)發(fā)大全[M].北京:人民郵電出版社,2011.