一、引言
前幾篇文章已經談到RapidIO的協議,串行物理層與控制符號。
RapidIO協議包括讀事務(NREAD),寫事務(NWRITE),流寫事務(SWRITE),有響應的寫事務(NWRITE_R),原子操作(ATOMIC),維護操作(MAINTENANCE),門鈴事務(DOORBELL)和消息(MESSAGE)這幾種。
RapidIO的串行物理層是基于SERDES的,關于SERDES涉及的一些相關技術請閱讀《SERDES關鍵技術總結》(鏈接:https://www.cnblogs.com/liujinggang/p/10125727.html)這篇文章。SERDES分為PCS(物理編碼子層)和PMA(物理媒介附屬子層)兩層,其中PCS是由純數字電路組成,可以用軟邏輯來實現,而PMA則既包括了數字電路,也包括了模擬電路,不能用純邏輯實現。
控制符號是被串行鏈路端口所使用的消息單元,它用來管理串行鏈路操作的各個功能,包括鏈路維護,包界定,包應答,錯誤報告和錯誤恢復等。
有了前面的基礎以后,接下來就談一談RapidIO串行物理層包的傳輸過程。
二、串行物理層的PCS層與PMA層
物理編碼子層(PCS)與物理媒介附屬子層(PMA)提供SERDES能夠進行高速串行數據傳輸的基本功能(術語PCS和PMA出自IEEE 802.3 )。主要包括8B/10B編碼、字符表示法、數據流的分段、碼組(Code Group)、縱列(Column)、鏈路傳輸規則、空閑序列(Idle Sequence)和鏈路初始化。
通道的概念用于描述串行RapidIO端點的寬度。通道定義為每個方向上的單向差分對。目前串行RapidIO規定了兩種鏈路寬度:1x鏈路為1通道鏈路, 4x鏈路為4通道鏈路。更寬的鏈路也是可能的, 但是目前還沒有知定。
下圖展示了一個典型的RapidIO端點的結構。框圖的上部是負責產生大量RapidIO包的邏輯層和傳輸層。在這些層下面緊接著的是串行協議層,該層負責產生和處理控制符號并通過鏈路管理協議管理鏈路。串行協議層下面是PCS層。鏈路協議管理層和PCS層之間的邊界通常也是時鐘從器件內部時鐘轉變為 RapidIO端點本身時鐘的轉變邊界。PCS層負責通道分段(Striping),產生空閑序列并把字符轉換為相應的8B/10B編碼的K碼和D碼。PCS層下面是PMA層,該層負責與電氣層的銜接。PMA層還負責確保不同通道間彼此正確對齊。電氣層代表不同器件、接收器及其之間的電氣連接。
2.1 PCS層的功能
物理編碼子層(PCS)的功能是負責產生空閑序列、通道分段、發送編碼、解碼、通道對齊和在接收時將分段合并。PCS使用8B/10B編碼在整個鏈路上發送數據。8B/10B編碼方案最初由IBM開發,并在工業界廣泛用于將數據和時鐘信息合并為一個單獨的信號。
PCS層還提供了判定端口的操作模式是4通道還是1通道的機制和檢驗鏈路狀態的方法。該層容許在發送者和接收者之間存在時鐘差異而無需流量控制。
PCS層執行下列發送功能:
1、 將在隊列中等待發送的包和定界控制符號提取出來組成字符流。
2、 在可用通道上分段發送字符流。
3、 當沒有待發送的包和定界控制符號時,產生空閑序列并將其插入到每個通道發送的字符流中。
4、 將每個通道的字符流獨立編碼為10位并行碼組。
5、 將形成的10位并行碼組傳遞給PMA層。
PCS層執行下列接收功能:
1、 解碼10位并行碼組的接收流為各通道獨立的符號。
2、 將從無效碼組解碼得到的字符標記為無效。
3、 如果鏈路使用多于一個的通道,對齊字符流來消除通道間的偏移并將每個通道上的字符流重新組裝為一個單獨的字符流。
4、 將解碼字符流得到的包和定界控制符號遞送到更高層。
2.2 PMA層的功能
物理介質附屬層(PMA)的功能是逐通道將10位并行碼組串行化為串行比特流,或將串行比特流轉換為10位并行碼組。在接收數據時, PMA層的功能是將接收到的比特流逐通道分別對齊到10位碼組邊界。接著該層向PCS層的每個通道提供一個連續的碼組流。10位碼組對PCS層以上的各層是不可見的。
2.3 術語定義
在討論PCS和PMA層時使用的術語定義如下:
1、字節(Byte):一個8位信息単元,字節中每位的值為0或1。
2、字符(Character):由信息字節和一個控制位組成的9位實體。控制位指示信息字節包含的是數據還是控制信息。控制位的值為D或K,分別指示信息字節包含數據或控制信息。
3、D字符(D- Character):控制位為D的字符,也稱為數據字符。
4、K字符(K- Character):控制位為K的字符,也稱為特殊字符。
5、碼組(Code-group):對字符進行8B/10B編碼得到的10位實體。
6、縱列(Column):同時在4x(4通道)鏈路上傳送的由4個字符組成的組群。
7、Comma:8B/10B特殊碼組中唯一的只包含7個比特的字符,接收者用它來判定碼組邊界。
8、空閑序列(Idle Sequence):當不發送包或者控制符號時發送的字符(編碼后的碼組) 序列,空閑序列允許收發雙方保持同步,并保證在包之間、控制符號之間以及包與控制符號之間的碼組對齊。
9、通道對齊(Lane Alignment):消除4通道串行鏈路通道間偏移的過程。由發送者以縱列(Column)發送的字行由接收者的對齊過程以縱列輸出。若無通道對齊,以縱列發送的字符可能會被分散到由接收者輸出的若干縱列上。對齊過程使用作為空閑序列的一部分傳送的特殊對齊字符。
10、分段(Striping): 4x鏈路上使用的在4個通道上同時發送數據的方法。它將字符流逐字符分散到多個通道上。第1到第4個字符經分段處理后被分別分配到通道0到通道3上,第5個字符被循環分配到通道0上,以此類推。
2.3 8B/10B傳輸碼
PCS在發送數據時使用8B/10B發送碼將9位字符(8位信息和1位控制位)編碼為10位碼組,接收數據時則進行相反的操作。256個數據字符和12個特殊(控制)字符被定義了編碼。
8B/10B碼使用的碼組中,“0”和“1”的個數相等(平衡)或相差2(不平衡)。如此選擇碼組保證了在每一碼組中至少存在兩次跳變,即0到1或1到0,使維持平衡的任務變得簡單。字符被編碼為一個單獨的平衡碼組或一對不平衡碼組。碼組對的成員在邏輯上與對方互補。這允許編碼器在選擇非平衡碼組時,根據維持編碼器輸出碼組流的0/1平衡所需的碼組選擇一個含“1”較多或含“0”較多的非平衡碼組。
8B/10B編碼有如下特性:
1、充足的位跳變密度(每個碼組有3~8個跳變),以允許接收端進行時鐘恢復。
2、使用特殊碼組建立接收者對10位碼組邊界的同步,定界控制符號并維持接收者位和碼組的邊界同步。
3、直流平衡(“0”和“1”的個數基本相同)。
4、可檢測某些單比特或多比特錯誤。
2.4 字符和碼組記號
8B/10B編碼和解碼使用下列記號描述字符、碼組和它們的位。
未編碼字符的信息位[0-7]由字母A到H標記,H標記的是最高信息位(RapidIO第0位),A標記的是最低信息位(RapidIO第7位)。如下圖所示
每個數據字符都有一個Dx.y格式的表示法,其中x是最低5個信息位EDCBA的十進制值,y是最高3個信息位HGF的十進制值。同時,每個特殊字符也都有一個與之類似的Kx.y格式的表示法。
8B/10B編碼過程輸出的是10位碼組,用字母a到j標記碼組的位。碼組的位具有相等的重要性,沒有最高位或最低位。碼組位的次序如下圖所示
與數據字符Dx.y(8-bit)對應的碼組由/Dx.y/(10-bit)表示,與特殊字符Kx.y(8-bit)對應的碼組由/Kx.y/(10-bit)表示。
2.5 運行不一致(Running Disparity)
8B/10B編碼和解碼功能使用一個稱為運行不一致的二進制變量。該變量值可為正(RD+)或負(RD-)。實際上,運行不一致變量表示的就是10-bit碼組中“0”的個數和“1”的個數的差值。當“0”的個數大于“1”的個數時,運行不一致變量的值為正,當“0”的個數小于“1”的個數時,運行不一致變量的值為負。其實要保證直流平衡最簡單的方式是使10-bit碼組中的0和1的個數相同,也就是10-bit碼組中“0”和“1”的個數都是5個,但是10-bit碼組中既要滿足直流平衡,還要有足夠的跳變(3~8次跳變)使得接收方能夠恢復出時鐘信號,那么滿足要求的“0”和“1”個數相同的10-bit碼組數量是不夠的,所以必須增設一些“0”和“1”的個數不相等的碼組,編碼器可以通過碼組的運行不一致變量的值來選擇下一個要發送的碼組來保證整個鏈路的直流平衡。
每個通道的編碼器和解碼器都有一個運行不一致變量。對于4x鏈路,各通道運行不一致的值相互獨立。
在編碼過程中運行不一致的主要用途是跟蹤解碼器是否輸出了較多的1或較多的0。當字符編碼需要從兩個不平衡的碼組中選擇一個碼組時,使用編輯器當前的運行不一致選擇采用哪一個不平衡碼組。
在上電后和端口可操作前,發送者(編碼器)和接收者(解碼器)都必須建立運行不一致的當前值。發送者使用負值作為每個通道運行不一致的初始值。接收者可能使用負值或正值作為每個通道的運行不一致變量的初始值。
使用下列算法計算各通道的運行不一致值。在編碼器中,該算法對由編碼器產生的新碼組進行操作。在接收方,該算法對接收到的由解碼器解碼的新碼組進行操作。
每個碼組被分為兩個子塊,如下圖所示,前6位(abcdei)形成一個子塊(6位子塊),其余4位(fghi)形成另一個子塊(4位子塊)。6位子塊頭部的運行不一致值是前一個碼組尾部的運行不一致值。4位子塊頭部的運行不一致值是6位子塊尾部的運行不一致值。碼組末尾的運行不一致值是4位子塊尾部的運行不一致值。
子塊運行不一致值的計算方法如下:
1、如果子塊包含“1”的個數多于“0”的個數,那么任何子塊尾部的運行不一致值都是正的。如果4位子塊值為0b0011,其尾部的運行不一致值也是正的。如果6位子塊值為0b000111,其尾部的運行不一致值也是正的。
2、如果子塊包含“0”的個數多于“1”的個數,那么在任何子塊尾部的運行不一致值都是負的。如果4位子塊值為0b1100。其尾部的運行不一致值也是負的。如果6位子塊值為0b111000,其尾部的運行不一致值也是負的。
3、在其他任何情況下,子塊尾部的運行不一致值總是與子塊頭部的運行不一致值相同。
2.6 8B/10B編碼
8B/10B編碼功能將9位字符編碼為10位碼組。RapidIO規范包含256個數據字符(Dx.y)和12個特殊字特(Kx.y)的編碼。這些編碼幾乎完全基于IEEE 802.3工作組在10G位以太網(XAUI)適配接口標準中定義的編碼。對任意給定的一個9位字符,有兩列編碼,一列記為RD-(負運行不一致),另一列記為RD+(正運行不一致)。對字符編碼時,如果當前編碼器的運行不一致值為負,就選擇RD-列中的碼組作為編碼結果;如果當前編碼器的運行不一致值為正,就選擇RD+列中的碼組作為編碼結果。在每個字符經編碼后,編碼器應當跟據運行不一致規則使用編碼得到的新碼組更新運行不一致值。 .
2.7 發送順序
編碼器輸出的10位并行碼組經串行化,以“abcdeifghj”的位次序發送,其中“a”位首先發送。如下圖所示,該圖給出了一個字符經過編碼、并串轉換、發送、串并轉換和解碼的完整過程。圖的左邊顯示的發送過程是使用8B/10B編碼對字符流編碼和10位并串轉換過程。右邊顯示的是接收者對接收到的碼組進行串并轉換和8B/10B解碼的過程。點劃線是產生10位碼組的PCS層和串行化碼組的PMA層的功能分界線。
下圖還顯示了在接收方接收者使用包含Comma序列的特殊字符來建立10位碼組的邊界對齊。
2.8 8B/10B解碼
8B/10B解碼功能將接收到的10位碼組解碼為9位字符,檢測接收到的未定義解碼的碼組并標記解碼輸出流中得到的相應字符為無效字符(INVALID)。
解碼功能使用與8B/10B編碼相反的解碼表和解碼器當前的運行不一致值。解碼器將接收到的碼組與兩個表選擇的列中的碼組做比較。如果找到匹配,碼組就被解碼為相應字符;如果找不到匹配,碼組就被解碼為一個以某種方式標記為無效的字符。在解碼每個碼組后,解碼器接著應根據運行不一致規則使用解碼得到的新碼組更新解碼器的運行不一致值。
下表是一部分數據字符(Dx.y)的解碼表,完整的解碼表請查看參考文獻1的492頁到499頁
下表是12個特殊字符(Kx.y)的解碼表
Comma是8B/10B編解碼中非常重要的一個單元,它只有7個bit,接收鏈路可以利用Comma實現碼組的邊界對齊。8B/10B中一共定義了兩種Comma,分別為0b0011111(Comma+)和0b1100000(Comma-)。這兩組Comma分別對應特殊碼組/K28.1/,/K28.5/和/K28.7/的abcdeif位。當碼組轉化完畢以后,在沒有傳輸錯誤發生的情況下,Comma不可能出現在碼組中的任何位置,也不可能在兩個相鄰碼組的邊界產生,但下面一種情況例外:
當特殊碼組/K28.7/后面傳輸的數據碼組是/D3.y/,/D11.y/,/D12.y/,/D19.y/,/D20.y/,/D28.y/和/K28.y/(y的取值范圍是0~7的整數)中的任意一個時,有可能導致comma在兩個碼組的邊界產生(取決于運行不一致的值)。如果在兩個碼組的邊界產生了comma,那么接收鏈路就有可能改變10-bit碼組的對齊位置。因此,特殊碼組/K28.7/僅僅用作測試或者診斷的目的。
2.9 特殊字符與縱列
下表定義了RapidIO串行物理層中的特殊字符與縱列,使用特殊字符可以完成以下功能:
1、 逐通道對齊碼組(10位)邊界。
2、 對齊通過四個通道的接收數據流
3、 標記IDLE2 Sequence 中CS域的起始位置(CS = Command and Status)
4、 接收者和發送者間的時鐘速率補償
5、 控制符號界定
下面對上表中的各個特殊字符與碼組的功能進行分別說明:
包分界控制符號(/PD/):
PD和/PD/分別是K28.3字符和/K28.3/碼組的別名,用于定界包含包定界符的控制符號的開始
控制符號的開始(/SC/):
SC和/SC/分別是K28.0字符和/K28.0/碼組的別名,用于定界不包含包定界符的控制符號的開始
同步(/K/):
K和/K/分別是K28.5字符和/K28.5/碼組的別名,空閑序列使用該字符或碼組向接收者提供接收者需要獲得并維持的位和10位碼組的邊界同步信息。選用/K28.5/碼組作為同步字符的原因如下:
1、 該碼組的“abcdeif”位中包含Comma序列。Comma序列可在碼組比特流中輕易找到并標記碼組邊界
2、 “ghj”位提供了最大數量的位跳變(即101或010)
略過(/R/)
R和/R/分別是K29.7字符和/K29.7/碼組的別名。它們在空閑序列和時鐘補償序列中使用
對齊(/A/)
A和/A/分別是K27.7字符和/K27.7/碼組的別名。它們在空閑序列中使用并用于對齊4x通道。
標記(/M/)
M和/M/分別是K28.1字符和/K28.1/碼組的別名。它們在空閑序列2(Idle Sequence 2)中使用并給接收鏈路提供保持10位碼組邊界同步的信息,同時標記空閑幀中CS域的位置。
||K||,||R||,||A||,||M||,||I||
||K||,||R||,||A||,||M||,||I||分別代表四通道情況下的特殊字符,含義與上面對應的字符含義相同。
三、使用串行物理層
了解組成串行物理層包頭的位、用于管理端口間通信的控制符號和使用8B/10B編碼在同一信號中傳送時鐘和DC平衡數據的比特流編碼技術后,現在我們可以研究鏈路在兩個端點間發送數據的實際工作機制了。
3.1 端口初始化過程
端口初始化是RapidIO用來初始化和同步一對通信端口的過程。這個過程包括檢測鏈路的另一端是否存在一個鏈路對象、建立位同步并對齊碼組邊界以及在端口能同時支持1x和4x模式(1x/4x端口)情況下,發現鏈路對象是否能支持4x操作模式并選擇1x或4x操作模式,如果選擇1x模式,則選擇通道0或者通道2作為鏈路接收通道。
若干狀態機控制了初始化過程。RapidIO規范詳細的描述了狀態機的結構。狀態機的數量和類型取決于端口僅支持1x模式(1x端口)還是同時支持1x和4x模式(1x/4x端口)。在兩種情況下都有一個主狀態機和一個或多個次狀態機。使用多個狀態機使整體設計更為簡化。正如可以預期的那樣,1x端口的初始化過程比1x/4x端口的初始化過程簡單;1x端口的初始化過程使1x/4x端口初始化過程的子集。
3.2 包交換協議
一旦端口初始化完成,就可以開始包的交換。已經定義了一個協議用于兩個串行RapidIO端點之間的包通信。使用控制符號管理通過鏈路的包流。包由控制符號定界和確認。錯誤情況也可以通過控制符號通信。控制符號還用于支持流量控制協議。
控制符號:
控制符號是由串行鏈路連接的端口所使用的消息部分。控制符號用于鏈路維護、包定界、包確認,錯誤報告和錯誤恢復。
發送時控制符號由一個單獨的8B/10B特殊(控制)字符定界。控制字符標記控制符號的開始并緊靠在控制符號的首位之前。為了通道分段(如果可用)和8B/10B編碼,在將控制符號傳遞到PCS子層前將用于定界控制的特殊字符加入控制符號。因為短控制符號的長度是固定的24位,所以控制符號不需要尾部定界符。定界符和控制符號組合在一起,稱為定界控制符號。
使用兩種特殊字符中的一種定界控制符號。如果控制符號包含一個包定界符,就使用專用字符PD(K28.3 )。如果控制符號不包含包定界符,就使用專用字符SC(K28.0)。如此使用特殊字符向接收者提供了一個控制符號內容的“預警(Early Warning)”信號。
任何不包含包定界符的控制符號都可被嵌入到包中。嵌入的控制符號可能包含任何已定義的stype0編碼和“多播事件”或“NOP”之類的stype1編碼。不能將stype1作為包開始、包結束、消除、從重傳處重啟或鏈路請求控制符號嵌入到包中,因為它們會終止包。
在鏈路嵌入控制符號的方式和程度會影響鏈路和系統的性能。例如,嵌入多播事件控制符號允許它們的傳播延時和通過交換機處理部件的時延變化最小(某些多播事件應用迫切需要嵌入多播事件控制符號)。另一方面,嵌入所有的包確認控制符號而不是把它們盡可能多地與包定界控制符號組合的做法減少了可用于包傳送的鏈路帶寬,可能是我們所不希望的。
包:
串行 RapidIO包在發送時由控制符號進行定界。由于包長度是變化的,所以同時需要包開始和包結束定界符。標記包的結束(包終止)的控制符號跟在包尾或嵌入的控制符號的后面。
用來進行包定界的控制符號如下:
1、 包開始
2、 包結束
3、 消除
4、 從重傳處重啟
5、 任意鏈路請求
由包開始控制符號標記包的開始。
包以下列三種方式之一終止:
1、 用包結束控制符號標記包尾。
2、 用包開始控制符號標記包尾,包開始控制符號標記新包的開始。
3、 用從重傳處重啟、消除或鏈路請求控制符號取消包。
每個包都需要一個標識符來唯一的標識它的確認控制符號。該標識符就是RapidIO包格式中的ackID字段,對RapidIO串行物理層的包來說,ackID字段的長度是5位,它允許在相鄰處理部件間存在1到32個未完成的待確認的請求或響應包,但只允許同時存在最多31個未完成的待確認包。
復位后分配給ackID 的初始值是 0b00000。ackID的后續值是連續分配的(按數字順序增加,達到最大數時返回到0),用來指示包的發送次序。確認本身由控制符號組成。
串行RapidIO鏈路協議使用重傳從包發送錯誤中恢復。為支持包重傳,發送端口保存每個通過串行鏈路傳輸的包的一個副本,直到收到接收端口發出的接收包的包確認控制符號或者直到端口判定該包已經遇到了不可恢復的錯誤情況。包確認控制符號指示接收端口已收到包并且沒有檢測到錯誤,同時已經接收對該包進行處理的責任。除了可能的錯誤,如果端口在接收到的包的優先級上沒有足夠的可用輸入緩沖區空間,則端口也可能拒絕包。
產生包的端點處理部件為每個包分配一個優先級。該優先級包含在包的物理層字段優先級(PRIO)中并有四個可能的值: 0、1、2和3。包的優先級隨優先級值的增加而提高;最低優先級為 0; 最高優先級為3。使用包優先級的目的有多個, 包括事務排序和死鎖預防。
3.3 空閑序列
空閑序列是一個碼組序列。當鏈路無需發送包或控制符號時,在每個串行鏈路協議(LP- Serial)鏈路通道上連續地發送空閑序列。空閑序列不能插入到包中。作為端口初始化過程的一部分, 在每個通道上傳送空閑序列。這是端口初始化協議所需要的。
1x空閑序列由碼組/K/、/A/、/R/ (空閑碼組)構成的偽隨機序列組成,由操作模式為1x的端口使用。4x空閑序列由縱列llKll、llAll、llRll(空閑縱列)構成的偽隨機序列組成,由操作模式為4x的端口使用。協議對空閑序列長度沒有要求。空閑序列可以是任意長度。
空閑序列中對碼組的偽隨機選擇導致空閑序列的頻譜中沒有離散譜線。這可以最小化長空閑序列產生的電磁干擾(EMI)。
空閑序列分為空閑序列1(Idle1 Sequence)和空閑序列2(Idle2 Sequence)。
空閑序列1(Idle1 Sequence):
空閑序列1是一組由A,K,R特殊字符組成的序列,這組序列在串行鏈路上發送之前必須先經過8B/10B編碼器進行編碼產生對應的10-bit特殊碼組/A/,/K/,/R/之后才能在鏈路上發送。
產生空閑序列1推薦使用至少7階的本原多項式來產生相應的偽隨機序列,例如:
X7+X6+1 和 X7+X3+1
就是兩個7階本原多項式的例子,可以利用這兩個多項式的任意一個作為空閑序列1的偽隨機序列生成多項式。下圖是一個產生空閑序列1偽隨機序列的框圖
空閑序列2(Idle2 Sequence):
空閑序列2是一組由數據字符和特殊字符A,K,M,R組成的序列。這組序列在串行鏈路上發送之前必須先經過8B/10B編碼器進行編碼產生對應的10-bit特殊碼組/A/,/K/,/M/和/R/之后才能在鏈路上發送。
空閑序列2的空閑幀的結構如下所示
它包括509-515個字符的隨機數據域,8個字符的CS域標記以及32個字符的編碼CS域。其中隨機數據域包含偽隨機數據字符和A、M特殊字符。CS域標記字段指明了命令和狀態(CS = Command and Status)域的起始位置,并且提供了鏈路極性,鏈路寬度和鏈路號等信息。CS域給端口提供了一些狀態信息和控制發送端口的預加重設置。
空閑序列的選擇:
當串行鏈路每個通道的線速率在5.5Gbps以上時只能選擇空閑序列2(IDLE2 Sequence),當每通道的線速率低于5.5Gbps時既可以選擇空閑序列1(IDLE1 Sequence),也可以選擇空閑序列2(IDLE2 Sequence)。至于在端口初始化的過程中選擇空閑序列的算法請查看參考文獻1的516頁。
關于空閑序列的產生以及更加詳細的介紹請查看參考文獻1的503頁到517頁。
3.4 1x串行RapidIO鏈路上的數據流
1x串行RapidIO端口通過8B/10B編碼器編碼從上層(邏輯層和傳輸層)依次傳送過來的分界控制符號與包的字符流,當控制符號與包不可獲得時,空閑序列將被送入8B/10B編碼器進行編碼并發送,以保證整個收發鏈路處于同步狀態。
對于接收鏈路來說,10-bit的碼組流將送入8B/10B解碼器進行解碼,然后把解碼得到的控制符號與包按照接收的順序依次傳入上層(邏輯層與傳輸層)。
如果鏈路的空閑序列為空閑序列2,控制符號和包數據字符在發送之前需要擾碼,接收之前需要解擾。
下圖顯示了短控制符號在1x串行RapidIO鏈路上的編碼和發送順序示意圖
下圖顯示了RapidIO包在1x串行RapidIO鏈路上的編碼和發送順序示意圖
下圖顯示了一個在1x串行鏈路上傳送控制符號、包和空閑序列的實例。發送的第一個碼組是代表控制符號開始的/SC/, 隨后是三個包含24位控制符號信息的數據碼組。該控制符號的功能沒有顯示。控制符號后面跟著四個空閑字符。這四個空閑字符之后是一個定界包開始的/PD/碼組。后面三個碼組包含的控制符號信息代表包定界符號信息。碼組表示RapidIO包緊跟在該符號信息之后。包長度為28字節。包之后是一個包結束控制符號,這個包結束控制符號之后是另一個包開始控制符號和另一個數據包。在從重傳處重啟控制符號終止包前,該包能夠傳輸16字節信息。該包還插入了另外兩個控制符號, 這兩個控制符號分別插在數據流中的第8個數據字節和第12個數據字節之后。在RapidIO協議中,幾乎可在任意時刻將控制符號插入到通信信道中, 無需等到包發送完全完成即可插入控制符號。在發送從重傳處重啟控制符號之后, 另一個包被發送到鏈路上。該包正確地完成后鏈路成為空閑狀態。
3.5 4x串行RapidIO鏈路上的數據流
在4x操作模式下的串行端口在8B/10B編碼之前按如下方式將定界控制符號和組成包的字符流分段到四個通道上。
包和定界控制待號將被從通道0開始分段到四個通道上。每個包的第一個字符或定界控制符號被放到通道0,第二個字符被放到通道1 ,第三個字符被放到通道2,第四個字符被放到通道3。第五個字符又被放到通道0,如此循環。
由于控制符號的長度是固定的24位并且要求包的長度必須是32位的整數倍, 分段后定界控制符號的碼組總被放到通道0。所有包將形成整數個連續的縱列。在分段后, 4個字符流的每一個流都被獨立地進行8B/10B編碼和發送。
在接收方對每個通道進行解碼。解碼后, 字符流對齊這4個通道。作為4x空閑序列的一部分發送的llAll縱列提供執行對齊所需的信息。在對齊之后,縱列被合并為單獨的字符流, 然后被傳遞到上層 。
通道對齊過程消除了通道間的偏移,這樣在合并(destriping)后接收到的字符流中字符的順序與在分段和發送前字符的順序相同。由于||A||縱列之間最小的非llAll縱列數量為16, 所以可以明確修正的最大通道偏移是在一個通道上傳送7個碼組的時間 。下圖顯示了一個在4x鏈路上傳送空閑序列、包和定界控制符號的實例。該實例使用的包序列與1x鏈路的實例相同。
四、總結
RapidIO串行物理層的8B/10B編解碼原理與包傳輸流程相關的內容到此介紹完畢,更多詳細的內容請閱讀參考文獻1的第485頁到560頁。為了便于大家以后的查閱,下面把控制符號與K碼相關的定義全部列到一起。
注意:上圖列出的是短控制符號的定義。長控制符號總長度為48位而短控制符號的總長度為24位。
至此,整個RapidIO理論部分全部介紹完畢,后面會繼續寫Xilinx RapidIO核的相關內容。
審核編輯 :李倩
-
RapidIO
+關注
關注
1文章
39瀏覽量
20807 -
物理層
+關注
關注
1文章
148瀏覽量
34360 -
PMA
+關注
關注
1文章
30瀏覽量
18803
原文標題:一、引言
文章出處:【微信號:zhuyandz,微信公眾號:FPGA之家】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論