吴忠躺衫网络科技有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

高速串行通信常用的編碼方式-8b/10b編碼/解碼解析

OpenFPGA ? 來源:OpenFPGA ? 作者:碎碎思 ? 2021-09-26 09:56 ? 次閱讀

論序

8b/10b編碼/解碼是高速串行通信,如PCle SATA(串行ATA),以及Fiber Channel中常用的編解碼方式。在發送端,編碼電路將串行輸入的8比特一組的數據轉變成10比特一組的數據并輸出;在接收端,解碼器將10比特一組的輸入數據轉換成8比特一組的輸出數據。編碼和解碼采用相同算法,整個過程就是8b/10b編碼/解碼過程。

這種編碼方式的0-1、1-0跳變豐富,0和1分布均勻,不會出現長連0和長連1。例如,8b/10b編碼比特流中連續出現的0或1的最大數量是5。這有助于為數據流提供DC平衡,可以為接收端時鐘恢復提供足夠的比特翻轉(1-0,0-1)。在1983年,這種編碼方式首次由IBM工程師奧爾?韋迪莫和皮特?弗蘭斯科發明,之后IBM申請了發明專利。

8b/10b編碼方式

進行8b/10b編碼時,輸入的每8比特數據轉化為10比特數據,這10比特數據稱為一個編碼符號或編碼字符,如圖6.20所示。

編碼時,將8比特數據分成兩個子組,即低5位子組和高3位子組。低5位編碼后為一個6比特值,高3位編碼后為一個4比特值,此后將二者拼接,可以得到一個10比特字符。對于8比特輸人,會有256種可能的組合,然而對于10比特,就會有1024(1K)種組合,除了有過多連0和連1的編碼組合被丟棄不用外,還要選擇部分10比特組合作為控制字符,或者稱為K字符。

這些特殊的控制符具有不同用途,例如,作為包的開始標識、包的結束標識,以及特殊COMMA符號。還有一些編碼字符既不屬于控制字符也不屬于和256種8比特輸入數據對應的編碼字符,它們都是非法字符,正常工作時不會出現在編碼比特字符流中。在數據傳輸出錯時可能會出現非法字符。圖6.20詳細介紹了低5比特和高3比特轉換成10比特編碼字符的具體方式。

多字節8b/10b編碼

在一些應用中,每個時鐘周期需要對多字節進行編碼。圖6.21是對16比特數據進行8b/10b編碼的一種實現方案,它可以在每個時鐘周期進行兩字節數據的8b/10b編碼。

56a6f75a-1111-11ec-8fb8-12bb97331649.png

編碼器1輸岀的disparity信號被當成編碼器2的disparity輸入。兩個編碼器的編碼和disparity計算在相同的時鐘周期內進行。最終的disparity(編碼器2的輸出)經過一個寄存器后作為16比特數據的disparity,也就是當前運行的disparity,同時它還作為編碼器1下一個時鐘周期的disparity輸入。

disparity選擇8b/10b編碼方案

當進行8b/10b編碼的并行數據字節數增加時(例如,4字節),編碼延遲會增大,從而使編碼器不能滿足高速工作時的定時要求。對于四級級聯譯碼器來說,最后一級的disparity和10b編碼結果的計算延遲最大。計算disparity的邏輯處于關鍵延遲路徑上,只有等前面各級計算結束后才能計算組后一級的disparity值。改進定時特性,提高編碼速度的一種重要方法是采用disparity選擇機制。

圖6.22給出了disparity選擇編碼電路的結構。對除第一級之外的每一級編碼器,單獨計算每一級的disparity值,包括一個正disparity值和一個負disparity值,最終的disparity值需要根據前一級的輸出進行選擇,由于選擇器的延遲小于disparity計算邏輯,因此這種方法可以提高電路的工作速度。這種方案由于增加了disparity十算電路的數量,因此會消耗更多的邏輯電路資源。

56c86bc4-1111-11ec-8fb8-12bb97331649.png

代碼舉例

端口說明

##Encoder###Ports

*`clk`-inputClock
*`rst`-inputReset(Active-HIGH)
*`en`-inputEnable(Active-HIGH)
*`kin`-K-orD-symbolselection(`1-K`,`0-D`)
*`din`-8-bitdatainput
*`dout`-10-bitdataoutput
*`disp`-Disparityflagoutput
*`kin_err`-K-symbolerroroutput

##Decoder###Ports

*`clk`-inputClock
*`rst`-inputReset(Active-HIGH)
*`en`-inputEnable(Active-HIGH)
*`din`-10-bitdatainput
*`dout`-8-bitdataoutput
*`kout`-K-orD-symbolflag(`1-K`,`0-D`)
*`code_err`-Codeerrorflagoutput
*`disp`-Disparityoutput
*`disp_err`-Disparityerrorflagoutput

decoder_8b10b.v

