趙 靜 , 劉衛東 ,2
(1.中國海洋大學 信息科學與工程學院,山東 青島 266100;2.海信電器股份有限公司 山東 青島 266071)
隨著便攜式設備的廣泛使用,移動存儲設備被廣泛用于信息存儲和傳輸。在目前諸多存儲設備中,U盤憑借其體積小、容量大、攜帶方便、支持熱插拔等諸多優點,得到了迅速的普及。而且隨著USB技術的廣泛應用,在各種SoC系統中集成USB功能也成為一種必然趨勢。所以對SoC芯片中集成USB接口的研究開發,具有較高的實用價值。
文中通過分析USB[1]協議,設計出了一種符合該協議的低速和全速的USB設備控制器,并將該控制器與8051CPU核,NandFlash,UDC_Control通過總線連接起來,組成了一個U盤SoC系統,并對此U盤SoC系統加以仿真驗證。
現在的USB控制器主要有兩種:帶USB接口的單片機(MCU)和純粹的USB接口芯片。純粹的USB接口芯片僅處理USB通信,必須有一個外部微處理器來進行協議處理和數據交換。帶USB接口的單片機從應用上又可以分成兩類,一類是從底層設計專用于USB控制的單片機;另一類是增加了USB接口的普通單片機,這類USB控制器的最大好處在于開發者對系統結構和指令集非常熟悉,開發工具簡單,但價格比較高,不利于產品升級和改型。
根據上述情況,文中介紹了一種U盤SoC設計:將CPU和USB CORE通過UDC_Control模塊連接起來,再加上NandFlash模塊,通過總線連接組成一個SoC系統。其整體框圖如下圖1所示。

圖1 U盤SoC的整體框圖Fig.1 Frame diagram of SoCof USB flash disk
此模塊為該設計的核心模塊,實現USB1.1總線接口層設備控制器的功能,是本文設計的重點。USB設備控制器[2]的架構框圖如圖2所示,rxdp、rxdm為從主機發送過來的信號,txdp、txdm為USB模塊發送給主機的信號。其中MCU通過控制SIE來對USB設備進行控制。如圖2所示,本設計分為6個模塊。下面分別介紹各個模塊。

圖2 USB設備控制器的架構框圖Fig.2 Frame diagram of USB device controller
2.1.1 rx模塊
rx 模塊是總線接收模塊,實現USB數據傳輸接收物理層的功能,把串行的USB數據去掉數據包頭,進行NRZI解碼,去掉填充位,并將串行的數據轉換成并行的8位數據。然后將數據送往下一模塊處理。本模塊又分為dpll、解碼和總線狀態監測模塊。如圖3所示。

圖3 rx模塊框圖Fig.3 Block diagram of rx module
dpll模塊用48 MHz的時鐘把總線上傳輸的時鐘和數據信號恢復出來。用48 MHz的時鐘對總線上的數據信號進行采樣,以去掉抖動,然后產生總線信號電平變化的指示信號change信號,change信號的改變可控制采樣點,從而保證數據信號的采樣點固定在每位數據信號的中央。
NRZI解碼模塊檢測到同步頭后,根據NRZI的原理,將rxdp和rxdp延后一拍的數據進行同或操作,得到的數據經過去填充位,串并轉換后,送入解包模塊。
總線狀態監測模塊監測總線的狀態,置位suspend,resume,reset等狀態指示信號。若Idle時間超過3ms時,就將suspend信號置高,在suspend狀態時檢測到總線信號變化時,將resume信號置高,若 se0時間超過 2.5μs時,就將reset信號置高。
2.1.2 解包模塊
本模塊接收從rx模塊送過來的并行數據,按照USB數據包協議規范對接收的數據進行解釋,并對數據做CRC校驗,給出當前接收包的類型,根據不同類型的包的結構,從包中解出相應的信息送給下一模塊。
2.1.3 req_dec模塊
本模塊對setup階段USB的標準請求進行解釋,提供和USB請求相關的信號給SIE模塊,判斷function和endpoint的地址是否合法。若標準請求中對某個端點所請求的操作和預定的不符,則會產生錯誤信號。
2.1.4 SIE模塊
SIE(Serial Interface Engine)模塊是 USB CORE的核心模塊[3],根據從解包模塊傳送過來的信號與從MCU傳送過來的接口握手信號,按照USB的相關協議,產生打包模塊的控制信號和MCU的控制信號,從而控制總線上的數據發送。
控制傳輸的實現:
SETUP階段:從圖4中可看出,當token_valid_i、Pid_setup、ep0_sel有效時,表明收到一個有效的令牌包,udc_as_o被拉高,表示開始數據傳送,轉入ctrl_setup_stage狀態,此時cpu把device_bufok_i信號拉高,隨后開始接收數據,在setup階段8個字節的標準請求數據接收完成后,send_hdsk_pkt_o信號變高,表示數據接收正確,要求發送一個ACK的握手包。

