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

          關(guān) 閉

          新聞中心

          EEPW首頁 > 工控自動(dòng)化 > 設(shè)計(jì)應(yīng)用 > 位填充導(dǎo)致USB數(shù)據(jù)傳輸紊亂的一種解決方案

          位填充導(dǎo)致USB數(shù)據(jù)傳輸紊亂的一種解決方案

          作者: 時(shí)間:2012-11-06 來源:網(wǎng)絡(luò) 收藏

          2)處理第2組并行數(shù)據(jù)時(shí),由于需要添加,故第2組數(shù)據(jù)的處理時(shí)間需要9個(gè)clk周期。由于phy_clk的周期為8個(gè)clk周期,故第2組并行數(shù)據(jù)的持續(xù)時(shí)間為8個(gè)clk周期。于是第2組并行數(shù)據(jù)的最后一位還未發(fā)送,第3組數(shù)據(jù)已取代了第2組數(shù)據(jù)。
          避免上述錯(cuò)誤的常用方法是令hold_reg在其暫存的8位數(shù)都轉(zhuǎn)換成串行數(shù)據(jù)sd_raw后再讀取DataOut中的數(shù),而不是在每個(gè)clk上升沿都讀取。同時(shí),每當(dāng)添加了8個(gè)數(shù)據(jù),就令TxReady=0并持續(xù)1個(gè)phy_clk周期,從而令DataOut暫停變化一次。這樣做雖然解決了上述問題,但卻帶來了一個(gè)新的錯(cuò)誤,如圖3所示。

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

          c.JPG


          圖3中,共要發(fā)送4組并行數(shù)據(jù)。假設(shè)發(fā)送完同步域后,hold_reg恰好在第一組數(shù)據(jù)的最后進(jìn)行采樣,則處理第2組數(shù)據(jù)時(shí)需要添加2個(gè)位,處理時(shí)間為10個(gè)clk周期。同時(shí)由于位填充沒有達(dá)到8個(gè),TxReady持續(xù)為1,DataOut每過8個(gè)clk就變換一次。結(jié)果導(dǎo)致第3組數(shù)據(jù)被錯(cuò)過,沒有被hold_reg采樣到。這種錯(cuò)誤的發(fā)生概率雖然很小,但不能完全避免。
          1.3 全速收發(fā)模式
          全速模式下clk的頻率為12 MHz,即1個(gè)clk周期為5個(gè)phy_clk周期。在接收數(shù)據(jù)時(shí),當(dāng)hold_reg集齊8位數(shù)據(jù)后,將其傳輸?shù)紻ataln中
          并令RxValid=1且持續(xù)1個(gè)phy_clk,其余時(shí)刻令RxValid=0;在發(fā)送數(shù)據(jù)時(shí),當(dāng)hold_reg中的8位數(shù)據(jù)全部轉(zhuǎn)換成串行數(shù)據(jù)后,令TxReady=1并持續(xù)1個(gè)phy_clk,其余時(shí)刻令TxReady_0。因而RxValid和TxReady信號為離散脈沖形式,且脈沖寬度為1個(gè)phy_clk周期,不會出現(xiàn)上述錯(cuò)誤。
          綜上所述,USB 2.0傳輸中位填充造成數(shù)據(jù)總量的增減會影響的準(zhǔn)確性,需加以解決。

          2 解決方案
          通過在收發(fā)器和協(xié)議層之間添加一個(gè)2x8位的異步FIFO作為緩存區(qū),可以解決上述問題。如圖4所示,異步FIFO的讀操作與寫操作分別由兩個(gè)異步時(shí)鐘clk1和clk2控制,異步復(fù)位信號rst同USB設(shè)備控制器的復(fù)位信號相同。

          e.JPG


          接收數(shù)據(jù)時(shí),當(dāng)hold_reg集齊8位數(shù)據(jù),可在clk時(shí)鐘控制下將其中的數(shù)據(jù)寫入FIFO中;而在phy_clk上升沿,若FIFO中有數(shù)據(jù),則令RxValid=1并讀出1組并行數(shù)據(jù)傳給協(xié)議層,否則令RxValid=0且不讀數(shù)據(jù)。經(jīng)分析,此處使用1x8位的FIFO足以滿足要求,不會出現(xiàn)FIFO中有數(shù)據(jù)未讀出新數(shù)據(jù)又寫入的情況,但為了保證不出現(xiàn)特殊情況,這里使用2x8位的FIFO,以保證可靠性。
          發(fā)送數(shù)據(jù)時(shí),在phy_clk上升沿,若FIFO有空間,則令TxReady=1并將DataOut中的數(shù)據(jù)寫入FIFO,否則令TxReady=0且不寫入數(shù)據(jù),當(dāng)協(xié)議層數(shù)據(jù)全部發(fā)送完畢令TxReady=0;在FIFO寫滿的同時(shí)也令TxReady=0;當(dāng)hold_reg中的數(shù)據(jù)全部轉(zhuǎn)換為串行數(shù)據(jù)后,在clk時(shí)鐘控制下從FIFO中取出一組數(shù)據(jù)放入hold_reg中;當(dāng)FIFO中沒有數(shù)據(jù)時(shí),說明數(shù)據(jù)發(fā)送完畢,可以發(fā)包結(jié)束符。

          3 仿真驗(yàn)證及實(shí)驗(yàn)結(jié)果分析
          3.1 高速接收模式
          當(dāng)位填充較多致使數(shù)據(jù)處理時(shí)間過長,導(dǎo)致FIFO中沒有數(shù)據(jù)時(shí),RxValid變?yōu)榱?且持續(xù)了1個(gè)phy_clk周期。從圖中可看出輸出數(shù)據(jù)DataIn在RxValid=1時(shí)的寬度都為1個(gè)phy_clk周期,沒有出現(xiàn)多于1個(gè)phy_clk周期的情況。

          d.JPG


          3.2 高速發(fā)送模式
          圖6為高速發(fā)送模式的仿真結(jié)果。從圖中可以看出,收發(fā)器工作正常,避免了上述錯(cuò)誤的發(fā)生。在收發(fā)器還在發(fā)送同步域時(shí),協(xié)議層就已經(jīng)開始向FIFO中寫數(shù)據(jù),當(dāng)寫滿FIFO后,TxReady變?yōu)?,協(xié)議層暫停向FIFO傳輸數(shù)據(jù),直到FIFO有空間后才繼續(xù)傳輸數(shù)據(jù)。同步域發(fā)送完畢后,hold_reg從FIFO中取出數(shù)據(jù)并依次發(fā)送,沒有出現(xiàn)數(shù)據(jù)缺失或重復(fù)發(fā)送。從圖中可看出從協(xié)議層輸入的數(shù)據(jù)DataOut在TxReady=1時(shí)的寬度都為1個(gè)phy_clk周期,沒有出現(xiàn)多于1個(gè)phy_clk周期的情況,從而不會被FIFO重復(fù)采樣。
          3.3 全速收發(fā)模式
          據(jù)1.3中所述,全速收發(fā)模式不會出現(xiàn)類似錯(cuò)誤,但若是全速高速模式使用不同的收發(fā)方式,會增加系統(tǒng)的復(fù)雜度和設(shè)計(jì)難度。異步FIFO同樣可以用于全速收發(fā)模式,只需要將clk的頻率變?yōu)?2 MHz即可,其余與高速收發(fā)模式相同,在此不再贅述。

          4 結(jié)束語
          文中通過在收發(fā)器與協(xié)議層之間增加一個(gè)2x8位的異步FIFO作為緩存區(qū),解決了USB 2.0設(shè)備控制器在過程中因位填充而造成的問題,使數(shù)據(jù)不會出現(xiàn)缺失或重復(fù),類似方法和思想可以用于其他處理過程。


          上一頁 1 2 下一頁

          評論


          相關(guān)推薦

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

          關(guān)閉
          看屁屁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); })();