參考搬運:
https://mp.weixin.qq.com/s/ZSNyjpZpimjyxyO9riIRNQ
Aurora 64B/66B (xilinx.com)
https://docs.amd.com/r/en-US/pg074-aurora-64b66b
8/10:SATA SRIO
64/66:10G乙太網
值得注意:
64b/66b 編碼在多LANE模式下,EOF(T)僅在一個LANE上出現;
介紹
8B10B的開銷比較大,每傳輸10位資料,就需要傳送2位無效資料。
為了減小8B10B編碼的開銷,同時保留編碼方案的優點,提出了64B66B編碼。
64B66B編碼與8B10B編碼方式有本質區別,8B10B編碼可以從碼錶中獲取一個資料編碼結果,而64B66B在傳送前需要透過白噪聲對資料加擾,在接收資料時也要先對資料解擾。
使用者在實際使用時,GTX的64B66B編碼會比8B10B更簡單,因為64B66B會提供控制幀和資料幀,相比8B10B會簡單一點點。
64B66B編碼原理
下圖是萬兆網的資料編碼框圖,將兩個32位的TXD資料拼接為64位,
然後經過加擾(Scrambling)來保證零一均衡,避免直流失調和時鐘恢復困難。
之後在64位資料之前加入2位的同步頭(Sync header),用來指示後面的64位資料是資料幀還是控制幀,
使用者每傳送64位資料,高速收發器需要傳輸64位資料和2位同步頭。
變速器(Gearbox)可以看成一個深度為64位的儲存器,
每個使用者時鐘輸入64位資料,高速收發器在一個使用者時鐘內也只能傳送64位編碼後的資料,就會導致每個時鐘會有2位資料沒有被髮送,暫存在變速器(Gearbox)。
經過32個時鐘後,變速器(Gearbox)就會存滿64位資料,使用者下個時鐘週期需要暫停輸入資料,高速收發器在下個時鐘將變速器(Gearbox)的64位資料傳送,之後使用者就可以繼續輸入需要傳送的資料了,就這樣迴圈往復。
編碼過程是由加擾器(Scrambling)完成的,因此相同的資料經過加擾後會得到不同的資料,編碼後的資料是不能預測的。
2位同步頭有兩個作用,可以用來指示幀型別,接收端也可以根據同步頭來實現資料對齊,
同步頭只有2’b01和2’b10兩種取值,其餘兩種為無效取值。
01型別是需要全部加擾的,而10型別的TYPE部分則是不需要加擾的,因為涉及了一些指示字元;
當同步頭為2’b01時,表示後面的64位資料是純資料,不包含任何控制字元,如下圖所示。
圖2 純資料幀格式
如果同步頭為2’b10,則表示後面的64位資料是控制幀,可能是起始幀,也可能是結束幀,
如下圖所示,注意同步碼後面的第一位元組資料表示控制幀的型別,根據該資料的值確定該幀資料內容。
下圖是上面幾種幀的一些格式,
D表示資料,C表示空閒字元(7位資料)或控制字元Z,
S表示幀起始字元,T表示幀結束字元。
其中當同步碼為2’b01時,8位元組全部為資料。
64B66B編碼的起始幀有兩種格式,
一種是起始位位於第一個位元組,對應的型別字元為8’h78,
另一種是起始位位於第五位元組,對應的型別字元為8’h33。
但是控制字元的具體數值可能不需要關心,因為不同協議之間是有差異的;
黃色部分是無效區,填充0;
RS Trans指的是RS(協調子層)傳送的資料,D Z T S E均是其中的識別符號;
D 資料
Z 空閒
T 結束
S 起始
E 控制
因為控制字元都是七位的,所以需要補0;每有一個資料字元,就可以少補充一個0;
夾帶控制字元的幀最多隻能傳遞7個位元組的D;
由於使用者每次可以傳輸任意位元組資料,導致停止位可能出現在資料的任何位元組,因此結束幀會有8種型別,型別字元不相同,接收端可以根據結束幀的型別判斷這幀有多少有效資料。
下表是這些控制字元的具體取值,比如起始位S的取值是8’hfb,停止位T的取值是8’hfd,空閒字元C為8’h07。
在不同的TYPE型別下,空閒字元C的填充是可能不同的;
IDLE型別下填充的是7'h0,
ERROR型別下填充的是7'h1e,
開始和結束字元填充的字元根據具體的型別來決定,這是因為
開始型別的包有兩種,而結束的有8種;
加擾
加擾和解擾一般使用的表示式為X^58+X^19+1,這部分內容可以在後續的示例工程中直接獲取,也比較簡單,實現方式與M序列類似。
GTX的64B66B編碼傳送原理
GTX內部不能對待傳送資料加擾,也不能對接收的資料解擾,需要使用者在FPGA邏輯中自己完成加擾和解擾。
由下圖可知,8B10B經過藍色走線後到達FIFO,而64B66B編碼只經過了一個TX Gearbox,並沒有經過什麼編碼模組,因此加擾和解擾相關操作需要使用者在IP外部自己完成。
TX Gearbox的作用就是前文所說的變速器,工作方式如下圖所示,
如果使用者資料位寬設定成32位,並且PCS每次也只能傳輸32位資料,兩個時鐘才能傳送一個64位資料。
因此需要兩個時鐘使用者才能傳送64位資料,
第一個時鐘向GTX傳送2位同步碼和32位資料,變速箱先傳送2位同步碼和高30位資料,第2位資料留在TX Gearbox中。
第二個時鐘使用者傳送剩餘32位資料,TX Gearbox需要先把上個時鐘剩餘2位資料傳送,然後傳送本次接收的高30位資料,最後還是會剩餘2位資料。
因此每經過2個時鐘,TX Gearbox中就會增加2位資料,
當經過64個時鐘後,TX Gearbox中存在64位資料,與一個使用者資料位寬一致。
後兩個時鐘週期使用者不能往GTX傳送資料,TX Gearbox會將內部64位資料傳送出去,完成清空。
在使用64B66B編碼時,一般使用者埠位寬使用64位,會更方便,原理都是一樣的。
所以本質上是66個週期傳送64個64位資料+2x64位gearbox,其中使用者直接使用的是前64個。
gearbox顯然具有計數器,使用計數器來標記何時將其中的資料取出;
這個計數器可以使用內部的也可以使用外部的,這個設定在GT收發器中是可以修改的;
外部計數器需要使用者提供和資料調控;
在GT後面的版本里內部計數器被版本迭代取消,推薦使用外部計數器;
如果把使用者資料頻寬設定成64,這種情況下GTX內部的資料頻寬只有32,我覺得會出現之前描述的USERCLK是USERCLK2兩倍頻率的情況;(確實如此,在SUMMARY中可以看到)