使用序列比並行匯流排可以節省更多的佈線空間,晶元、電纜等的尺寸可以做得更小,同時傳輸速率更高。但是,在很多數字系統如cpu、dsp、fpga等內部,進行資料處理的最小單位都是byte,即8個bit,如何把乙個或多個byte的資料通過序列匯流排可靠地傳輸出去是需要對資料做些特殊處理的。
並串轉換與串並轉換
這種並串轉換方法由於不涉及的訊號編譯碼,結構簡單,效率較高,但是需要收發端進行精確的時鐘同步以控制訊號的復用和解復用操作,因此需要專門的時鐘傳輸通道,而且序列訊號上一旦出現比較大的抖動就會造成串並轉換的錯誤。
因此,這種簡單的並串轉換方式一般用於比較關注傳輸效率的晶元間的短距離互連或者一些光端機訊號的傳輸中。另外由於訊號沒有經過任何編碼,訊號中可能會出現比較長的連續的0或者連續的1,因此訊號必須採用直流耦合方式,收發端一旦存在比較大的共模或地雜訊,會嚴重影響訊號質量,因此這種並串轉換方式用於電訊號傳輸時或者傳輸速率不太高(通常<1gb/s),或者傳輸距離不太遠( 通常<50cm)。
8b/10b資料編碼
為了提高序列資料傳輸的可靠性,現在很多更高速率的數字介面採用的是對資料進行編碼後再做並串轉換的方式。編碼的方式有很多,如8b/9b編碼、8b/10b編碼、64b/66b編碼、128b/130b編碼等,下面我們以最流行的ansi 8b/10b編碼為例進行一下介紹。
在ansi 8b/10b編碼方式中,8位元的資料先通過相應的編碼規則轉換成10位元的資料,然後再進行並串轉換;接收端收到訊號後先把序列資料進行串並轉換得到10位元的資料,然後再通過10位元到8位元的解碼得到原始傳輸的8位元資料。因此,如果傳送端並行側的資料速率是8bit100mb/s,通過8b/10b編碼和並串轉換後的序列側的資料速率就是1bit1gb/s。8b/10b編碼方法最早由ibm發明,後來成為ansi標準的一部分(ansi x3.230-1994, clause 11),並在通訊和計算機匯流排上廣泛應用。下圖是ansi 8b/10b編碼表的一部分,以資料0x00為例,其原始的8bit資料是0b00000000,經過編碼後就變成了0b1001110100或者0b0110001011。
8b/10b編碼的好處:
有足夠多的跳變沿,可以從資料裡進行時鐘恢復。正常傳輸的資料裡可能會有比較長的連續的0或者連續的1,而進行完8b/10b編碼後,其編碼規則保證了編碼後的資料流裡不會出現超過5個的連續的0或1,訊號裡會出現足夠多的跳變沿,因此可以取樣嵌入式的時鐘方式,即接收端可以從資料流裡用pll電路直接恢復時鐘,不需要專門的時鐘傳輸通道。
直流平衡,可以採用ac耦合方式。經過編碼後資料裡不會出現連續的0或者1了,但是還是有可能在某個時間段內0或者1的數量偏多一些。從上面的編碼表中我們可以看到同乙個byte對應有正、負兩組10bit的編碼,乙個編碼裡1的數量多一些,另乙個編碼裡0的數量多一些。資料在對當前的byte進行8b/10b編碼傳輸時,會根據前面歷史傳輸的資料中正負bit的數量來選擇使用哪一組編碼,從而可以保證匯流排上正負bit的數量在任何時刻基本都是平衡的,也就是直流點不會發生大的變化。直流點平衡以後,在訊號傳輸的路徑上我們就可以採用ac耦合方式(最常用的方法是在傳送端或接收端串接隔直電容),這樣訊號對於收發端的地電平變化和共模雜訊的抵抗能力進一步增強,可以傳輸更遠的距離。採用ac耦合方式的另乙個好處是收發端在做互連時不用太考慮直流偏置點的互相影響,互連變得非常簡單,對於熱插拔的支援能力也更好。
有利於訊號校驗。很多高速訊號在做傳輸時為了保證傳輸的可靠性要對接收到的訊號進行檢查以確認收到的訊號是否正確。在8b/10bit編碼表裡,原始的8bit資料總共有256個組合,即使考慮到每個byte有正負兩個10bit編碼也只需要用到512個10bit的組合。而10bit的資料總共可以有1024個組合,因此有大約一半的10bit組合是無效的資料,接收端一旦收到這樣的無效組合就可以判決資料無效。另外,前面我們介紹過資料在傳輸過程中是要保證直流平衡的,一旦接收端收到的資料中發現違反直流平衡的規則,也可以判決資料無效。因此採用8b/10b編碼以後資料本身就可以提供一定的訊號校驗功能。不過需要注意的是,這種校驗不是足夠可靠,因為理論上還是可能存在有幾個bit在傳輸中發生了錯誤但是結果仍然符合8b/10b編碼和規則和直流平衡原則。因此,很多使用8b/10b編碼的匯流排都還會在上層協議上再做相應的crc校驗(迴圈冗餘校驗)。
可以插入控制字元。在10bit資料可以表示的1024個組合中,除了512個組合用於對應原始的8bit資料以及一些不太好的組合(比如0b1100000000這樣訊號裡有太長的連續0或者1而且明顯0、1的數量不平衡)以外,還有一些很特殊的組合。這些特殊的組合可以用來在資料傳輸過程中做為控制字元插入(如下圖所示)。這些控制字元不對應特定的8bit資料,但是在有些匯流排應用裡可以代表一些特殊的含義。比如k28.5碼型,其特殊的碼型組合可以幫助接收端更容易判別接收到的連續的10bit資料流的符號邊界,所以在一些匯流排的初始化階段或資料報的包頭都會進行傳送。還有一些特殊的符號用於進行鏈路訓練、標記不同的資料報型別、進行收發端的時鐘速率匹配等。
綜上所述,要把並行的訊號通過序列匯流排傳輸,一般需要對資料進行並串轉換。為了進一步減少傳輸線的數量和提高傳輸距離,很多高速資料匯流排採用嵌入式時鐘和8b/10b的資料編碼方式。8b/10b編碼由於直流平衡、支援ac耦合、可嵌入時鐘資訊、抗共模干擾能力強、編譯碼結構相對簡單等優點,在很多高速的數字匯流排如fiberchannel、pci-e、sata、usb3.0、displayport、xaui、rapidio等介面上得到廣泛應用。下圖是一路序列的2.5gbps的8b/10b編碼後的資料流以及相應的解碼結果,從中我們可以明顯看到從裡面解出的k28.5等控制碼以及相應的資料資訊。
8b/10b編碼的缺點
需要注意的是,採用8b/10b編碼方式也是有缺點的,最大的缺點就是8bit到10bit的編碼會造成額外的20%的編碼開銷。比如對於乙個採用8b/10b編碼的5gbps的序列匯流排來說,其有效的資料傳輸速率只有4gbps,也就是說僅為了進行4gbps的訊號傳輸就需要把匯流排的資料速率提高到5gbps。相應地,如果要進行8gbps的有效資料傳輸就需要把匯流排的資料速率提高到10gbps,而10gbps相對與8gbps的資料速率來說,對於硬體人員的設計經驗、接外掛程式、板材都有比較高的要求,所以很多10g左右或更高速率的匯流排都不再使用8b/10b編碼方式。比如pci-e1.0和pci-e2.0的匯流排速率分別為2.5gbps和5gbps,都是採用8b/10b編碼,而pci-e3.0的匯流排就捨棄了8b/10b的編碼方式,資料速率為8gbps,是通過效率更高的128b/130b的編碼結合更複雜的擾碼的方法來實現直流平衡和嵌入式時鐘的。另乙個例子是fibrechannel匯流排,1xfc、2xfc、4xfc、8xfc的資料速率分別為1.0625gbps、2.125gbps、4.25gbps、8.5gbps,都是採用8b/10b編碼,而16xfc、32xfc的資料速率分別為14.025gbps和28.05gbps,採用的是效率更高的64b/66b編碼方式。
ANSI與UTF 8編碼轉換
將ansi編碼裝換為utf 8在windows mfc環境下測試下面的 static int ansi2utf8 in const char csrc,out char cdest 以下 將utf 8 轉換為gb2312 intutf8togb2312 const char sourcebuf,si...
utf8與ansi之間的轉換
include stdafx.h include include include include include include namespace fs boost filesystem const int count 1024 const std string ret success succe...
linux C gbk utf 8編碼轉換
用linux c 下的函式呼叫建立中文目錄 檔案等,字串的編碼格式要求是utf 8格式的。比如想要使用 int mkdir const char pathname,mode t mode 建立乙個中文的目錄。那麼pathname的編碼格式要求是utf 8的,而不能是gb3212 gbk的,否則就是亂...