`timescale1ns/1ps
//////////////////////////////////////////////////////////////////////////////////
//Company:
//Engineer:DmitryMatyunin(https://github.com/mcjtag)
//
//CreateDate:06.04.20212330
//DesignName:
//ModuleName:decoder_8b10b
//ProjectName:v8b10b
//TargetDevices:
//ToolVersions:
//Description:
//
//Dependencies:
//
//Revision:
//Revision0.01-FileCreated
//AdditionalComments:
//
//////////////////////////////////////////////////////////////////////////////////

moduledecoder_8b10b(
inputwireclk,
inputwirerst,
inputwireen,
inputwire[9:0]din,
outputwire[7:0]dout,
outputwirekout,
outputwirecode_err,
outputwiredisp,
outputwiredisp_err
);

reg[7:0]do;
regk;
regce;
reg[2:0]e;
regp;
reg[3:0]pe;
wire[9:0]d;

assignd=din;
assigndisp_err=pe?1'b1:1'b0;
assigndout=do;
assignkout=k;
assigncode_err=ce;
assigndisp=p;

always@(posedgeclk)begin
if(rst)begin
k<=?0;
??do<=?8'b0;
endelsebegin
if(en==1'b1)begin
k<=?(((d[7]&d[6]&d[5]&d[4])|(!d[7]&!d[6]&!d[5]&!d[4]))|(((!((d[9]&d[8])|(!d[9]&!d[8]))&!d[7]&!d[6])|(!((d[7]&d[6])|(!d[7]&!d[6]))&!d[9]&!d[8]))&(!d[5]&d[4]&d[2]&d[1]&d[0]))|(((!((d[9]&d[8])|(!d[9]&!d[8]))&d[7]&d[6])|(!((d[7]&d[6])|(!d[7]&!d[6]))&d[9]&d[8]))&(d[5]&!d[4]&!d[2]&!d[1]&!d[0])));
???do[7]<=?((d[0]^d[1])&!((!d[3]&d[2]&!d[1]&d[0]&!(!(d[7]|d[6]|d[5]|d[4])))|(!d[3]&d[2]&d[1]&!d[0]&(!(d[7]|d[6]|d[5]|d[4])))|(d[3]&!d[2]&!d[1]&d[0]&!(!(d[7]|d[6]|d[5]|d[4])))|(d[3]&!d[2]&d[1]&!d[0]&(!(d[7]|d[6]|d[5]|d[4])))))|(!d[3]&d[2]&d[1]&d[0])|(d[3]&!d[2]&!d[1]&!d[0]);
???do[6]<=?(d[0]&!d[3]&(d[1]|!d[2]|!(!(d[7]|d[6]|d[5]|d[4]))))|(d[3]&!d[0]&(!d[1]|d[2]|(!(d[7]|d[6]|d[5]|d[4]))))|(!(!(d[7]|d[6]|d[5]|d[4]))&d[2]&d[1])|((!(d[7]|d[6]|d[5]|d[4]))&!d[2]&!d[1]);
???do[5]<=?(d[0]&!d[3]&(d[1]|!d[2]|(!(d[7]|d[6]|d[5]|d[4]))))|(d[3]&!d[0]&(!d[1]|d[2]|!(!(d[7]|d[6]|d[5]|d[4]))))|((!(d[7]|d[6]|d[5]|d[4]))&d[2]&d[1])|(!(!(d[7]|d[6]|d[5]|d[4]))&!d[2]&!d[1]);
???do[4]<=?d[5]^(((((!((d[9]&d[8])|(!d[9]&!d[8]))&!d[7]&!d[6])|(!((d[7]&d[6])|(!d[7]&!d[6]))&!d[9]&!d[8]))&!d[5])|(!d[7]&!d[6]&!d[5]&!d[4])|(!d[9]&!d[8]&!d[5]&!d[4]))|((((d[9]&d[8]&!d[7]&!d[6])|(d[7]&d[6]&!d[9]&!d[8])|(!((d[9]&d[8])|(!d[9]&!d[8]))&!((d[7]&d[6])|(!d[7]&!d[6]))))&!d[9]&!d[7]&(!(d[5]^d[4])))|(((!((d[9]&d[8])|(!d[9]&!d[8]))&!d[7]&!d[6])|(!((d[7]&d[6])|(!d[7]&!d[6]))?&?!d[9]?&?!d[8]))&!d[4]))|((((!((d[9]&d[8])|(!d[9]&!d[8]))&!d[7]&!d[6])|(!((d[7]&d[6])|(!d[7]&!d[6]))&!d[9]&!d[8]))&d[6]&d[5]&d[4])|(((d[9]&d[8]&!d[7]&!d[6])|(d[7]&d[6]&!d[9]&!d[8])|(!((d[9]&d[8])|(!d[9]&!d[8]))&!((d[7]&d[6])|(!d[7]&!d[6]))))&!d[8]&!d[7]&(!(d[5]^d[4])))));
???do[3]<=?d[6]^(((d[9]&d[8]&d[5]&d[4])|(!d[7]&!d[6]&!d[5]&!d[4])|(((!((d[9]&d[8])|(!d[9]&!d[8]))&d[7]&d[6])|(!((d[7]&d[6])|(!d[7]&!d[6]))&d[9]&d[8]))&d[4]))|((((d[9]&d[8]&!d[7]&!d[6])|(d[7]&d[6]&!d[9]&!d[8])|(!((d[9]&d[8])|(!d[9]&!d[8]))&!((d[7]&d[6])|(!d[7]&!d[6]))))&d[9]&d[7]&(!(d[5]^d[4])))|(((!((d[9]&d[8])|(!d[9]&!d[8]))&!d[7]&!d[6])|(!((d[7]&d[6])|(!d[7]&!d[6]))&!d[9]&!d[8]))&!d[5]))|((((!((d[9]&d[8])|(!d[9]&!d[8]))&!d[7]&!d[6])|(!((d[7]&d[6])|(!d[7]&!d[6]))&!d[9]&!d[8]))&d[6]&d[5]&d[4])|(((d[9]&d[8]&!d[7]&!d[6])|(d[7]&d[6]&!d[9]&!d[8])|(!((d[9]&d[8])|(!d[9]&!d[8]))&!((d[7]&d[6])|(!d[7]&!d[6]))))&!d[8]&!d[7]&(!(d[5]^d[4])))));
???do[2]<=?d[7]^(((((d[9]&d[8]&!d[7]&!d[6])|(d[7]&d[6]&!d[9]&!d[8])|(!((d[9]&d[8])|(!d[9]&!d[8]))&!((d[7]&d[6])|(!d[7]&!d[6]))))&!d[9]&!d[7]&(!(d[5]^d[4])))|(((!((d[9]&d[8])|(!d[9]&!d[8]))&!d[7]&!d[6])|(!((d[7]&d[6])|(!d[7]&!d[6]))&!d[9]&!d[8]))&!d[5]))|((((!((d[9]&d[8])|(!d[9]&!d[8]))&d[7]&d[6])|(!((d[7]&d[6])|(!d[7]&!d[6]))&d[9]&d[8]))&d[4])|(((d[9]&d[8]&!d[7]&!d[6])|(d[7]&d[6]&!d[9]&!d[8])|(!((d[9]&d[8])|(!d[9]&!d[8]))&!((d[7]&d[6])|(!d[7]&!d[6]))))&d[8]&d[7]&(!(d[5]^d[4])))|(((!((d[9]&d[8])|(!d[9]&!d[8]))&!d[7]&!d[6])|(!((d[7]&d[6])|(!d[7]&!d[6]))&!d[9]&!d[8]))&d[6]&d[5]&d[4]))|((((!((d[9]&d[8])|(!d[9]&!d[8]))&!d[7]&!d[6])|(!((d[7]&d[6])|(!d[7]&!d[6]))&!d[9]&!d[8]))&!d[5])|(!d[7]&!d[6]&!d[5]&!d[4])|(!d[9]&!d[8]&!d[5]&!d[4])));
???do[1]<=?d[8]^(((d[9]&d[8]&d[5]&d[4])|(!d[7]&!d[6]&!d[5]&!d[4])|(((!((d[9]&d[8])|(!d[9]&!d[8]))&d[7]&d[6])|(!((d[7]&d[6])|(!d[7]&!d[6]))&d[9]&d[8]))&d[4]))|((((!((d[9]&d[8])|(!d[9]&!d[8]))&d[7]&d[6])|(!((d[7]&d[6])|(!d[7]&!d[6]))&d[9]&d[8]))&d[4])|(((d[9]&d[8]&!d[7]&!d[6])|(d[7]&d[6]&!d[9]&!d[8])|(!((d[9]&d[8])|(!d[9]&!d[8]))&!((d[7]&d[6])|(!d[7]&!d[6]))))&d[8]&d[7]&(!(d[5]^d[4])))|(((!((d[9]&d[8])|(!d[9]&!d[8]))&!d[7]&!d[6])|(!((d[7]&d[6])|(!d[7]&!d[6]))&!d[9]&!d[8]))&d[6]&d[5]&d[4]))|((((d[9]&d[8]&!d[7]&!d[6])|(d[7]&d[6]&!d[9]&!d[8])|(!((d[9]&d[8])|(!d[9]&!d[8]))&!((d[7]&d[6])|(!d[7]&!d[6]))))&d[9]&d[7]&(!(d[5]^d[4])))|(((!((d[9]&d[8])|(!d[9]&!d[8]))&!d[7]&!d[6])|(!((d[7]&d[6])|(!d[7]&!d[6]))&!d[9]&!d[8]))&!d[5])));
???do[0]<=?d[9]^(((((!((d[9]&d[8])|(!d[9]&!d[8]))&!d[7]&!d[6])|(!((d[7]&d[6])|(!d[7]&!d[6]))&!d[9]&!d[8]))&d[6]&d[5]&d[4])|(((d[9]&d[8]&!d[7]&!d[6])|(d[7]&d[6]&!d[9]&!d[8])|(!((d[9]&d[8])|(!d[9]&!d[8]))&!((d[7]&d[6])|(!d[7]&!d[6]))))&!d[8]&!d[7]&(!(d[5]^d[4]))))|((((d[9]&d[8]&!d[7]&!d[6])|(d[7]&d[6]&!d[9]&!d[8])|(!((d[9]&d[8])|(!d[9]&!d[8]))&!((d[7]&d[6])|(!d[7]&!d[6]))))&!d[9]&!d[7]&(!(d[5]^d[4])))|(((!((d[9]&d[8])|(!d[9]&!d[8]))&!d[7]&!d[6])|(!((d[7]&d[6])|(!d[7]&!d[6]))&!d[9]&!d[8]))&!d[5]))|((d[9]&d[8]&d[5]&d[4])|(!d[7]&!d[6]&!d[5]&!d[4])|(((!((d[9]&d[8])|(!d[9]&!d[8]))&d[7]&d[6])|(!((d[7]&d[6])|(!d[7]&!d[6]))&d[9]&d[8]))&d[4])));
??end
?end
end
???
always?@(posedge?clk)?begin
?if(rst)begin
p<=?1'b0;
pe<=?4'hF;
ce<=?1'b1;
e=3'b000;
endelsebegin
if(en==1'b1)begin
p<=?(((!((d[3]&d[2])|(!d[3]&!d[2])))&d[1]&d[0])|(!((d[1]&d[0])|(!d[1]&!d[0]))&d[3]&d[2]))|(((d[5]&d[4]&!(((!((d[9]&d[8])|(!d[9]&!d[8]))&!d[7]&!d[6])|(!((d[7]&d[6])|(!d[7]&!d[6]))&!d[9]&!d[8]))&!p))|((((!((d[9]&d[8])|(!d[9]&!d[8]))&d[7]&d[6])|(!((d[7]&d[6])|(!d[7]&!d[6]))&d[9]&d[8]))|(((d[9]&d[8]&!d[7]&!d[6])|(d[7]&d[6]&!d[9]&!d[8])|(!((d[9]&d[8])|(!d[9]&!d[8]))&!((d[7]&d[6])|(!d[7]&!d[6]))))&p))&(d[5]|d[4]))|(((!((d[9]&d[8])|(!d[9]&!d[8]))&d[7]&d[6])|(!((d[7]&d[6])|(!d[7]&!d[6]))&d[9]&d[8]))&p))&((d[3]&d[2]&!d[1]&!d[0])|(!d[3]&!d[2]&d[1]&d[0])|(!((d[3]&d[2])|(!d[3]&!d[2]))&!((d[1]&d[0])|(!d[1]&!d[0])))))?;
???pe[0]?<=?((p&((((!((d[9]&d[8])|(!d[9]&!d[8]))&d[7]&d[6])|(!((d[7]&d[6])|(!d[7]&!d[6]))&d[9]&d[8]))&(d[5]|d[4]))|(((d[9]&d[8]&!d[7]&!d[6])|(d[7]&d[6]&!d[9]&!d[8])|(!((d[9]&d[8])|(!d[9]&!d[8]))&!((d[7]&d[6])|(!d[7]&!d[6]))))&d[5]&d[4])))|(((((!((d[9]&d[8])|(!d[9]&!d[8]))&!d[7]&!d[6])|(!((d[7]&d[6])|(!d[7]&!d[6]))&!d[9]&!d[8]))&!(d[5]&d[4]))|(((d[9]&d[8]&!d[7]&!d[6])|(d[7]&d[6]&!d[9]&!d[8])|(!((d[9]&d[8])|(!d[9]&!d[8]))&!((d[7]&d[6])|(!d[7]&!d[6]))))&!d[5]&!d[4]))&!p))|((p&!((((!((d[9]&d[8])|(!d[9]&!d[8]))&!d[7]&!d[6])|(!((d[7]&d[6])|(!d[7]&!d[6]))&!d[9]&!d[8]))&!(d[5]&d[4]))|(((d[9]&d[8]&!d[7]&!d[6])|(d[7]&d[6]&!d[9]&!d[8])|(!((d[9]&d[8])|(!d[9]&!d[8]))&!((d[7]&d[6])|(!d[7]&!d[6]))))&!d[5]&!d[4]))&d[3]&d[2]));
???pe[1]?<=?((p&d[9]&d[8]&d[7]))|((p&!((((!((d[9]&d[8])|(!d[9]&!d[8]))&!d[7]&!d[6])|(!((d[7]&d[6])|(!d[7]&!d[6]))&!d[9]&!d[8]))&!(d[5]&d[4]))|(((d[9]&d[8]&!d[7]&!d[6])|(d[7]&d[6]&!d[9]&!d[8])|(!((d[9]&d[8])|(!d[9]&!d[8]))&!((d[7]&d[6])|(!d[7]&!d[6]))))&!d[5]&!d[4]))&(((!((d[3]&d[2])|(!d[3]&!d[2])))&d[1]&d[0])|(!((d[1]&d[0])|(!d[1]&!d[0]))&d[3]&d[2]))));
???pe[2]?<=?((!p&!((((!((d[9]&d[8])|(!d[9]&!d[8]))&d[7]&d[6])|(!((d[7]&d[6])|(!d[7]&!d[6]))&d[9]&d[8]))&(d[5]|d[4]))|(((d[9]&d[8]&!d[7]&!d[6])|(d[7]&d[6]&!d[9]&!d[8])|(!((d[9]&d[8])|(!d[9]&!d[8]))&!((d[7]&d[6])|(!d[7]&!d[6]))))&d[5]&d[4]))&!d[3]&!d[2]))|((!p&!d[9]&!d[8]&!d[7]));
???pe[3]?<=?((!p&!((((!((d[9]&d[8])|(!d[9]&!d[8]))&d[7]&d[6])|(!((d[7]&d[6])|(!d[7]&!d[6]))&d[9]&d[8]))&(d[5]|d[4]))|(((d[9]&d[8]&!d[7]&!d[6])|(d[7]&d[6]&!d[9]&!d[8])|(!((d[9]&d[8])|(!d[9]&!d[8]))&!((d[7]&d[6])|(!d[7]&!d[6]))))&d[5]&d[4]))&((!((d[3]&d[2])|(!d[3]&!d[2]))&!d[1]&!d[0])|(!((d[1]&d[0])|(!d[1]&!d[0]))&!d[3]&!d[2]))))|((((((!((d[9]&d[8])|(!d[9]&!d[8]))&d[7]&d[6])|(!((d[7]&d[6])|(!d[7]&!d[6]))&d[9]&d[8]))&(d[5]|d[4]))|(((d[9]&d[8]&!d[7]&!d[6])|(d[7]&d[6]&!d[9]&!d[8])|(!((d[9]&d[8])|(!d[9]&!d[8]))&!((d[7]&d[6])|(!d[7]&!d[6]))))&d[5]&d[4]))&(((!((d[3]&d[2])|(!d[3]&!d[2])))&d[1]&d[0])|(!((d[1]&d[0])|(!d[1]&!d[0]))&d[3]&d[2])))|(((((!((d[9]&d[8])|(!d[9]&!d[8]))&!d[7]&!d[6])|(!((d[7]&d[6])|(!d[7]&!d[6]))&!d[9]&!d[8]))&!(d[5]&d[4]))|(((d[9]&d[8]&!d[7]&!d[6])|(d[7]&d[6]&!d[9]&!d[8])|(!((d[9]&d[8])|(!d[9]&!d[8]))&!((d[7]&d[6])|(!d[7]&!d[6]))))&!d[5]&!d[4]))&((!((d[3]&d[2])|(!d[3]&!d[2]))&!d[1]&!d[0])|(!((d[1]&d[0])|(!d[1]&!d[0]))&!d[3]&!d[2]))));
???e[0]?<=?((d[9]&d[8]&d[7]&d[6])|(!d[9]&!d[8]&!d[7]&!d[6]))|((((!((d[9]&d[8])|(!d[9]&!d[8]))&!d[7]&!d[6])|(!((d[7]&d[6])|(!d[7]&!d[6]))&!d[9]&!d[8]))&!d[5]&!d[4]))|((((!((d[9]&d[8])|(!d[9]&!d[8]))&d[7]&d[6])|(!((d[7]&d[6])|(!d[7]&!d[6]))&d[9]&d[8]))&d[5]&d[4]))|((d[3]&d[2]&d[1]&d[0])|(!d[3]&!d[2]&!d[1]&!d[0]))|((d[5]&d[4]&d[3]&d[2]&d[1])|(!d[5]&!d[4]&!d[3]&!d[2]&!d[1]))|((d[5]&!d[4]&d[2]&d[1]&d[0])|(!d[5]&d[4]&!d[2]&!d[1]&!d[0]))|((((d[5]&d[4]&!d[2]&!d[1]&!d[0])|(!d[5]&!d[4]&d[2]&d[1]&d[0]))&!((d[7]&d[6]&d[5])|(!d[7]&!d[6]&!d[5]))))|((!((!((d[9]&d[8])|(!d[9]&!d[8]))&d[7]&d[6])|(!((d[7]&d[6])|(!d[7]&!d[6]))&d[9]&d[8]))&d[5]&!d[4]&!d[2]&!d[1]&!d[0]))|((!((!((d[9]&d[8])|(!d[9]&!d[8]))&!d[7]&!d[6])|(!((d[7]&d[6])|(!d[7]&!d[6]))&!d[9]&!d[8]))&!d[5]&d[4]&d[2]&d[1]&d[0]));
???e[1]?<=?((((((!((d[9]&d[8])|(!d[9]&!d[8]))&d[7]&d[6])|(!((d[7]&d[6])|(!d[7]&!d[6]))&d[9]&d[8]))&(d[5]|d[4]))|(((d[9]&d[8]&!d[7]&!d[6])|(d[7]&d[6]&!d[9]&!d[8])|(!((d[9]&d[8])|(!d[9]&!d[8]))&!((d[7]&d[6])|(!d[7]&!d[6]))))&d[5]&d[4]))&(((!((d[3]&d[2])|(!d[3]&!d[2])))&d[1]&d[0])|(!((d[1]&d[0])|(!d[1]&!d[0]))&d[3]&d[2])))|(((((!((d[9]&d[8])|(!d[9]&!d[8]))&!d[7]&!d[6])|(!((d[7]&d[6])|(!d[7]&!d[6]))&!d[9]&!d[8]))&!(d[5]&d[4]))|(((d[9]&d[8]&!d[7]&!d[6])|(d[7]&d[6]&!d[9]&!d[8])|(!((d[9]&d[8])|(!d[9]&!d[8]))&!((d[7]&d[6])|(!d[7]&!d[6]))))&!d[5]&!d[4]))&((!((d[3]&d[2])|(!d[3]&!d[2]))&!d[1]&!d[0])|(!((d[1]&d[0])|(!d[1]&!d[0]))&!d[3]&!d[2]))))|((d[3]&d[2]&!d[1]&!d[0]&((((!((d[9]&d[8])|(!d[9]&!d[8]))&d[7]&d[6])|(!((d[7]&d[6])|(!d[7]&!d[6]))&d[9]&d[8]))&(d[5]|d[4]))|(((d[9]&d[8]&!d[7]&!d[6])|(d[7]&d[6]&!d[9]&!d[8])|(!((d[9]&d[8])|(!d[9]&!d[8]))&!((d[7]&d[6])|(!d[7]&!d[6]))))&d[5]&d[4]))))|((!d[3]&!d[2]&d[1]&d[0]&((((!((d[9]&d[8])|(!d[9]&!d[8]))&!d[7]&!d[6])|(!((d[7]&d[6])|(!d[7]&!d[6]))&!d[9]&!d[8]))&!(d[5]&d[4]))|(((d[9]&d[8]&!d[7]&!d[6])|(d[7]&d[6]&!d[9]&!d[8])|(!((d[9]&d[8])|(!d[9]&!d[8]))&!((d[7]&d[6])|(!d[7]&!d[6]))))&!d[5]&!d[4]))));
???e[2]?<=?((d[9]&d[8]&d[7]&!d[5]&!d[4]&((!d[3]&!d[2])|((!((d[3]&d[2])|(!d[3]&!d[2]))&!d[1]&!d[0])|(!((d[1]&d[0])|(!d[1]&!d[0]))&!d[3]&!d[2])))))|((!d[9]&!d[8]&!d[7]&d[5]&d[4]&((d[3]&d[2])|(((!((d[3]&d[2])|(!d[3]&!d[2])))&d[1]&d[0])|(!((d[1]&d[0])|(!d[1]&!d[0]))&d[3]&d[2])))))|((d[7]&d[6]&d[5]&d[4]&!d[3]&!d[2]&!d[1]))|((!d[7]&!d[6]&!d[5]&!d[4]&d[3]&d[2]&d[1]));
???ce?<=?e???1'b1:1'b0;
end
end
end

endmodule

encoder_8b10.v

`timescale1ns/1ps
//////////////////////////////////////////////////////////////////////////////////
//Company:
//Engineer:DmitryMatyunin(https://github.com/mcjtag)
//
//CreateDate:06.04.20212328
//DesignName:
//ModuleName:encoder_8b10
//ProjectName:v8b10b
//TargetDevices:
//ToolVersions:
//Description:
//
//Dependencies:
//
//Revision:
//Revision0.01-FileCreated
//AdditionalComments:
//
//////////////////////////////////////////////////////////////////////////////////

