USB晶元到底完成了哪些工作?
在板級設計中比較意外的是USB通信需要單獨一塊USB控制晶元。請問它具體實現了哪些功能呢。
或者說,不使用晶元,通過FPGA硬編程或者軟程序要自己完成那些工作?
意外發現知乎上還有這麼專業的話題,哈,班門弄斧一下。研究生兩年FPGA學習,入職從事通信SOC晶元,碰巧同事離職,接手USB。半年從完全不懂USB,到完成第兩顆晶元USB2.0前仿後仿驗證,一顆USB3.0前仿後仿驗證,支持第一個顆晶元USB2.0樣片測試,牽頭前同事遺留USB3.0測試。對USB算有些理解了,希望對關注者有幫助。
問題1:上圖,高速模塊一般分為控制器Controller和PHY兩部分,Controller大多為數字邏輯實現,PHY通常為模擬邏輯實現。
USB晶元也分為Controller部分和PHY部分。Controller部分主要實現USB的協議和控制。內部邏輯主要有MAC層、CSR層和FIFO控制層,還有其他低功耗管理之類層次。MAC實現按USB協議進行數據包打包和解包,並把數據按照UTMI匯流排格式發送給PHY(USB3.0為PIPE)。CSR層進行寄存器控制,軟體對USB晶元的控制就是通過CSR寄存器,這部分和CPU進行交互訪問,主要作為Slave通過AXI或者AHB進行交互。FIFO控制層主要是和DDR進行數據交互,控制USB從DDR搬運數據的通道,主要作為Master通過AXI/AHB進行交互。PHY部分功能主要實現並轉串的功能,把UTMI或者PIPE口的並行數據轉換成串列數據,再通過差分數據線輸出到晶元外部。 USB晶元內部實現的功能就是接受軟體的控制,進而從內存搬運數據並按照USB協議進行數據打包,並串轉換後輸出到晶元外部。或者從晶元外部接收差分數據信號,串並轉換後進行數據解包並寫到內存里。問題2:FPGA不使用USB晶元或者硬核的話,必須用FPGA邏輯資源實現圖1圖中Controller部分,外加PHY晶元,軟體再按照協議實現對USB的控制。如果有USB晶元,則只需實現軟體控制部分。軟體控制部分協議USB 1.1 UHCI/OHCI,USB 2.0 EHCI, USB 3.0 XHCI。
1 答:百度關鍵詞 usb specification。就知道USB晶元做了哪些工作了。
2.答:不用USB晶元的話,用FPGA編程可以實現USB1.1功能,USB2.0/3.0等無法實現。因為有一大塊的模擬電路(PHY)在FPGA中無法做。具體怎麼做請看specification。根據你提的問題來看,估計你短時間無法用FPGA或者MCU實現USB功能。還是老老實實的用USB晶元或者帶有USB介面功能的晶元吧。換一個角度來回答,帶usb phy的fpga很多啊,搞一塊來用就好,就是可能比加一塊控制晶元還貴。
其實有些fpga提供的介面多到眼花撩亂……
USB協議看起來簡單,其實非常複雜。有很多細節在裡面。要了解詳細的,你第一可以去下載協議原文來看。不過估計你不會,太長了。第二就是去找這個晶元的DataSheet看看,雖然也很長。如果你想自己在FPGA上實現USB控制器,可以去OpenCore上面找找。當年(2002年),中國好幾個牛逼高校的科研團隊做個USB做了兩年(863專項)。這其實是中國IC設計的起點。
題主這個usb晶元範圍太廣,很難說清楚具體做什麼的,得看到底想做什麼功能。我估摸是像Arthur Wang說的那種usb介面晶元,將PHY(utmi/ulpi)和鏈路層封裝好,然後採用報中斷方式提供給mcu等處理器usb數據,由mcu軟體編程解決應用層,usb主機設備都可以完成。其他人也有說到,直接使用fpga編程PHY不好做,但如又見山人所述,fpga帶PHY多的是,只完成上述usb介面晶元功能綽綽有餘。
當然也有可能像u盤裡面的控制晶元,相當於做了個特定的usb設備,fpga也可以輕鬆搞定。設備千萬種,所以前面才說很難說清楚具體功能。但fpga幾乎無法做出完備的usb主機,如果你的系統具有usb主機功能,那麼大概率就是介面晶元。
下面簡單說一下用fpga實現usb介面晶元功能。在fpga自帶的標準utmi介面幫助下,首先要解決握手功能(不清楚的話請百度),之後進入通信階段,將收到數據包中PID,Data,crc通過中斷方式上報給mcu,告知它收到了什麼類型的PID,Data放在了ram中的地址和長度,crc是否正確,以及是否超時。剩下的應用層,根據PID和Data的內容回復什麼樣的PID和Data都由mcu編程搞定,然後通過寄存器告知發送什麼PID,Data放在哪了等,fpga將這些內容組合成標準包格式送給utmi的ip即可。題主是想從0開始實現一套USB控制器?還是如何操作USB控制器?
怎麼實現控制器可以參考USB規範:USB.org - USB 2.0 Documents,規範就幾百頁,還只是基礎規範,不建議直接搞,上手太慢,意義也不大(除非你真是想學這方面的),做產品的話更不值得,市面上有現成的東西。
如果是想知道控制器怎麼操作,先看一下控制器的類型,PC的一般是:
USB 1.1 UHCI/OHCI
USB 2.0 EHCIUSB 3.0 XHCI常見的是EHCI+UHCI/OHCI這種組合,規範網上都有(不在USB-IF網站,在各個廠商那),下一份研究一下就可以了。
嵌入式還有Synopsis和Mentor Graphics的控制器,到這倆廠商網站上找。
或者如果沒有開源的限制,去看Linux實現也可以。
即使這樣,也不建議直接從頭開始寫USB協議棧,因為USB協議棧很大,一個基本的USB實現需要包含:控制器驅動+Device框架(USBD)+至少一個Class驅動,最精簡的寫法估計也得上萬行,並且還要把這套東西整合到原有系統的設備管理框架里,不值得從頭弄。
供應商給方案就直接拿來用,沒有方案找方案,盡量不考慮從頭寫。一般廠商給方案的時候,都附帶有USB控制器的驅動,二次開發的時候一般寫的都是Class驅動(簡單的情況下幾百行就搞定),有控制器驅動的前提下,可以考慮二次開發。
拿FPGA實現USB這個我沒搞過,直觀感覺是比前面的更複雜,規範就幾百頁,能把人搞死。沒搞過usb,只知道做晶元的時候協議裡面可能就只有幾句話,實現起來可能要好幾個月,當然實現出來的ip賣的也貴,一般的協議都是上百頁吧
USB 目前分為USB1.1/2.0/3.0/3.1,最明顯的區別就是傳輸速率在不停的提升。
如果想了解的比較詳細,可以去下載USB的specification閱讀,在論壇http://bbs.eetop.cn上有很多資料。
USB介面晶元分為兩類,一類是host,一類是slave。
你可以把電腦主機上的usb介面理解為host,U盤介面理解為slave。
為什麼需要一顆單獨的USB控制晶元?
這取決於系統的設計及應用的層面:
如果HOST最終處理數據的是CPU,而一般CPU是沒有USB介面的, CPU的擴展介面都是PCI-E 3.0 ,所以會由晶元組提供USB3.0轉PCI-E的功能。
Slave端拿 U盤舉例, U盤裡的存儲是FLASH,Flash的介面是8bit的,並行的數據介面。那就要把這些數據的傳輸格式轉成USB的傳輸格式。
實現上面兩個功能都要用到USB控制晶元。
USB控制晶元是做什麼的?
USB數據信號是差分信號,是經過編碼的差分信號。控制晶元主要是用來實現接收(RX),發送(TX),編碼,解串等功能。
整個主控晶元分為模擬電路和數字電路兩部分:
模擬電路實現的功能是將接收的信號轉為數字電平(RX),數字電平轉為差分信號發射(TX)。這個過程很複雜,特別是USB信號是沒有時鐘的,只有數據,要從數據中恢復出時鐘,再用時鐘恢複數據。另外信號傳輸的過程是有畸變的,要對信號進行處理,保證能還原信號。
具體的模擬電路模塊有SSCG-PLL , CDR , Clock,RX,TX,EQ , Deserilizer ,Serializer ,elastic buffer 等等。
數字電路就是實現數據的編碼,解串,以及控制模擬電路正確的恢複數據。比如8b/10b decoder,encoder, rx/tx logic , state machine,等等
因為這個要實現這個功能的晶元面積較大,所以不是所有晶元都會集成這個功能,就會有針對特定應用的主控晶元存在。比如在130nm工藝下,一個可以實現USB2.0和USB3.0的PHY,面積就接近1平方毫米。
所以考慮到封裝,晶元引腳數,及晶元面積。不同的應用會有不同的取捨來決定是採用一顆單獨的USB主控晶元還是在某個晶元里集成USB PHY。
想要了解 USB 控制晶元的細節,熟悉協議是必要的。http://113.215.21.34/1Q2W3E4R5T6Y7U8I9O0P1Z2X3C4V5B/http://www.usb.org/developers/docs/usb20_docs/usb_20_033017.zip
http://113.215.21.39/1Q2W3E4R5T6Y7U8I9O0P1Z2X3C4V5B/http://www.usb.org/developers/docs/usb_31_033017.zip
想要掌握協議細節,從頭實現一遍是必要的。
雖然 USB 已經成熟,但在某些成本敏感的場合,多一種替代方案可以提升產品競爭力。
用 IO 實現裸寫 USB 協議,其實不用 FPGA,速度稍快一點的 MCU 就能做到。
像上圖,使用 Atmel 的 AVR 系列 MCU ATtiny 2313,加上必要的外設,總成本不超過 10 RMB 就能實現一個 USB 2.0 低速設備,功能為 USB 轉 RS232 串口。
我們每天都用的 USB 滑鼠/鍵盤/U盤/攝像頭/等介面,線序如下圖所示:
(圖侵刪)
其中有四條線,其中 GND 和 VCC 用於向設備供電(通常 5V,100mA,最大可到 500mA),DATA+ 和 DATA- 用於主機和設備間通信,雙向半雙工方式,即兩根線配合表示一個有效 bit,這個 bit 可能來自主機,也可能來自設備,具體要看時機。
DATA+ 和 DATA- 連接到單片機 IO 口,單片機運行的軟體負責通信協議處理(收到命令,做出應答)。由於晶振頻率為 12 MHz,USB 低速設備通信速率為 1.5Mbps,所以單片機在 8 個 clk cycle 內接收或發送一個 bit,必須使用彙編實現精確的計時。單片機上實現了完整的物理層、協議層。
接收流程圖:
下面是 USB 協議中用到的設備描述符、配置描述符、字元串描述符
;------------------------------------------------------------------------------------------
.equ USBversion =0x0101 ;for what version USB is that (1.01)
.equ VendorUSBID =0x03EB ; vendor identifier (Atmel=0x03EB)
.equ DeviceUSBID =0x21FE ;product identifier (USB to RS232 converter ATmega8=0x21FF)
.equ DeviceVersion =0x0002 ;version number of product (version=0.02)
.equ MaxUSBCurrent =46 ;current consumption from USB (46mA)
;------------------------------------------------------------------------------------------
DeviceDescriptor:
.db 0x12,0x01 ;0 byte - size of descriptor in byte
;1 byte - descriptor type: Device descriptor
.dw USBversion ;2,3 byte - version USB LSB (1.00)
.db 0x00,0x00 ;4 byte - device class
;5 byte - subclass
.db 0x00,0x08 ;6 byte - protocol code
;7 byte - FIFO size in bytes
.dw VendorUSBID ;8,9 byte - vendor identifier (Cypress=0x04B4)
.dw DeviceUSBID ;10,11 byte - product identifier (teplomer=0x0002)
.dw DeviceVersion ;12,13 byte - product version number (verzia=0.01)
.db 0x01,0x02 ;14 byte - index of string "vendor"
;15 byte - index of string "product"
.db 0x00,0x01 ;16 byte - index of string "serial number"
;17 byte - number of possible configurations
DeviceDescriptorEnd:
;------------------------------------------------------------------------------------------
ConfigDescriptor:
.db 0x9,0x02 ;length, descriptor type
ConfigDescriptorLength:
.dw 9+9+7 ;entire length of all descriptors
ConfigAnswerMinus1: ;for sending the number - congiguration number (attention - addition of 1 required)
.db 1,1 ;numInterfaces, congiguration number
.db 0,0x80 ;string index, attributes; bus powered
.db MaxUSBCurrent/2,0x09 ;current consumption, interface descriptor length
.db 0x04,0 ;interface descriptor; number of interface
InterfaceAnswer: ;for sending number of alternatively interface
.db 0,1 ;alternatively interface; number of endpoints except EP0
StatusAnswer: ;2 zero answers (saving ROM place)
.db 0,0 ;interface class; interface subclass
.db 0,0 ;protocol code; string index
.db 0x07,0x5 ;length, descriptor type - endpoint
.db 0x81,0 ;endpoint address; transfer type
.dw 0x08 ;max packet size
.db 10,0 ;polling interval [ms]; dummy byte (for filling)
ConfigDescriptorEnd:
;------------------------------------------------------------------------------------------
LangIDStringDescriptor:
.db (LangIDStringDescriptorEnd-LangIDStringDescriptor)*2,3 ;length, type: string descriptor
.dw 0x0409 ;English
LangIDStringDescriptorEnd:
;------------------------------------------------------------------------------------------
VendorStringDescriptor:
.db (VendorStringDescriptorEnd-VendorStringDescriptor)*4-2,3 ;length, type: string descriptor
VendorStringDescriptorEnd:
;------------------------------------------------------------------------------------------
DevNameStringDescriptor:
.db (DevNameStringDescriptorEnd-DevNameStringDescriptor)*4-2,3;dlzka, typ: string deskriptor
.db "AVR309:USB to UART protocol converter (simple)"
DevNameStringDescriptorEnd:
對於全速(12Mbps)、高速(480Mbps)、SuperSpeed(5Gbps)、SuperSpeedPlus(10Gbps)模式,需要更高速率的器件,或 ASIC,系統成本也會隨之上升。
USB spec 內容還很多,諸如 USB hub,USB Host 等等,實現細節更為複雜。
參考資料:http://www.tuxgraphics.org/common/src2/article08101/avr309.pdf
其實主要包括了兩部分,一部分是usb控制部分,另一部分是usb phy部分,控制部分可以在fpga上做,但是phy就沒發在fpga上做了
為啥要從頭搞這麼成熟的東西?如果是為了學習你一個人也是搞不來的,,如果題主有機會去原廠的話倒是有可能能看到IP核里的東西
推薦閱讀:
※手機為何難以實現與電腦的usb3.0連接?
※20 米長延長線 USB 供電如何解決?
※vga介面和網線介面應該在筆記本電腦上淘汰嗎?
※安卓USB調試能提供多大的許可權?
※為什麼使用電腦給手機充電,中間接一個 USB hub 之後會更快?