1.引言
彈性緩沖由Maurice Karnaugh在電話網(wǎng)絡(luò)中傳輸PCM信號中提出來的,。隨后人們在很多不同的應(yīng)用中采用了彈性緩沖技術(shù)來同步數(shù)據(jù),很多協(xié)議例如USB、PCIE,、以太網(wǎng)等,。
USB3.0是一個高速,串行,,源同步數(shù)據(jù)傳輸協(xié)議,。但是數(shù)據(jù)經(jīng)過傳輸線與原數(shù)據(jù)發(fā)生了很大的偏差。本文從USB3.0的角度分析了彈性緩沖機(jī)制,,解釋了與其他設(shè)計的不同,,并采用指針控制與握手的設(shè)計方法實現(xiàn)。
2.彈性緩沖作用
2.1 USB3.0彈性緩沖作用域
在USB3.0中數(shù)據(jù)傳輸采用雙單工,,因此物理層設(shè)計為接收,、發(fā)送2組差分對傳輸部分,。傳輸線是承載數(shù)據(jù)傳輸?shù)妮d體,。因此如何從傳輸線正確接收數(shù)據(jù),并把它同步到系統(tǒng)內(nèi)部時鐘域,,變的十分關(guān)鍵,。
USB3.0中規(guī)定的物理層接收部分結(jié)構(gòu)圖如下,它包括差分接收,、時鐘數(shù)據(jù)恢復(fù),、串并轉(zhuǎn)換和8B10B譯碼。
圖 1USB3.0物理層接收部分結(jié)構(gòu)
整個數(shù)據(jù)流向自上而下,,差分輸入經(jīng)過差分接收,,從差分信號中提取出時鐘,并用恢復(fù)出來的時鐘來恢復(fù)出數(shù)據(jù)(CDR),?;謴?fù)出來的數(shù)據(jù)在接收時鐘域進(jìn)行串并轉(zhuǎn)換為10bit位寬并行數(shù)據(jù)1,并檢測USB3.0包起始標(biāo)志符(K28.5),。一旦檢測到起始標(biāo)志符K28.5,,使能符號有效(symbol lock),直至檢測到結(jié)束符號,,才結(jié)束符號有效,。
彈性緩沖從串并轉(zhuǎn)換接收數(shù)據(jù),所有的接收數(shù)據(jù)與控制都工作在接收時鐘域(receive clock),。因此彈性緩沖要把數(shù)據(jù)與控制同步到系統(tǒng)時鐘域(system clock),。把數(shù)據(jù)向下傳遞給8B10B譯碼模塊,而后傳遞給系統(tǒng)內(nèi)部,。
2.2 彈性緩沖容量
USB3.0中,,協(xié)議規(guī)定允許的時鐘精度為-5300ppm到300ppm。而符號時鐘頻率為2ns即2000ps,最壞情況下每178個symbol添加或者刪除一個SKP,,也就是每356個symbol添加或者刪除一個SKP對(SKP Order Sets),。USB3.0中包最長為1052字節(jié),所以最差情況下,,最多可以添加或刪除8個SKP或者4個SKP對,,所以彈性緩沖至少要能緩沖8個SKP。USB3.0協(xié)議規(guī)定每個SKP order sets為2個連續(xù)的SKP symbol,。因此在10B8B譯碼前,,SKP order set的游程(running disparity)應(yīng)該是互補的。
通過計算得知,,彈性緩沖的緩沖容量為8,。本文設(shè)計采用常半滿2(normal half full)模式來設(shè)計彈性緩沖,所以彈性緩沖容量為16,,在正常情況下里面應(yīng)該有8個數(shù)據(jù),,剩下的8個為緩沖空間,因此叫常半滿,。常半滿模式首先要向緩沖中寫滿8個symbol,,達(dá)到半滿,然后讀使能才可以有效,,因此大約有8個時鐘的延遲,。常半滿模式只有在symbol隊列中出現(xiàn)SKP對才能添加或者刪除SKP對。下圖為常半滿輸入輸出時序圖,。
圖 2 常半滿輸入輸出時序
從上圖可以看出,,rx_valid_out有效要晚于rx_valid_in約8個時鐘沿;而無效卻晚于rx_valid_out約0至16個時鐘沿(取決于時鐘精度差),。因此常半滿需要8個時鐘延遲才能輸出數(shù)據(jù),。
2.3 彈性緩沖機(jī)制
彈性緩沖本質(zhì)上是讀寫同時受控的異步FIFO,常半滿(normal half full)FIFO,,其深度為16,,首先要寫滿8個有效數(shù)據(jù),并一直維持在半滿的狀態(tài),。因此在正常情況下,,F(xiàn)IFO一直處于或接近半滿狀態(tài),當(dāng)讀寫時鐘一樣快慢的時候,,F(xiàn)IFO中有8個有效數(shù)據(jù),。
圖 3 常半滿讀寫同等速率
當(dāng)讀時鐘快于寫時鐘,讀出的數(shù)據(jù)多于寫入的數(shù)據(jù),,常半滿模式可能導(dǎo)致FIFO中的數(shù)據(jù)數(shù)量少于8,,甚至有可能被讀空,。如下圖所示,在出現(xiàn)SKP窗口的時候,,F(xiàn)IFO中的有效數(shù)據(jù)為4,,比常態(tài)少4。所以此時,,彈性緩沖應(yīng)該添加4個SKP,,使得FIFO維持半滿,以此來調(diào)節(jié)時鐘,。此時讀指針向前跳躍4個間隔,,并且當(dāng)讀指針讀到跳躍區(qū)間時,完成SKP添加,。
圖 4 常半滿模式讀快于寫
當(dāng)讀時鐘慢于寫時鐘,,寫入的數(shù)據(jù)多于讀出的數(shù)據(jù),常半滿模式可能導(dǎo)致FIFO中的數(shù)據(jù)數(shù)量多于8,,甚至有可能被寫滿,。如下圖所示,在出現(xiàn)SKP窗口的時候,, FIFO中有效數(shù)據(jù)為10,,比常態(tài)多2. 所以此時,彈性緩沖應(yīng)該刪除2個SKP,,使得FIFO維持半滿,以此來調(diào)節(jié)時鐘,。此時寫指針應(yīng)該暫停2個時鐘周期,,完成SKP刪除。
圖 5 常半滿寫快于讀
3.彈性緩沖結(jié)構(gòu)
常半滿模式下彈性緩沖的結(jié)構(gòu)設(shè)計,,可以分為接收時鐘域控制,、系統(tǒng)時鐘域控制、閥值檢測與同步,。接收時鐘域控制包括,,寫控制與寫指針控制。系統(tǒng)時鐘域控制包括讀控制與讀指針控制,。閥值檢測與同步包括SKP添加刪除閥值與時鐘域之間的同步,。
圖 6 常半滿模式彈性緩沖結(jié)構(gòu)
3.1 USB3.0中SKP刪除
當(dāng)接收時鐘域的symbol lock有效時,寫使能才可能有效,。一直可以寫到FIFO處于半滿狀態(tài),,此時FIFO處于臨界狀態(tài),讀寫速率的差別將導(dǎo)致不同閥值的觸發(fā),。下圖是SKP對的刪除,。
圖 7 SKP對刪除
檢測單元用來檢測進(jìn)入FIFO的數(shù)據(jù)是否為SKP,起到標(biāo)注SKP窗口的作用,為SKP的刪除提供了窗口,。閥值監(jiān)測單元一直監(jiān)測FIFO中有效數(shù)據(jù)的數(shù)量,。如果數(shù)量大于刪除閥值(FIFO中有10個有效數(shù)據(jù)),并且SKP窗口有效,,那么彈性緩沖暫停指針,,屏蔽SKP對,以此來達(dá)到刪除SKP對的目的,。但是USB3.0中的SKP都是成對出現(xiàn)的,,因此刪除SKP對的時候要注意奇偶性。
所以采用狀態(tài)機(jī)來設(shè)計USB3.0中SKP對的刪除,,如下圖,。當(dāng)SKP窗口無效的時候,狀態(tài)處于idle,;當(dāng)SKP窗口有效而且刪除閥值觸發(fā)時,,狀態(tài)進(jìn)入了屏蔽狀態(tài);在SKP窗口 有效的情況,,屏蔽狀態(tài)持續(xù)到刪除閥值標(biāo)志無效,;當(dāng)SKP窗口無效,或者刪除閥值標(biāo)志無效而且被屏蔽SKP個數(shù)是偶數(shù)個,,則狀態(tài)返回到idle狀態(tài),。
指針屏蔽verilog代碼如下。
3.2 USB3.0中SKP添加
SKP添加模塊包括斷點保存,、寫指針跳躍與握手,、讀指針生成與輸出控制模塊 SKP添加發(fā)生在讀時鐘快于寫時鐘的時候,在正常情況下,,彈性緩沖的讀操作與普通的FIFO沒有任何區(qū)別,。
圖 9 SKP添加結(jié)構(gòu)
3.2.1 斷點保存
在常半滿模式下,讀寫指針相差8個時鐘,。因此在寫指針發(fā)生事件,,要經(jīng)過8個左右的 時鐘才能傳遞到讀指針。在出現(xiàn)SKP窗口的時候,,如果添加閥值標(biāo)志觸發(fā),,則讀指針要經(jīng)過8個時鐘才能添加SKP。
對于添加SKP對,,讀指針如何才能知道要添加多少呢,?因此讀指針需要寫指針去引導(dǎo)。在設(shè)計中,,采用了斷點保存和握手來解決,。在SKP窗口出現(xiàn)和添加閥值標(biāo)志有效時候,,寫指針在此時計算FIFO中的有效數(shù)據(jù)個數(shù),根據(jù)FIFO中有效數(shù)據(jù)的個數(shù)與8的差距來決定wrptr_nxt所指向的下一個指針點,,這就是寫指針跳躍,。并且在寫時鐘域把當(dāng)前的寫指針和下一個所指向的指針點保存起來。在彈性緩沖設(shè)計中,,讀指針永遠(yuǎn)落后于寫指針,。
圖 10 寫指針保存斷點
3.2.2 握手
寫指針在出現(xiàn)SKP窗口和SKP添加閥值觸發(fā)的時候,發(fā)生了跳躍,,并保存了斷點,,但這只是在寫時鐘域。由于讀指針晚于寫指針,,因此采用握手來通知讀時鐘域何時添加SKP,。如下圖,當(dāng)SKP窗口出現(xiàn),,并且添加閥值觸發(fā)時,,彈性緩沖保存了斷點,并向讀時鐘域發(fā)起了請求(req),,請求一直持續(xù)到讀指針讀到了斷點的起始地址(start_rptr),,此時,讀指針讀到了斷點的起始地址,,并向?qū)憰r鐘發(fā)送收到(ack),。當(dāng)寫時鐘域收到讀時鐘域的ack信號,撤銷req,。讀時鐘域一旦讀到了截止地址(end_ptr)自動撤銷ack信號,。在整個讀時鐘域的ack過程中,SKP對被添加,。
圖11 握手
3.2.3 輸出控制
彈性緩沖FIFO讀寫控制的過程中,寫先于讀,,首先根絕延遲要寫到規(guī)定的要求,,此時寫有效讀無效(定義為W1R0)。當(dāng)達(dá)到規(guī)定的閥值之后,,讀寫同時有效(W1R1),。等到寫結(jié)束, 即一個包接收完畢,,但是讀不一定結(jié)束(W0R1),,直至讀到空,即所有數(shù)據(jù)已經(jīng)同步到本地了(W0R0)表示此次任務(wù)結(jié)束,。這種流程控制為了保持這個數(shù)據(jù)的完整性,。
圖 12 讀寫流程控制
USB協(xié)議中明確規(guī)定SKP對為2個連續(xù)的SKP symbol,。根據(jù)8b10b原則,2個連續(xù)的SKP對的游程是相反的,,并且SKP對的添加要符合8b10b3的規(guī)則,。
中要求,在彈性緩沖下溢的時候,,要添加一個EDB字符,,并且顯性的用下溢標(biāo)志。如下圖,,在rx-g與rx-h之間,,由于讀快于寫,導(dǎo)致了下溢,。因此需要添加一個EDB字符,,并使能一個時鐘的下溢,并且置狀態(tài),。
圖 13 彈性緩沖下溢
PIPE3.0中要求,,在彈性緩沖上溢的時候,丟掉一個數(shù)據(jù),,并且置狀態(tài),。如下圖rx-f、rx-g與rx-h,,由于溢出,,rx-g被丟棄,并且置狀態(tài),。
圖 14 彈性緩沖上溢
5.總結(jié)
本文通過分析彈性緩沖的作用與機(jī)制,,采用異步時鐘FIFO來設(shè)計彈性緩沖。并且根據(jù)USB3.0協(xié)議要求,,提出了斷點保存,、指針跳躍與握手、指針屏蔽等方法來設(shè)計彈性緩沖,。本設(shè)計充分考慮了PIPE 3.0標(biāo)準(zhǔn)的要求與實際需要,,并且應(yīng)用于工程中,實現(xiàn)了彈性緩沖補償時鐘的目的,。