moduleencoder_8b10
(
inputwireclk,
inputwirerst,
inputwireen,
inputwirekin,
inputwire[7:0]din,
outputwire[9:0]dout,
outputwiredisp,
outputwirekin_err
);

regp;
regke;
reg[18:0]t;
reg[9:0]do;
wire[7:0]d;
wirek;

assignd=din;
assignk=kin;

assigndout=do;
assigndisp=p;
assignkin_err=ke;

always@(posedgeclk)begin
if(rst)begin
p<=?1'b0;
ke<=?1'b0;
do<=?10'b0;
endelsebegin
if(en==1'b1)begin
p<=?((d[5]&d[6]&d[7])|(!d[5]&!d[6]))^(p^(((d[4]&d[3]&!d[2]&!d[1]&!d[0])|(!d[4]&!((d[0]&d[1]&!d[2]&!d[3])|(d[2]&d[3]&!d[0]&!d[1])|(!((d[0]&d[1])|(!d[0]&!d[1]))&!((d[2]&d[3])|(!d[2]&!d[3]))))&!((!((d[0]&d[1])|(!d[0]&!d[1]))&d[2]&d[3])|(!((d[2]&d[3])|(!d[2]&!d[3]))&d[0]&d[1]))))|(k|(d[4]&!((d[0]&d[1]&!d[2]&!d[3])|(d[2]&d[3]&!d[0]&!d[1])|(!((d[0]&d[1])|(!d[0]&!d[1]))&!((d[2]&d[3])|(!d[2]&!d[3]))))&!((!((d[0]&d[1])|(!d[0]&!d[1]))&!d[2]&!d[3])|(!((d[2]&d[3])|(!d[2]&!d[3]))&!d[0]&!d[1]))))));
???ke?<=?(k&(d[0]|d[1]|!d[2]|!d[3]|!d[4])&(!d[5]|!d[6]|!d[7]|!d[4]|!((!((d[0]&d[1])|(!d[0]&!d[1]))&d[2]&d[3])|(!((d[2]&d[3])|(!d[2]&!d[3]))&d[0]&d[1]))));?
???do[9]<=?t[12]^t[0];
???do[8]<=?t[12]^(t[1]|t[2]);
???do[7]<=?t[12]^(t[3]|t[4]);
???do[6]<=?t[12]^t[5];
???do[5]<=?t[12]^(t[6]&t[7]);
???do[4]<=?t[12]^(t[8]|t[9]|t[10]|t[11]);
???do[3]<=?t[13]^(t[15]&!t[14]);
???do[2]<=?t[13]^t[16];
???do[1]<=?t[13]^t[17];
???do[0]<=?t[13]^(t[18]|t[14]);
??end
?end
end
??
always?@(posedge?clk)?begin
?if(rst)begin
t<=?0;
?end?elsebegin
if(en==1'b1)begin
t[0]<=?d[0];
???t[1]?<=?d[1]&!(d[0]&d[1]&d[2]&d[3]);
???t[2]?<=?(!d[0]&!d[1]&!d[2]&!d[3]);
???t[3]?<=?(!d[0]&!d[1]&!d[2]&!d[3])|d[2];
???t[4]?<=?d[4]&d[3]&!d[2]&!d[1]&!d[0];
???t[5]?<=?d[3]&!(d[0]&d[1]&d[2]);
???t[6]?<=?d[4]|((!((d[0]&d[1])|(!d[0]&!d[1]))&!d[2]&!d[3])|(!((d[2]&d[3])|(!d[2]&!d[3]))&!d[0]&!d[1]));
???t[7]?<=?!(d[4]&d[3]&!d[2]&!d[1]&!d[0]);
???t[8]?<=?(((d[0]&d[1]&!d[2]&!d[3])|(d[2]&d[3]&!d[0]&!d[1])|(!((d[0]&d[1])|(!d[0]&!d[1]))&!((d[2]&d[3])|(!d[2]&!d[3]))))&!d[4])|(d[4]&(d[0]&d[1]&d[2]&d[3]));
???t[9]?<=?d[4]&!d[3]&!d[2]&!(d[0]&d[1]);
???t[10]?<=?k&d[4]&d[3]&d[2]&!d[1]&!d[0];
???t[11]?<=?d[4]&!d[3]&d[2]&!d[1]&!d[0];
???t[12]?<=?(((d[4]&d[3]&!d[2]&!d[1]&!d[0])|(!d[4]&!((d[0]&d[1]&!d[2]&!d[3])|(d[2]&d[3]&!d[0]&!d[1])|(!((d[0]&d[1])|(!d[0]&!d[1]))&!((d[2]&d[3])|(!d[2]&!d[3]))))&!((!((d[0]&d[1])|(!d[0]&!d[1]))&d[2]&d[3])|(!((d[2]&d[3])|(!d[2]&!d[3]))&d[0]&d[1]))))&!p)|((k|(d[4]&!((d[0]&d[1]&!d[2]&!d[3])|(d[2]&d[3]&!d[0]&!d[1])|(!((d[0]&d[1])|(!d[0]&!d[1]))&!((d[2]&d[3])|(!d[2]&!d[3]))))&!((!((d[0]&d[1])|(!d[0]&!d[1]))&!d[2]&!d[3])|(!((d[2]&d[3])|(!d[2]&!d[3]))&!d[0]&!d[1])))|(!d[4]&!d[3]&d[2]&d[1]&d[0]))&p);
???t[13]?<=?(((!d[5]&!d[6])|(k&((d[5]&!d[6])|(!d[5]&d[6]))))&!(p^(((d[4]&d[3]&!d[2]&!d[1]&!d[0])|(!d[4]&!((d[0]&d[1]&!d[2]&!d[3])|(d[2]&d[3]&!d[0]&!d[1])|(!((d[0]&d[1])|(!d[0]&!d[1]))&!((d[2]&d[3])|(!d[2]&!d[3]))))&!((!((d[0]&d[1])|(!d[0]&!d[1]))&d[2]&d[3])|(!((d[2]&d[3])|(!d[2]&!d[3]))&d[0]&d[1]))))|(k|(d[4]&!((d[0]&d[1]&!d[2]&!d[3])|(d[2]&d[3]&!d[0]&!d[1])|(!((d[0]&d[1])|(!d[0]&!d[1]))&!((d[2]&d[3])|(!d[2]&!d[3]))))&!((!((d[0]&d[1])|(!d[0]&!d[1]))&!d[2]&!d[3])|(!((d[2]&d[3])|(!d[2]&!d[3]))&!d[0]&!d[1])))))))|((d[5]&d[6])&(p^(((d[4]&d[3]&!d[2]&!d[1]&!d[0])|(!d[4]&!((d[0]&d[1]&!d[2]&!d[3])|(d[2]&d[3]&!d[0]&!d[1])|(!((d[0]&d[1])|(!d[0]&!d[1]))&!((d[2]&d[3])|(!d[2]&!d[3]))))&!((!((d[0]&d[1])|(!d[0]&!d[1]))&d[2]&d[3])|(!((d[2]&d[3])|(!d[2]&!d[3]))&d[0]&d[1]))))|(k|(d[4]&!((d[0]&d[1]&!d[2]&!d[3])|(d[2]&d[3]&!d[0]&!d[1])|(!((d[0]&d[1])|(!d[0]&!d[1]))&!((d[2]&d[3])|(!d[2]&!d[3]))))&!((!((d[0]&d[1])|(!d[0]&!d[1]))&!d[2]&!d[3])|(!((d[2]&d[3])|(!d[2]&!d[3]))&!d[0]&!d[1])))))));
???t[14]?<=?d[5]&d[6]&d[7]&(k|(p?(!d[4]&d[3]&((!((d[0]&d[1])|(!d[0]&!d[1]))&d[2]&d[3])|(!((d[2]&d[3])|(!d[2]&!d[3]))&d[0]&d[1]))):(d[4]&!d[3]&((!((d[0]&d[1])|(!d[0]&!d[1]))&!d[2]&!d[3])|(!((d[2]&d[3])|(!d[2]&!d[3]))&!d[0]&!d[1])))));
???t[15]?<=?d[5];
???t[16]?<=?d[6]|(!d[5]&!d[6]&!d[7]);
???t[17]?<=?d[7];
???t[18]?<=?!d[7]&(d[6]^d[5]);
??end
?end
end

endmodule


VHDL文件詳見:

https://github.com/suisuisi/8b10b_encdec

其他常用編碼方式

8b/10b編碼為時鐘恢復提供了足夠的0與1翻轉,但編碼效率較低,每傳輸10比特數據,只有8比特為有效數據,編碼效率只有80%,有20%為輔助比特。64b/66b編碼中的0、1分布不如8b/10b均勻,但編碼效率高,輔助比特少,每66比特中只有2比特是輔助比特,所占比例僅為3%。64b/66b被用于10Gbit以太網中。本部分將詳細介紹64b/66b編碼。

64b/66b編碼機制

66比特的編碼塊由2比特的前導碼和64比特數據組成。

  • 當前導碼為“01”時,后面的64比特為數據;
  • 當前導碼為“10”時,其后的8比特為類型字段,后56比特為數據;
  • 其他兩個值“11”和“00”未被使用。

前導碼(10和01)可以保證每66比特中至少有一次比特翻轉,可用于時鐘恢復。與64b/66b編碼電路相連的還有一個擾碼電路。

128b/130b編碼機制

128b/130b編碼用于PCIe Gen3以取代8b/l0b編碼/解碼。8b/10b編碼中除了數據編碼字符外還有很多控制字符,用于表示包的開始始、包的結束等。然而,該編碼方式編碼效率較低,輔助比特占了20%。128b/130b編碼中輔助比特很少(約為1.5%)。
128比特的數據塊加上2比特的同步頭就可以構成一個130比特的編碼塊。同步頭編碼為2‘b01時表示后面跟隨的是訓練順序組(training ordered set),2b'10表示后面的是數據(TLP、DLLP及空閑數據),2’bl1和2’b00被保留。由于128b/130b編碼體制中沒有額外的控制字符,因此需要使用其他機制來指出包的開始和結束。

編輯:jq
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 編碼器
    +關注

    關注

    45

    文章

    3667

    瀏覽量

    135237
  • 寄存器
    +關注

    關注

    31

    文章

    5363

    瀏覽量

    121158
  • 數據
    +關注

    關注

    8

    文章

    7139

    瀏覽量

    89574

原文標題:高速串行通信常用的編碼方式-8b/10b編碼/解碼

文章出處:【微信號:Open_FPGA,微信公眾號:OpenFPGA】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    CW32模塊使用 紅外解碼編碼模塊

    格式設備,如大部分電視機、機頂盒、DVD、電風扇等電器設備。 只需要利用到單片機的串口通信知識,通過串口發送指定的指令進行控制模塊發射;通過串口接收方式進行紅外解碼操作,獲取遙控編碼
    的頭像 發表于 01-23 12:56 ?76次閱讀
    CW32模塊使用 紅外<b class='flag-5'>解碼</b><b class='flag-5'>編碼</b>模塊

    信道編碼解碼技術解析

    在現代通信系統中,數據傳輸面臨著多種挑戰,包括噪聲干擾、信號衰減、硬件故障等。為了提高數據傳輸的可靠性,信道編碼(Channel Coding)和解碼(Decoding)技術應運而生。這些技術通過在
    的頭像 發表于 01-22 15:48 ?135次閱讀

    請問一下204B接口的各個層次?

    Hi~,我想請問一下204B接口的各個層次,例如transport layer,link layer...里面的8B/10B,scrambler...的內建測試模式和測試模板(test parten)方面的資料,應該參考什么
    發表于 01-20 09:05

    什么是編碼方式、數據質量和傳輸需求

    信息從一種形式或格式轉換為另一種形式或格式的過程。在數據傳輸和存儲中,編碼方式的選擇直接影響數據的可讀性、可壓縮性、安全性以及傳輸效率。 常見編碼方式: ??? 字符
    的頭像 發表于 01-10 13:21 ?123次閱讀

    【米爾-Xilinx XC7A100T FPGA開發板試用】+04.SFP之Aurora測試(zmj)

    /11011232.html 參考二:高速串行總線系列(1)8B/10B編碼技術 https://blog.51cto.com/u_1533
    發表于 11-14 21:29

    光纜8d與8b區別

    光纜8D與8B的主要區別體現在其結構、光纖類型以及應用場景上。以下是對兩者的詳細比較: 一、結構差異 GYTY53-8D光纜: 是一種充滿油脂的松散層絞合室外光纜。 內護套由聚乙烯制成,外護套為鋼
    的頭像 發表于 10-30 10:13 ?389次閱讀

    變頻器與編碼器的連接方式

    運行的穩定性和精確性。因此,變頻器與編碼器的連接方式對于整個系統的性能具有重要影響。本文將從多個角度詳細解析變頻器與編碼器的連接方式,包括其
    的頭像 發表于 10-23 15:52 ?518次閱讀

    TAS5805的I2C地址配置的是7b:2D,8b:5A怎么出來是7b:2F,8b:5E?這個是什么原因?

    我們5805的I2C地址配置的是7b:2D,8b:5A,怎么出來是7b:2F,8b:5E?這個是什么原因? DVDD: 1.8V
    發表于 10-18 07:41

    DVEVM/DVSDK 1.2的編碼解碼演示

    電子發燒友網站提供《DVEVM/DVSDK 1.2的編碼解碼演示.pdf》資料免費下載
    發表于 10-16 11:26 ?0次下載
    DVEVM/DVSDK 1.2的<b class='flag-5'>編碼</b><b class='flag-5'>解碼</b>演示

    視頻編碼器與解碼器的應用方案

    視頻解碼器和視頻編碼器是數字信號處理中常用的設備,它們在數據的傳輸和轉 換中發揮著重要作用。概述與應用 它是將模擬信號或數字信號轉換為數字信號的編碼設備,將輸入的視音頻信號源 進行壓縮
    發表于 09-10 16:04 ?1次下載

    使用8b-10b線路編碼和可編程實時單元的驅動器內通信

    電子發燒友網站提供《使用8b-10b線路編碼和可編程實時單元的驅動器內通信.pdf》資料免費下載
    發表于 09-04 09:50 ?0次下載
    使用<b class='flag-5'>8b-10b</b>線路<b class='flag-5'>編碼</b>和可編程實時單元的驅動器內<b class='flag-5'>通信</b>

    8pinM8公頭插針編碼介紹

    德索工程師說道8pin M8公頭插針的編碼方式是指通過特定的排列組合方式,將8個針腳分別定義為不
    的頭像 發表于 06-14 15:32 ?1042次閱讀
    <b class='flag-5'>8pinM8</b>公頭插針<b class='flag-5'>編碼</b>介紹

    變頻器與編碼器的連接方式

    運行的穩定性和精確性。因此,變頻器與編碼器的連接方式對于整個系統的性能具有重要影響。本文將從多個角度詳細解析變頻器與編碼器的連接方式,包括其
    的頭像 發表于 05-29 15:36 ?3047次閱讀

    高速串行通信協議詳解

    隨著信息技術的飛速發展,數據通信已成為現代社會不可或缺的一部分。在數據通信中,串行通信作為一種基本的通信
    的頭像 發表于 05-16 16:45 ?901次閱讀

    8b10b編碼verilog實現

    編碼所需的特殊字符和狀態機。 在數據接收端,解碼這些特殊字符,并恢復時鐘信號。 以下是一個簡化的8b/10b編碼器的Verilog代碼示例:
    發表于 03-26 07:55
    现金百家乐技巧| 百家乐官网的嬴钱法| 百家乐平注常赢规则| 百家乐官网单机版的| 在线百家乐官网合作| 百家乐官网象棋玩法| 明升娱乐场 | 老虎机 | 都江堰市| 百家乐官网机器二手| 百家乐官网投注法则| 网络百家乐官网怎么作弊| 博彩论坛网| 明珠国际| 威海市| 百家乐官网最低压多少| 百家乐官网赢的方法| 百家乐官网平台注册送现金| 赌博百家乐官网技术| 赌片百家乐官网的玩法技巧和规则| 千亿娱百家乐官网的玩法技巧和规则| 百家乐赌场作弊| 德州扑克 在线| 明陞M88| 百家乐官网作弊内幕| 百家乐官网韩泰阁| 新加坡百家乐官网规则| 百家乐出千手法| 二八杠自行车| 海立方百利宫娱乐城| 百家乐官网游戏机出千| 澳门百家乐官网怎么看小路| 有钱人百家乐官网的玩法技巧和规则 | 百家乐官网好不好| 百家乐的玩法和技巧| 百家乐技巧开户| 利来网站| 澳门玩百家乐官网赢1000万 | 申博百家乐公式软件| 百家乐扫描技术| 百家乐必赢外挂软件|