<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 基于USB設備控制器的端點緩沖區(qū)的優(yōu)化設計

          基于USB設備控制器的端點緩沖區(qū)的優(yōu)化設計

          作者: 時間:2012-02-29 來源:網(wǎng)絡 收藏

          這里首先簡要介紹中端點的概念,并給出一款異步FIFO的方案。然后根據(jù)四種傳輸類型的特點,提出該FIFO結構的不同類型的端點方案。特別是對于控制端點提出了一種新型的雙向異步FIFO結構,在保證控制傳輸?shù)那疤嵯?,減小了將近1/2的電路面積。最后給出在Synopsys平臺下電路的VLSL實現(xiàn)結果。

          本文引用地址:http://www.ex-cimer.com/article/149541.htm

          2.0規(guī)范將USB接口的傳輸速度提高了40倍。傳輸速度的提升使得USB指標也隨之提高,雖然協(xié)議中對于的設計要求并沒有本質上的改變,但是由于總線帶寬與傳輸速度的提高,各個芯片供應商均推出了自己的設計方案。為了提高USB接口的數(shù)據(jù)存取速度,通常使用異步FIFO來設計端點緩沖區(qū)。



          1 USB協(xié)議中的端點及實施方案

          1.1 USB的端點

          USB主機和之間傳輸?shù)臄?shù)據(jù)是以信息包的格式來傳輸?shù)?,可分為令牌包、?shù)據(jù)包、握手包和特殊包。在數(shù)據(jù)包中包括了主機和設備通信的數(shù)據(jù)分組。圖1是一個典型的USB數(shù)據(jù)包的格式。



          PID域是為了增加USB通信的健壯性而設定的數(shù)據(jù)分組的辨識符;CRC16域是對數(shù)據(jù)分組進行CRC校驗的結果。DATA域是實際傳送的數(shù)據(jù)內(nèi)容。USB設備會將接收到的主機數(shù)據(jù)包放入指定的端點緩沖區(qū);或者從指定的端點取出待發(fā)送的數(shù)據(jù)組裝成USB信息包發(fā)送到主機。

          由此可見,所謂端點實際上是主機與設備之間通信的來源或目的,所有的傳輸都要傳送到設備的端點,或是由設備的端點發(fā)出。一系列相互獨立的端點在一起就構成了USB邏輯設備。從物理層的角度來看,端點是一塊存儲器區(qū)域,用以緩沖實際接收到或待發(fā)送的數(shù)據(jù)包。

          USB協(xié)議中定義了四種傳輸類型,分別是控制傳輸、批量傳輸、中斷傳輸和同步傳輸。所有USB設備都應該支持控制傳輸,其他三種傳輸方式根據(jù)不同的應用背影而用于不同類型的設備。按照傳輸類型可將端點分為控制端點、批量端點、中斷端點和同步端點。其中控制端點較為特殊,只有它可以雙向的傳輸數(shù)據(jù),而其他端點只能傳輸單方向的數(shù)據(jù)。

          1.2使用異步FIFO設計USB端點

          由于USB設備控制器的緩沖區(qū)空間是對應各個不同的端點。每個端點所對應的傳輸方式、傳輸方向也不同。通??刂贫它c會連接控制器的MCU單元,而其他類型的端點一般連接設備端的接口??梢奤SB的端點緩沖區(qū)實際上是在串行接口引擎時鐘和設備時鐘或MCU時鐘的兩個時鐘域之間傳輸數(shù)據(jù)。而使用異步FIFO來實現(xiàn)該結構顯然是一個不錯的選擇。

          圖2是本文所采用的異步FIFO的結構框圖。該異步FIFO由一塊雙端口SRAM、寫地址/滿邏輯和讀地址/空邏輯、以及為了消除亞穩(wěn)態(tài)的兩級同步電路組成。左端口在寫時鐘下進行數(shù)據(jù)的寫入操作;右端口在讀時鐘下實現(xiàn)數(shù)據(jù)的讀出操作。



          對于異步FIFO的設計,產(chǎn)生準確的空滿標準是設計中的核心任務,它與FIFO是否能穩(wěn)定工作息息相關。寫滿不溢出,讀空不多讀是異步FIFO空滿標志判斷的基本原則。傳統(tǒng)的判斷方法是另外設置一個狀態(tài)位,作為最高位,其余位作為地址位,當讀寫指針的地址位和狀態(tài)位全部吻合時,F(xiàn)IFO處于空狀態(tài);當讀寫指針的地址位相同而狀態(tài)位相反,F(xiàn)IFO處于滿狀態(tài)。這種異步FIFO由于是通過直接比較二進制讀寫指針來判斷滿和空的,在跨時鐘傳遞時會有毛刺產(chǎn)生。下面將介紹一種通過直接比較格雷碼指針的方法生成FIFO的空滿信號,從而消除了毛刺,提高了電路的穩(wěn)定性。

          比如要設計一個深度為8的異步FIFO,需要使用3 b的格雷碼計數(shù)器對讀寫指針計數(shù),與二進制類似,還是需要使用一個狀態(tài)位來判斷滿和空狀態(tài)。此時FIFO的格雷碼指針跳變情況如表1所示。



          觀察表1可知,當讀指針為4’b0011時(二進制為4’b0010),此時比他多一個周期所對應的格雷碼為4’b1111(二進制為4’b1010)。兩者的高二位恰好相反,但低位完全相同。對比表1左右兩列可知當讀寫指針相差一個周期即FIFO滿時對應的格雷碼指針的最高兩位相反,而低位則完全相同;當兩者完全相等時對應為FIFO的空狀態(tài)。圖3給出的是在設計的FIFO的深度為8時,在Modelsim中的仿真波形。由圖3可知,當FIFO從空到滿時,對應的格雷碼寫指針為4’b1100,而同步后的讀指針為4’b0000;當從滿被讀空時,讀指針為4’b1100;由此可見仿真的FIFO的空滿信號與設計一致。

          2 FIFO結構的端點設計方案

          2.1新型FIFO結構設計控制端點

          上文已經(jīng)論述過控制端點是一個雙向傳輸?shù)亩它c,但是在同一時刻只能是單向的數(shù)據(jù)傳輸。該端點主要是用于USB設備的枚舉過程,主機發(fā)送一個信息包,設備負責回應一個信息包。對于該端點的設計現(xiàn)有的方案都是采用雙FIFO來實現(xiàn)雙向傳輸?shù)?。一個FIFO用以接收主機發(fā)送過來的數(shù)據(jù)包;另外一個FIFO用以向主機發(fā)送數(shù)據(jù)包。在傳輸數(shù)據(jù)包時總有一個FIFO處于空閑狀態(tài),這樣會造成存儲器資源的浪費。為此,本文提出一種新型的異步FIFO結構,該結構使用一塊雙端口SRAM來實現(xiàn)控制端點的單工雙向傳輸,而傳統(tǒng)的雙FIFO結構需要兩塊SRAM用來實現(xiàn)雙向傳輸。由于SRAM占據(jù)了FIFO的大部分面積,在實現(xiàn)控制傳輸?shù)墓δ芟律儆昧艘粔KSRAM,可以預見最終的電路實現(xiàn)面積會減小將近1/2。

          圖4是本文所設計的新型異步FIFO結構,該FIFO的實現(xiàn)是基于一塊雙端SRAM。在上文所提到的異步FIFO結構的基礎上增加一套讀寫指針邏輯和滿空判斷標志。這個電路可以看作是原來電路模塊的復制,即兩者設計完全一致。這兩個新增的指針模塊用以產(chǎn)生訪問SRAM的地址和用以產(chǎn)生滿和空的格雷碼指針。這樣在同一方向對于SRAM的訪問就會有兩個地址,其中一個是讀地址,另一個是寫地址。這樣需要設計一個選擇器,用以選擇當前訪問SRAM的是讀地址或寫地址。這個選擇器的選擇端可以根據(jù)不同方向的讀寫使能信號來切換。這是由于在同一時刻不可能出現(xiàn)一個方向的讀/寫使能均有效的現(xiàn)象。

          對于圖4的數(shù)據(jù)路徑可簡介如下,方向0在其寫使能信號的控制下,往FIFO內(nèi)寫入數(shù)據(jù),寫滿之后方向1控制其讀使能將方向0寫入的數(shù)據(jù)讀出來。然后方向1控制其寫使能將數(shù)據(jù)寫入雙端口SRAM,方向0負責把SRAM內(nèi)的數(shù)據(jù)讀出。

          pid控制器相關文章:pid控制器原理



          上一頁 1 2 下一頁

          評論


          相關推薦

          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();