圖4 SETUP階段數據包傳送實現的狀態機Fig.4 State machine of data packet transmission in setup stage
DATA階段:數據階段是可選的,并且數據階段的傳送方向可以是IN或OUT。以IN為例來介紹,當Pid_in、token_valid_i、ep0_sel有效時,udc_as_o被拉高,表示開始數據傳送,轉入ctrl_in_stage_empty,接著轉入ctrl_in_stage狀態,CPU將device_bufok_i拉高,表示開始接收數據,等待數據傳完后,send_hdsk_pkt_o信號變高,表示數據接收正確,并將toggle機制翻轉,要求打包模塊發送一個ACK的握手包。
STATUS階段:STATUS階段也分為STATUS IN和STATUSOUT兩種情況。在STATUSOUT階段,接受到HOST發送過來的空數據包后,狀態機會將send_hdsk_pkt_o信號拉高,發送ACK包給HOST。其狀態機同SETUP狀態機類似。
中斷、批量、同步傳輸的IN實現:在硬件設計上,中斷、批量和同步3種傳輸方式的處理都是一樣的[4],只是在系統配置時,各傳輸方式對應的端點不同。下面以3種傳輸方式的IN傳輸來介紹。圖5為3種傳輸方式的IN傳輸的狀態機。

圖5 中斷、批量、同步傳輸的IN傳輸狀態機Fig.5 State machine of Interrupt、Bulk、Isochronous IN transactions
從上圖可看出,在收到IN令牌后,狀態機將udc_as_o拉高,表示開始傳送數據,轉入In_transfer_empty狀態,再轉入In_transfer狀態,cpu若能傳送數據,則把device_buf_ok_i信號置高,開始接收數據,等待數據傳送完畢時,狀態機會將send_data_pkt_o拉高,將此信號送至打包模塊,從而將所需要的數據發送給HOST。
2.1.5 打包模塊
本模塊接收從SIE傳來的控制信號,根據USB協議,產生所需要的包傳送給發送模塊。
2.1.6 tx模塊
tx模塊是總線發送模塊。它將打包模塊發送過來的包信息,進行并串轉換,位填充,NRZI編碼后,將數據發送給主機。此模塊同rx模塊類似,不再贅述。
此設計中的CPU[5]為一個驗證過的IP核。它包含:1個8位中央處理器、1個片內振蕩器及時鐘電路、4 KB ROM程序存儲器、128B RAM數據存儲器、可尋址64 KB外部數據存儲器和64 KB外部程序存儲器的控制電路、32條可編程的I/O線(4個8位并行I/O接口)、2個16位的定時/計數器、1個可編程全雙工串行接口、5個中斷源、2個優先級嵌套中斷結構。將USB的通信請求接入到CPU的一個外部中斷接口上,當USB的通信請求到來時,系統會產生一個中斷,轉入中斷服務程序。
此外,還需要設計一個CPU的固件firmware,實現USB CORE的上電初始化過程 (向UDC_Control中的控制寄存器和狀態寄存器寫入初始數據)、USB CORE中斷處理并完成USB傳輸事務、使設備擺脫異常狀態等功能。
UDC_Control模塊位于CPU和USB CORE之間,它完成CPU對USB通信的控制和數據的讀寫操作。UDC_CTRL模塊中設有22個特殊功能寄存器,來完成USB通信。
USB_INT1和USB_INT2為中斷寄存器,其各個位分別表示USB通信的9種中斷請求 (剩下的位為保留位),但USB CORE一次只能向CPU提供一個中斷信號,這兩個USB_INT寄存器供軟件在進入中斷后查詢是USB的何種中斷。EP0_CTRL、EP0_INFIFO_DATA、EP0_INFIFO_CNT、
EP0_OUTFIFO_DATA、EP0_OUTFIFO_CNT這 5個寄存器都是與Endpoint0相關的,Endpoint0是由一個輸入端點和一個輸出端點組成,用來實現控制傳輸。所有支持USB標準請求和Class定義的請求都通過這個端點來處理。其中EP0_CTRL用來對Endpoint0的傳輸進行控制,當CPU要向USB主機傳送數據時,就會將數據寫入EP0_INFIFO_DATA,EP0_INFIFO_CNT是CPU向EP0_INFIFO_DATA中寫入數據的 字 節 數 。 EP0_OUT ,Endpoint1,Endpoint2,Endpoint3,Endpoint4的寄存器情況類似,在此不再多做介紹。UDC_STATUS和DEVICE_CTRL是接口狀態和控制寄存器,對CPU和USB CORE的通信進行監控。
針對NandFlash讀寫的特點,特別是其可隨機讀,但無法隨機寫的問題,需要通過設置緩沖區來解決。在與USB Host進行數據交換的過程中,最小的單位是扇區:512字節。由于NandFlash在寫之前必須先擦除,而一擦又必須擦一個Block,因此在擦除某Block之前必須保存同一個Block中有關扇區的數據。因此,如果每收到一個扇區的內容就進行一次擦、保存、寫的操作,系統任務將十分繁重,無法及時響應USB Host端的請求。因此,在系統中設置32K的緩沖區,每完一次數據傳輸后,記下本次要寫的開始扇區和總扇區數,將本次要寫的數據涉及的扇區以外的數據從NandFlash中讀出來,存放在緩沖區中對應位置,然后擦除一個Block,再將緩沖區中內容一次全部重新寫入NandFlash。
為了驗證此設計,需要建立一個和實際應用情況類似的仿真驗證平臺,這個仿真系統平臺包括USB CORE的RTL代碼[6]、CPU核、控制軟件的二進制代碼、UDC_Control、NandFlash、USB Host的仿真模型等。整個系統的Modelsim仿真環境如圖6所示。

