目錄
第一章 內容梗概.
第二章 8b/10b編碼是什麼
第三章 8b/10b編碼的作用
第四章 8b/10b編碼的實現機制.
第五章 總結
隨著高速序列通訊的應用愈發廣泛,作為高速序列通訊重要內容的8b/10b編碼也成了我們需要了解學習的內容,因為只有熟悉了8b/10b編碼才能正確的理一些解高速序列傳輸機制,要不然會有好多問號徘徊在腦袋裡,對此我深有感觸。
要想真正理解8b/10b編碼,就要知其所以然,這樣是亙古不變的道理,為此我做了如下的內容安排:
第二章:8b/10b編碼是什麼?知道它是誰家的孩子,也就大體知道它是幹什麼的了
第三章:了解 8b/10b編碼的作用,這也是它誕生的初衷,存在的意義。了解其作用,不僅是了解其作用,當我們緊抓其目的,也就能對其實現方式有了生層次的理解。
第四章:了解8b/10b編碼是如何實現的以及背後的考量。
第二章 8b/10b編碼是什麼
何為編碼,編碼就是資訊從一種形式或格式轉換為另一種形式的過程,例如用1表示3.3v,再例如我們熟知的ascii碼都是編碼。8b/10b編碼也是一種編碼,我們可以簡單的理解為用乙個位寬10bit的資料來表示乙個位寬為8bit資料的編碼方式,但這種理解是直觀的感受,更是粗淺的解釋。
8b/10b編碼其實不僅提供給我們將8bit資料用10bit表示這樣一種編碼方式,更重要的是為我們高速序列傳輸提供了一種鏈路控制方式,因為它是一種通道編碼技術。
這裡又涉及到一共新的名詞,通道編碼。通道編碼是一門學科,代表人物有夏農前輩、漢明碼的發明人hamming等,編碼技術也是不勝列舉,曼切斯特編碼、卷積碼以及我們要說的8b/10b編碼等等。通道編碼又稱之為線路編碼,還可以稱之為差錯控制編碼,其目的就是消除訊號在傳輸過程中的干擾,讓訊號更乾淨,接收端能夠準確的解析出來。所以8b/10b編碼就是為實現上述目的所提供的一種編碼方式。
第三章 8b/10b編碼的作用
高速序列通訊的實現有這樣兩個難點,一是如何保證資料在傳輸中的質量,二是接收端如何從01中將資料恢復出來。當然,完成這項任務不是8b/10b編碼一人就可以解決的,需要群策群力。
8b/10b編碼的主要貢獻有兩個方面,一是盡可能的保證序列資料流中的0和1平衡,二是提供控制字元。下面我們就從這兩個方面來展開闡述。
保證0、1平衡,也就是0和1的個數差不多,再換句話說就是高電平和低電平的持續時間差不多。這是種說法很不專業哈,專用的說法叫直流平衡或者說dc平衡。為什麼需要dc平衡呢,這和高速序列通訊物理實現方式有關。
對於高速訊號的處理,可以使用直流耦合和交流耦合,對於高速序列通訊,若要實現遠距離通訊或者光通訊,則只能使用交流耦合的方式。例如xilinx的高速序列通訊模組gtp、gtx等,都有模擬前端afe,就是電流模式高速輸入差分緩衝器,如下圖所示。
我們曉得電容特性是「隔直通交」,如果資料流中長時間沒有電平翻轉,那麼必然會將其視為直流被阻斷造成極性偏差,也就是電勢差不滿足高低電平的判斷閾值,進而造成對接收電平訊號的誤判,進而導致接收資料出錯,如下圖所示。
看到這裡有沒有意識到8b/10b編碼的目的了?
如果是8bit資料,必然會出現全是0全是1的情況,而如果出現連續5個「1」或5個「0」,則會導致dc不平衡。所以我們要對這8bit資料進行編碼,換一種方式,這種方式既能表示出8bit數所表示的數值,又能保證0和1不會長時間沒有翻轉,所以8b/10b編碼應運而生。我們從10bit中挑出一些0和1差不多的來表示這256個資料,自然就能保證直流平衡。
這裡,可能有個疑問,為什麼要用10bit,而不是9bit或是11bit,因為這時在提高傳輸效率和保證傳輸質量間的最優解,可以體會下~
但凡接觸序列通訊的朋友,相比都知道k碼,用來實現據對齊到位元組/字、通道繫結等功能。記得在學習初期,看到使用者介面會在空閒時候發「bc」,當時我想破腦袋也沒想明白一件事,接收端是如何區分k碼和資料的。因為資料報裡也有bc這個值呀?之所以產生這樣的疑惑,是因為我簡單的把8b/10b編碼理解成給8bit資料填上2bit組成10bit數了。而實際不是填上,是從10bit這樣1024個數裡面挑出256個表示8bit資料,又從這1024個挑出12個來表示k碼。所以8b/10b編碼分為資料字元和控制字元兩類,通過這兩種型別資料的組合,我們就能從序列資料中將資料恢復出來。
另外,8b/10b編碼還有很多好處,例如有助於時鐘恢復,接收端需要根據我們傳送的資料通過cdr把時鐘恢復出來,只有提供足夠的電平翻轉,也能恢復出來也不至於pll失鎖。還能具有簡單的糾錯功能,如果檢出10bit數不少標誌規定編碼,則表示邊界未對其或資料存在問題。
本章來闡述下將8bit轉換為10bit編碼是如何實現的,轉換的目的是保證dc平衡,所有用10bit表示8bit的原則也是盡可能的從1024個裡面挑選出0和1差不多的,而且是01交替差不多的。但即便是1024個資料,0和1差不多且分布均勻的,也是少之又少,那我們怎麼實現呢?
ibm公司的al widmer和peterfranaszek為我們指定了編碼準則,首先將8bit原始資料差分兩個部分,低5bit是一組,可設為edcba,其值用x表示,x是十進位制數,高3bit作為一組,可設為hgf,其值用y表示,y也是十進位制數。我們如果表示的是資料,則用「d」表示,所以資料字元就可以表示為dx.y,例如十進位制40,則表示d2.8。控制字元是用k表示,我們稱之為k碼,或叫「comma」,其表示方法和資料字元方法一樣,即kx.y,例如我們比較常見的k28.5、k28.7。
可能有人問,為什麼要拆分5bit和3bit表示呢?因為1024個數還是太少,不拆分無法提供如此多的滿足條件的數,但要在保證dc平衡的前提下盡可能的提高傳輸速率,所以就得在設計上多花些心思了。
可能又有人會問,為什麼要拆分5bit和3bit就能保證dc平衡呢?上文我們提到,如果出現連續5個1或0就會造成極性偏差,而序列資料只有0和1。所以我們不僅要保證本組編碼後的10bit數沒有連續這麼多0或1,也要保住和上一組連在一起沒有這麼多0或1。採用這樣「小資料段」的編碼方式對硬體來講更好實現,我們從6bit挑出不超過5個連續0和1的,從4bit資料挑出不超過3個連續0和1的,讓它組合起來更有利於我們實現上述目的。那麼,它們是怎麼組合呢?保證組合起來沒有超過連續個0或1,我們先看下圖,這是3b/4b和5b/6b的編碼表
我們可以看到有些數不止有一種編碼方式,而且還有「rd=-1」和「rd=+1」這的標識,這是什麼意思呢?
這又引入了乙個新的名詞,叫做「rd」,全稱running disparity,叫做執行不一致性,也就是我們上文提到的極性偏差。這個用來衡量編碼資料的不平衡度,所謂的不平衡度就是編碼資料中「1」的個數減去「0」的個數後的差值,如果是整數,成為極性為正的編碼資料,也就是「rd=+1」,反之「rd=-1」。如果0和1一樣多,則分三種情況,例如「111000」、「1100」為正極性,「000111」「0011」為負極性,其他情況為中性。
這裡有朋友可能疑惑,是不是說反了,上表中「rd=-1」的明明是1比0多呀?!沒有說反,我們看rd這一欄的左邊對應的是「input」,也就是說輸入如果是「rd=+1」,那麼就要選擇0比1多的,這就揭示了為什麼要分正、負、中極性、3b/4b和5b/6b的組合方式以及上組編碼與下組編碼的規律。
舉例來說,例如8b的「0」,如果6b編碼0是「100111」那麼4b編碼選什麼呢?當然是「0100」更好了,雖說選哪個都沒有連續5個0和1,但明顯「0100」更均衡,例如d7.4,如果選錯就造成了5個0了。所以雖說對0的編碼有4種組合,實際上只有兩組可用的,而這就是極性平衡的要求。如下圖就是部分編碼組合出來的結果
這裡有區分了兩組情況,「rd-」和「rd+」,這和6b、4b組合一樣,如果本組是rd-,那麼下組選擇rd+,當然也有種情況,就是6b和4b編碼中0和1的個數一樣多,如下圖,那麼選那組就無所謂了。
現在有沒有感覺出這個「rd」的作用,就是方便我們進行資料流極性的控制,6b是r-,那麼4b就選r+,上組是r-,那麼下組就選r+。這裡有一點還需要注意,上表中的「-1」不是0比1多1個,而是表示一種狀態,無論是6b、4b還是10b,都不可能出現0和1之間差乙個,只會出現多兩個、少兩個和一樣多。如果出現其他情況,則說明是有問題的。
接下來我們簡單說下k碼,也就是控制碼,有的地方稱之為「逗號」或者「comma」。如下圖所示12個k碼,我們可以用它表示不同的狀態
如下圖所示,在資料流中不同的k碼充當不同的角色,在資料恢復時,我們可以通過尋找k28.7來實現位元組對齊,識別到k28.1準備接收資料,並在這不同階段可以產生不同的狀態訊號。
8b/10b編碼的機制介紹完了,如何進行程式設計就不贅述了,而且現在很多硬核都實現了該功能,無需我們去敲**。
當我學習完8b/10b編碼後,不得不佩服前輩大牛們的智慧型,通過如此巧妙的方式就解決了高速序列通訊中的諸多問題。
其實在我工作中,8b/10b編碼用的不是很多,但依舊可以從中學到很多。
B 數的插入實現
include include include include include include include include using namespace std 徐struct treenode void printdata return result bool findvalue int v...
B樹 B TREE的實現
b樹又叫平衡多路查詢樹,是一種組織和維護外存檔案系統非常有效的資料結構 一棵m階的b樹 m叉樹 的特性如下 樹中每個結點最多含有m個孩子 m 2 除根結點和葉子結點外,其它每個結點至少有 ceil m 2 m 1 2個孩子 其中ceil x 是乙個取上限的函式 若根結點不是葉子結點,則至少有2個孩子...
B10 git的簡單使用
一 為專案建立本地倉庫 1 到專案根目錄下 cd gittest 2 初始化倉庫 git init 3 建立readme檔案 touch readme 4 將所有檔案新增到git追蹤 git add 5 將檔案提交到本地倉庫 也可以在xcode進行 git commit m 一些說明 二 遠端倉庫使...