實現(xiàn)USB3.0物理層中彈性緩沖的設(shè)計方案
對于添加SKP對,讀指針如何才能知道要添加多少呢?因此讀指針需要寫指針去引導(dǎo)。在設(shè)計中,采用了斷點保存和握手來解決。在SKP窗口出現(xiàn)和添加閥值標(biāo)志有效時候,寫指針在此時計算FIFO中的有效數(shù)據(jù)個數(shù),根據(jù)FIFO中有效數(shù)據(jù)的個數(shù)與8的差距來決定wrptr_nxt所指向的下一個指針點,這就是寫指針跳躍。并且在寫時鐘域把當(dāng)前的寫指針和下一個所指向的指針點保存起來。在彈性緩沖設(shè)計中,讀指針永遠落后于寫指針。
圖 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)達到規(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é)
本文通過分析彈性緩沖的作用與機制,采用異步時鐘FIFO來設(shè)計彈性緩沖。并且根據(jù)USB3.0協(xié)議要求,提出了斷點保存、指針跳躍與握手、指針屏蔽等方法來設(shè)計彈性緩沖。本設(shè)計充分考慮了PIPE 3.0標(biāo)準(zhǔn)的要求與實際需要,并且應(yīng)用于工程中,實現(xiàn)了彈性緩沖補償時鐘的目的。
評論