龔鋒, 焦繼業, 閔嘉維
(西安郵電大學 計算機學院,西安 710061)
通用串行總線(Universal Serial Bus,簡稱USB)具有即插即用、兼容性好、高擴展性等優點,傳輸數據高效可靠,在嵌入式系統中得到了廣泛應用。自Cypress推出全球第一顆USB控制芯片以來,各大公司紛紛搶奪市場,當前USB控制芯片市場幾乎被Cypress、Philips等歐美廠商壟斷[1],揚智科技是國內為數不多能夠自產USB控制芯片的公司,因此研究USB控制器不僅可以掌握核心技術,還可以創造可觀的經濟效益。
本文的USB2.0設備控制器基于嵌入式SoC系統,Cortex-M0處理器控制USB通信,AHB Lite總線實現Cortex-M0處理器和USB控制器的互聯。眾多設計者選用8051作為主控芯片[2],Wishbone總線作為連接結構。Cortex-M0處理器與8051處理器相比,Cortex-M0處理器性能優越,面積與8051處理器相當。AHB Lite總線與Wishbone總線相比,AHB Lite總線支持流水線操作[3],指令執行效率更高。本文優化了USB控制器,經過FPGA驗證,USB控制器能夠高效進行USB數據傳輸,可廣泛應用于嵌入式SoC系統設計中。
USB2.0設備控制器采用自上而下的模塊化設計方法,使用Verilog硬件描述語言建立硬件模型,USB控制器主要用來驅動事務傳輸,對數據進行協議處理。USB控制器架構,如圖1所示。
串行接口引擎負責底層協議處理,對USB包進行NRZI(No Return Zero-Inverse)編碼/譯碼,位填充/去填充,CRC(Cycle Redundancy Check)校驗。SRAM控制器獲取端點的FIFO(First Input First Output) 指針,將FIFO指針轉換成SRAM地址,此外產生訪問SRAM的控制信號。端點控制單元傳遞事務傳輸的控制信號,Cortex-M0處理器依靠微處理器接口訪問USB控制器的控制/狀態寄存器和每個端點的FIFO。USB包交換成功后端點產生中斷請求,USB控制器進入中斷。
為縮短開發周期,本設計選用仙童半導體的USB1T11A作為USB設備控制器系統的PHY,如圖2所示。

圖1 USB2.0設備控制器架構

圖2 PHY邏輯結構
USB1T11A支持全速和低速USB事務傳輸,SPEED引腳置“0”選擇低速傳輸,SPEED引腳置“1”選擇全速傳輸[4]。
(1)串行接口引擎(SIE)
串行接口引擎由PHY接口和協議層構成,如圖3所示。

圖3 SIE結構
PHY接口與PHY物理層交換USB包,協議層組織、解析USB包。
USB控制器的工作主頻為48 MHz,最大傳輸速率是12 Mbps。PHY接口對發送的數據進行位填充,NRZI編碼,添加同步域和包結束標識[5];對接收的數據進行NRZI解碼,去位填充,識別同步域,檢測包結束標識。移位寄存器負責數據的并串/串并轉換。根據USB數據總線電平以及電平持續時間,PHY接口檢測同步域、包結束等總線信號和復位、空閑、連接、斷開、掛起、喚醒等總線狀態。在總線周轉時間內,數據接收端不返回應答信號將導致總線等待超時出錯。
協議層相當于USB控制器的“心臟”,是USB通信的關鍵模塊。協議引擎選擇當前事務的操作端點,控制組包模塊和解包模塊處理USB事務。組包模塊從數據緩沖區中讀取要發送的數據,并加上PID(Packet Identifier)和CRC校驗碼[5],組成一個完整的USB包發送到PHY接口。解包模塊解析接收到的USB包,提取出有效數據保存到數據緩沖區。由于本設計的應用場景主要針對輕量級嵌入式系統,同時為了降低硬件復雜度,因此沒有引入內部DMA(Direct Memory Access)模塊。
協議引擎的事務處理狀態,如圖4所示。