圖6 設計的Modelsim測試平臺Fig.6 Diagram of Modelsim simulation environment of this design
USB HOST的仿真模型用來模擬PC機上的主機控制器,完成上電檢測、標準設備請求、批量傳輸請求等功能,用來檢測USB設備應答數據是否正確。負責讀取主控制器的事務處理列表,并將它們安排在一系列長度的幀中,發送到USB總線上。
通過此測試平臺,成功的完成了USB主機與U盤SoC之間的通信。仿真圖如圖7所示。

圖7 仿真圖Fig.7 Figure of simulation
從仿真圖中可以看出,通過控制傳輸對設備進行了復位、獲取設備描述符、配置地址等操作。接著進行了一個bulk out和bulk in傳輸。主機準確的將數據寫入了NandFlash,并且正確的將數據讀出。仿真表明,設計的結果滿足了USB設備控制器的規格要求。
文中探討了U盤SoC的設計,并結合仿真工具通過了RTL級仿真,證明了本設計的可行性。該U盤SoC設計具有便于修改、易于實現的特點。
[1]周立功.USB2.0與OTG規范及開發指南[M].北京:北京航空航天大學出版社,2004.
[2]邊海龍,賈少華.USB2.0設備的設計與開發[M].北京:人民郵電出版社,2004.
[3]李美峰,戴冠中,胡偉.USB2.0設備控制器IP核的設計與實現[J].計算機測量與控制,2008(12):1943-1944,1956.LI Mei-feng,DAI Guan-zhong,HU Wei. Design and implementation of a high-speed USB device controller IP core[J].Computer Measurement&Control,2008(12):1943-1944,1956.
[4]楊先文,李錚,王安.USB1.1設備控制器IP核的設計與實現[J].小型微型計算機系統,2010(11):2300-2304.YANG Xian-wen,LI Zheng,WANG An.Design and implementation of USB1.1 device controller IP core[J].Journal of Chinese Computer Systems,2010(11):2300-2304.
[5]李群芳,肖看.單片機原理、接口及應用[M].北京:清華大學出版社,2005.
[6]夏宇聞.Verilog數字系統設計教程[M].北京:北京航空航天大學出版社,2008.