新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 一種高速USB設(shè)備控制器IP核的設(shè)計(jì)與實(shí)現(xiàn)

一種高速USB設(shè)備控制器IP核的設(shè)計(jì)與實(shí)現(xiàn)

作者: 時(shí)間:2013-08-31 來源:網(wǎng)絡(luò) 收藏

3.2.3 PL

  協(xié)議層模塊是整個(gè)SIE 的核心,控制著整個(gè)數(shù)據(jù)傳輸。總流程圖如圖4(a)所示。該過程主要有兩個(gè)步驟:第一,檢查PID 的有效性;第二,如果PID 有效,則根據(jù)PID 確定數(shù)據(jù)及傳輸類型。因此該模塊實(shí)際上是4 個(gè)進(jìn)程處理:IN、OUT、SETUP 事務(wù)以及特殊事務(wù)。在具體的模塊設(shè)計(jì)實(shí)現(xiàn)中, 由于解包(Packet disassemble)、打包(Packet assemble)過程在4 個(gè)進(jìn)程中都必不可少,所以統(tǒng)一編寫而在PL 頂層調(diào)用。內(nèi)部狀態(tài)機(jī)的翻轉(zhuǎn)以及復(fù)位都是以事務(wù)為周期,所以實(shí)現(xiàn)起來比較容易。在接收數(shù)據(jù)時(shí),解析出各種令牌以及把數(shù)據(jù)包的內(nèi)容寫入RAM 中, 完畢以后填寫相應(yīng)的接收信息。發(fā)送數(shù)據(jù)時(shí),從RAM 中讀取數(shù)據(jù)并形成正確的數(shù)據(jù)PID。如果是0 長度的數(shù)據(jù),則只有2 個(gè)字節(jié)的全0 CRC16 校驗(yàn)碼。在一個(gè)事務(wù)的握手(handshake)階段,則根據(jù)接收情況提交握手信號。圖4(b)中給出了一個(gè)PID 為IN 令牌包的流程。

  在USB 規(guī)范中,PID 為SETUP 標(biāo)志的控制傳輸也稱作消息(Message)傳輸,其實(shí)際上可以理解成為一種特殊的OUT 傳輸, 主要用來對USB 設(shè)備的配置以及向設(shè)備發(fā)送和數(shù)據(jù)傳輸相關(guān)的命令字。有著固定的格式:以PID[3:0]=1101 的SETUP 令牌包開始的建立階段+數(shù)據(jù)階段+狀態(tài)階段。數(shù)據(jù)階段可以沒有, 如HOST 給設(shè)備下放地址時(shí)的控制傳輸,但是狀態(tài)階段是必需的,以確保傳輸?shù)恼_性。

  3.2.4 MIA

  存儲接口仲裁。存儲管理設(shè)計(jì)的好壞直接影響控制器整體性能,需要謹(jǐn)慎處理。對存儲單元進(jìn)行讀、寫操作者是HOST 與MCU 兩者。設(shè)計(jì)中要注意的是MCU 的讀寫信號與內(nèi)部時(shí)鐘的同步問題,這在后面部分還會進(jìn)一步討論。

  3.2.5 DPRAM 與CSR

  DPRAM 暫存?zhèn)鬏斨惺聞?wù)的數(shù)據(jù), 同時(shí)把該次事務(wù)的接收狀態(tài)信息寫入對應(yīng)的CSR(狀態(tài)控制寄存器)。本設(shè)計(jì)把DPRAM 配置成端點(diǎn)FIFO,共16個(gè), 總?cè)萘繛?K。MCU 的工作是基于中斷的,當(dāng)SIE 給出中斷時(shí),首先會讀出相應(yīng)端點(diǎn)的CSR 從而知道中斷產(chǎn)生的原因以及上次事務(wù)的狀態(tài):成功或失敗。若失敗則進(jìn)入相應(yīng)的中斷例行程序。

  3.3 設(shè)計(jì)中若干問題及其解決

  3.3.1 端點(diǎn)的存儲管理單元(MMU)

  在USB1.x 規(guī)范中,由于數(shù)據(jù)有效載荷較小,純粹意義上的FIFO, 由于不需尋址即可實(shí)現(xiàn)存取操作、邏輯控制簡單等原因而作為端點(diǎn)的最好實(shí)現(xiàn)方法。但在USB2.0 規(guī)范中,由于帶寬、吞吐量劇增,且FIFO 不便動(dòng)態(tài)配置等原因, 故端點(diǎn)存儲選擇RAM來實(shí)現(xiàn)。無論在FPGA 設(shè)計(jì)還是ASIC 設(shè)計(jì)中,都可使用兩種類型的RAM:單口(single port)RAM 與雙口(dual port)RAM。對于雙口RAM,其特別之處在于可同時(shí)讀寫, 即HOST 與MCU 可以同時(shí)對同一個(gè)端點(diǎn)進(jìn)行讀寫操作。比如在由HOST 到設(shè)備方向的高速同步傳輸中,如果使用SPRAM 的話,同步端點(diǎn)的深度至少應(yīng)配置為1024 (除非使用雙緩沖)且必須等到端點(diǎn)"Full"然后才產(chǎn)生中斷讓MCU 讀取端點(diǎn)內(nèi)的數(shù)據(jù)。因此為了實(shí)現(xiàn)同步傳輸,SPRAM 配置實(shí)現(xiàn)的話,為了節(jié)省存儲單元而一般需要雙緩沖機(jī)制, 但增加了端點(diǎn)讀寫控制的復(fù)雜性; 而雙口RAM 由于能夠同時(shí)對不同地址的存儲單元進(jìn)行讀寫(如果同時(shí)讀寫相同地址的話,則看RAM 具體的時(shí)序了),因此雙口RAM 只需要很少的緩沖存儲容量就可以滿足了, 為了使MCU 能夠及時(shí)地讀取數(shù)據(jù),同時(shí),又不致對MCU 的中斷過于頻繁,只要在寫入到端點(diǎn)深度的一半處產(chǎn)生中斷信號即可。因此設(shè)計(jì)中采用DPRAM,既可節(jié)省存儲資源(減小了芯片面積),又可提高同步傳輸?shù)?實(shí)時(shí)同步"性。

  3.3.2 異步時(shí)鐘域之間的數(shù)據(jù)交互

  從前面的功能劃分可以看到,整個(gè)USB 分成3 個(gè)不同的時(shí)鐘域。時(shí)域1 和時(shí)域2 之間實(shí)際上是同步的, 因?yàn)镻HY 為時(shí)域2 提供了與數(shù)據(jù)同步的30MHz 的時(shí)鐘,所以這里的異步時(shí)鐘域主要是指時(shí)域2 與時(shí)域3 之間, 這在SIE 與MCU 之間的讀寫信號很容易看到。由于MCU 發(fā)出的最小讀寫有效脈寬比時(shí)域2 內(nèi)的時(shí)鐘周期要小很多,比如在本設(shè)計(jì)中最小讀寫脈寬為15ns,而內(nèi)部的時(shí)鐘為30MHz(T=33.3ns)。當(dāng)MCU 要讀取數(shù)據(jù)時(shí),可以采用"超前送數(shù)"策略,即根據(jù)MCU 的讀寫命令字在讀有效信號來之前把數(shù)據(jù)放入三態(tài)數(shù)據(jù)輸出端口的輸入端, 用讀有效電平作為三態(tài)的開關(guān)即可。

  MCU 讀完本次數(shù)據(jù)以后,SIE 內(nèi)部的異步讀寫控制邏輯立即對內(nèi)部的MMU 產(chǎn)生一個(gè)讀請求(如果還沒有讀空),準(zhǔn)備好下一個(gè)數(shù)據(jù)。整個(gè)MMU 收到的讀寫信號是由異步讀寫控制邏輯內(nèi)部產(chǎn)生的,對MCU 接口透明, 該方法在FPGA 驗(yàn)證中實(shí)現(xiàn)通過。

  上述異步讀寫控制邏輯的設(shè)計(jì)是基于8051 類MCU的,值得注意的是,若MCU 是wishbone SoC 總線規(guī)范兼容的接口, 則不需上述復(fù)雜的讀寫控制邏輯,在這兩個(gè)時(shí)鐘域之間交換數(shù)據(jù)時(shí),為了解決亞穩(wěn)態(tài)問題,只須增加一級由本地時(shí)鐘觸發(fā)的寄存器實(shí)現(xiàn)作為過渡即可。

  3.3.3 傳輸中一些錯(cuò)誤檢測及其處理

  為了精簡MCU 的編程,設(shè)計(jì)中提出"在保證傳輸正確的基礎(chǔ)上盡量減少中斷" 的設(shè)計(jì)原則。

  USB2.0 規(guī)范中列出了種類繁多的錯(cuò)誤產(chǎn)生及其相應(yīng)的檢測、恢復(fù)方法。筆者認(rèn)為,USB 設(shè)計(jì)者沒有必要對傳輸過程中發(fā)生的任何錯(cuò)誤都向外部MCU 提出中斷,對規(guī)范中部分類型的錯(cuò)誤,內(nèi)部應(yīng)有處理及恢復(fù)機(jī)制。例如超時(shí)的發(fā)生有幾種情形:正確接受完畢來自HOST 的非同步數(shù)據(jù)包后,必須及時(shí)返回一個(gè)成功接收握手;HOST發(fā)出IN 令牌包接收到數(shù)據(jù)以后, 同樣必須及時(shí)地返回握手包,否則超時(shí)。對后者,沒有必要馬上向MCU 產(chǎn)生中斷, 下一個(gè)IN 令牌到來時(shí)自動(dòng)重傳上次數(shù)據(jù), 且最多嘗試3 次。若問題依舊, 再中斷MCU,說明設(shè)備上游的線路可能出了故障。另一個(gè)就是Toggle 同步機(jī)制, 出錯(cuò)也完全沒有必要通知MCU,可在協(xié)議實(shí)現(xiàn)的內(nèi)部來處理。值得一提的是,控制傳輸比較特殊:在控制傳輸?shù)慕㈦A段,SETUP令牌包后面的數(shù)據(jù)包的PID 一定是DATA0,然后在這個(gè)基礎(chǔ)上進(jìn)行觸發(fā)切換。在狀態(tài)階段的數(shù)據(jù)包PID 肯定是DATA1。否則,在FPGA 驗(yàn)證中,即使觸發(fā)位出錯(cuò),主機(jī)還是會返回ACK,造成數(shù)據(jù)已正常接收的假象,而實(shí)際上主機(jī)已摒棄了數(shù)據(jù)。

  4 系統(tǒng)仿真及FPGA驗(yàn)證

  在設(shè)計(jì)的編碼過程中,先分別對各模塊進(jìn)行了功能仿真,子模塊仿真正確后對整個(gè)模塊進(jìn)行了整體功能仿真,然后綜合代碼、設(shè)置引腳、自動(dòng)布局布線后下載到FPGA 內(nèi)。本設(shè)計(jì)FPGA 器件采用Altera 的ACEX1K EP1K100QC208-3。USB 電纜的一端接在測試板的transceiver 上, 另一端接至PC機(jī)的USB 接口上,如果SIE 邏輯功能正確,則Windows會識別出一個(gè)新的USB 設(shè)備, 完成了PnP 過程。為了功能驗(yàn)證和應(yīng)用測試,額外編寫了一個(gè)模塊,用于USB 設(shè)備枚舉時(shí),模擬MCU 的部分功能。

  Windows 在對USB 設(shè)備進(jìn)行枚舉時(shí),按如下順序進(jìn)行:

 ?。?) 主機(jī)發(fā)出一個(gè)復(fù)位信號;

 ?。?) 初次得到設(shè)備描述符的控制傳輸;

 ?。?) 給設(shè)備分配地址。數(shù)據(jù)包DATA0 的第三個(gè)Byte 就是分配的地址;

 ?。?) 以新的地址獲取設(shè)備描述符;

  (5) 初次獲取設(shè)備配置描述符,以確定配置描述符+接口描述符+端點(diǎn)描述符的長度,這次主機(jī)只獲取9 個(gè)字節(jié)的配置描述符。

 ?。?) 獲取字符串描述符(可能沒有),根據(jù)設(shè)備描述符中是否有STRING 索引而定;

 ?。?) 獲取完整的設(shè)備配置描述符,一次性獲取相應(yīng)長度的上述三個(gè)描述符。

  若以上步驟都正確, 則主機(jī)發(fā)現(xiàn)新的USB 設(shè)備,要為該設(shè)備安裝驅(qū)動(dòng)程序。然后利用Windriver可以在Windows 環(huán)境看到這個(gè)USB 設(shè)備以及相關(guān)端點(diǎn)信息等資源。在該驅(qū)動(dòng)程序的控制臺上,可以對USB 設(shè)備控制器的管道進(jìn)行讀寫操作,并且報(bào)告操作結(jié)果,以驗(yàn)證核的功能是否正確。

  5 結(jié)束語

  系統(tǒng)邏輯功能仿真、綜合后門級網(wǎng)表(gate levelnetlist) 功能仿真以及最后的FPGA 驗(yàn)證都表明:本設(shè)計(jì)中,雙口RAM 配置、異步時(shí)鐘域之間讀寫時(shí)的"超前送數(shù)策略"以及"盡可能減少錯(cuò)誤中斷產(chǎn)生"原則,簡化了編碼實(shí)現(xiàn)以及外部MCU 編程,在實(shí)現(xiàn) 設(shè)備控制器的設(shè)計(jì)過程中是有效的、切實(shí)可行的。該方案實(shí)現(xiàn)的USB2.0 設(shè)備控制器IP 核便于修改、易于實(shí)現(xiàn),既可以進(jìn)一步完成ASIC 設(shè)計(jì),也可作為一個(gè)功能模塊嵌入到SOC 中。

參考文獻(xiàn):

[1].bulkdatasheethttp://www.dzsc.com/datasheet/bulk_2523104.html.
[2].ISP1501 datasheethttp://www.dzsc.com/datasheet/ISP1501+_1083529.html.


上一頁 1 2 下一頁

評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