圖4 協議引擎狀態機
需要注意的是在USB的4種傳輸類型中,同步傳輸沒有應答包。
(2)端點與寄存器
本文的USB控制器共有5個端點,端點地址從0到4。端點0的FIFO尺寸固定在64字節,它是默認的雙向控制端點,在控制傳輸中主機從端點0獲取設備的主要描述符。端點1-4的FIFO尺寸最大為64字節,其他情況下可自由配置成8字節、16字節、32字節,這4個端點僅支持單向傳輸,按照主機的傳輸要求配置成IN型或者OUT型。
USB控制器的寄存器分為端點控制/狀態寄存器和FIFO寄存器,協議引擎實時更新端點控制/狀態寄存器。端點控制寄存器包括FADDR功能地址、INTRTx發送中斷、INTRRx接收中斷、COUNTx字節計數、MAXP 信息包最大尺寸、FIFOSIZE等寄存器,狀態寄存器CSRx反映端點當前所處的工作狀態,FIFO寄存器對應5個端點的先入先出隊列。
(3)數據緩沖區與仲裁器
數據緩沖區即端點FIFO,本設計采用雙緩沖區結構,USB的4種傳輸類型共享數據緩沖區,發送和接收的數據分別存儲在發送緩沖區與接收緩沖區,SRAM控制器根據數據傳輸方向選擇緩沖區。
當協議層或Cortex-M0處理器的任何一方需要訪問SRAM時,仲裁器經過仲裁給出訪問權限,USB控制器的優先級大于Cortex-M0處理器。如果協議層和Cortex-M0處理器同時訪問SRAM,仲裁器掛起Cortex-M0處理器。
(4)USB與AHB Lite總線的互連
USB控制器和Cortex-M0處理器的時鐘信號不同步,數據位寬不同,兩者不能直接通信。AHB Lite總線橋設計,如圖5所示。
總線時鐘HCLK為96 MHz,USB控制器時鐘FCLK為48 MHz,兩個時鐘信號同時進入AHB Lite異步時鐘橋,時鐘橋內部的時鐘同步模塊有效解決時序問題。利用“字節拆分”的方法轉換數據位寬,Cortex-M0處理器的32位數據拆分成4個字節數據,按照從低字節到高字節的順序依次發送出去,USB控制器判斷端點狀態寄存器的相關標志位讀取字節數據。
Cortex-M0處理器提供操作地址和控制信號,AHB Lite總線將USB控制器配置成Slave從機,Cortex-M0處理器使能總線地址,總線數據AHB_HWDATA賦值給輸出信號CortexM0_DI。CortexM0_ACK置“1”,總線以小端模式讀取并鎖存輸入信號CortexM0_D0。CortexM0_NINT置“0”,Cortex-M0處理器執行中斷服務程序,處理數據緩沖區中的數據。AHB Lite異步時鐘橋實現了USB控制器和Cortex-M0處理器的互聯通信,使得Cortex-M0處理器能夠讀寫USB控制器內部寄存器,訪問數據緩沖區。

圖5 AHB Lite總線橋設計
(5)Cortex-M0處理器
Cortex-M0是ARM公司在2009年推出的一款32位RISC處理器,采用3級流水線操作[6]。該處理器邏輯門數少,代碼密度高,中斷處理能力強,最大特點是超低功耗設計,在不到12K門的面積內功耗僅有85 μW/ MHz,生產商能以8位的成本創造出32位的性能。
USB控制器掛接在SoC系統中,采用Xilinx Vivado工具綜合出門級網表電路,選用Xilinx XC7K410T FPGA開發板作為驗證平臺,開發板上集成USB1T11A PHY芯片。FPGA內部的Cortex-M0內核運行速度為96 MHz,USB控制器運行速度為48 MHz,PC作為主機發出事務請求,USB控制器產生應答并返回USB包,Cortex-M0內核控制USB數據傳輸,驗證平臺,如圖6所示。

圖6 FPGA驗證平臺
為檢驗USB控制器的事務傳輸是否符合USB數據傳輸標準,使用數字示波器采樣USB數據總線波形進行驗證。主機獲取設備描述符的過程屬于控制傳輸,控制傳輸包括建立階段、數據階段和狀態階段,建立階段的采樣波形,包括令牌包、數據包和握手包的波形,如圖7所示。
圖7中,USB采用差分傳輸,通道1為D+數據線波形,通道2為D-數據線波形,D+和D-的幅值相同,相位相反。此處對D+數據線的USB包做NRZI解碼操作,得出數據包的8個字節數據為“01 60 00 80 00 00 02 00”,由于USB包先發送最低位,最后發送最高位,所以主機發送的原始數據為“80 06 00 01 00 00 40 00”。主機選取設備的端點0進行控制傳輸,然后發出GET DESCRIPTOR命令,請求設備返回64字節長度設備描述符,設備自動應答,返回ACK握手包。在數據階段,設備返回設備描述符。在狀態階段,主機發送0長度數據包,設備返回ACK握手包表示數據傳輸成功并結束控制傳輸。主機陸續發送標準請求,USB設備返回各類描述符,USB設備枚舉成功。

圖7 建立階段波形采樣
本文設計的USB2.0設備控制器集成在Cortex-M0 SoC處理器內,通過軟件驅動實現USB通信。實驗證明,Cortex-M0 SoC處理器加載USB2.0設備驅動程序可以實現控制傳輸、批量傳輸、中斷傳輸和同步傳輸。USB控制器硬件電路實現簡單,開發成本低,AHB Lite總線橋增強了軟核的可移植性,有助于兼容其他IP核進行SoC開發。為了進一步研究,本文后期工作將實現高速USB2.0數據傳輸。