一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

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

OpenFPGA ? 來源:OpenFPGA ? 作者:碎碎思 ? 2021-09-26 09:56 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

論序

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

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

8b/10b編碼方式

進(jìn)行8b/10b編碼時(shí),輸入的每8比特?cái)?shù)據(jù)轉(zhuǎn)化為10比特?cái)?shù)據(jù),這10比特?cái)?shù)據(jù)稱為一個(gè)編碼符號(hào)或編碼字符,如圖6.20所示。

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

這些特殊的控制符具有不同用途,例如,作為包的開始標(biāo)識(shí)、包的結(jié)束標(biāo)識(shí),以及特殊COMMA符號(hào)。還有一些編碼字符既不屬于控制字符也不屬于和256種8比特輸入數(shù)據(jù)對(duì)應(yīng)的編碼字符,它們都是非法字符,正常工作時(shí)不會(huì)出現(xiàn)在編碼比特字符流中。在數(shù)據(jù)傳輸出錯(cuò)時(shí)可能會(huì)出現(xiàn)非法字符。圖6.20詳細(xì)介紹了低5比特和高3比特轉(zhuǎn)換成10比特編碼字符的具體方式。

多字節(jié)8b/10b編碼

在一些應(yīng)用中,每個(gè)時(shí)鐘周期需要對(duì)多字節(jié)進(jìn)行編碼。圖6.21是對(duì)16比特?cái)?shù)據(jù)進(jìn)行8b/10b編碼的一種實(shí)現(xiàn)方案,它可以在每個(gè)時(shí)鐘周期進(jìn)行兩字節(jié)數(shù)據(jù)的8b/10b編碼。

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

編碼器1輸岀的disparity信號(hào)被當(dāng)成編碼器2的disparity輸入。兩個(gè)編碼器的編碼和disparity計(jì)算在相同的時(shí)鐘周期內(nèi)進(jìn)行。最終的disparity(編碼器2的輸出)經(jīng)過一個(gè)寄存器后作為16比特?cái)?shù)據(jù)的disparity,也就是當(dāng)前運(yùn)行的disparity,同時(shí)它還作為編碼器1下一個(gè)時(shí)鐘周期的disparity輸入。

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

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

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

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編碼為時(shí)鐘恢復(fù)提供了足夠的0與1翻轉(zhuǎn),但編碼效率較低,每傳輸10比特?cái)?shù)據(jù),只有8比特為有效數(shù)據(jù),編碼效率只有80%,有20%為輔助比特。64b/66b編碼中的0、1分布不如8b/10b均勻,但編碼效率高,輔助比特少,每66比特中只有2比特是輔助比特,所占比例僅為3%。64b/66b被用于10Gbit以太網(wǎng)中。本部分將詳細(xì)介紹64b/66b編碼。

64b/66b編碼機(jī)制

66比特的編碼塊由2比特的前導(dǎo)碼和64比特?cái)?shù)據(jù)組成。

  • 當(dāng)前導(dǎo)碼為“01”時(shí),后面的64比特為數(shù)據(jù);
  • 當(dāng)前導(dǎo)碼為“10”時(shí),其后的8比特為類型字段,后56比特為數(shù)據(jù);
  • 其他兩個(gè)值“11”和“00”未被使用。

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

128b/130b編碼機(jī)制

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

編輯:jq
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 編碼器
    +關(guān)注

    關(guān)注

    45

    文章

    3793

    瀏覽量

    137881
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5433

    瀏覽量

    124267
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    7253

    瀏覽量

    91764

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

文章出處:【微信號(hào):Open_FPGA,微信公眾號(hào):OpenFPGA】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    HIPERFACE DSL編碼通信協(xié)議介紹

    應(yīng)用的首選。HIPERFACE DSL是由SICK AG開發(fā)的串行通信協(xié)議,專為編碼器與控制器之間的數(shù)據(jù)傳輸而設(shè)計(jì)。其中,“DSL”即“Digital Synchronous Link”(數(shù)字同步鏈路),突出了其
    的頭像 發(fā)表于 05-23 14:16 ?598次閱讀
    HIPERFACE DSL<b class='flag-5'>編碼</b>器<b class='flag-5'>通信</b>協(xié)議介紹

    解碼未來:數(shù)字編碼器如何重塑智能世界

    標(biāo)題:《解碼未來:數(shù)字編碼器如何重塑智能世界》 在數(shù)字化浪潮席卷全球的今天,每一個(gè)微小的信號(hào)轉(zhuǎn)換都可能成為推動(dòng)技術(shù)革命的關(guān)鍵。而在這場(chǎng)無聲的變革中,數(shù)字編碼器——這個(gè)看似不起眼的技術(shù)組件,正以
    的頭像 發(fā)表于 04-07 08:44 ?259次閱讀
    <b class='flag-5'>解碼</b>未來:數(shù)字<b class='flag-5'>編碼</b>器如何重塑智能世界

    智多晶XSTC_8B10B IP介紹

    XSTC_8B10B IP(XSTC:XiST Transmission Channel)是智多晶開發(fā)的一個(gè)靈活的,輕量級(jí)的高速串行通信的IP。IP在具備SerDes(單通道或多通道)
    的頭像 發(fā)表于 04-03 16:30 ?706次閱讀
    智多晶XSTC_<b class='flag-5'>8B10B</b> IP介紹

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

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

    信道編碼解碼技術(shù)解析

    在現(xiàn)代通信系統(tǒng)中,數(shù)據(jù)傳輸面臨著多種挑戰(zhàn),包括噪聲干擾、信號(hào)衰減、硬件故障等。為了提高數(shù)據(jù)傳輸?shù)目煽啃?,信?b class='flag-5'>編碼(Channel Coding)和解碼(Decoding)技術(shù)應(yīng)運(yùn)而生。這些技術(shù)通過在
    的頭像 發(fā)表于 01-22 15:48 ?837次閱讀

    請(qǐng)問一下204B接口的各個(gè)層次?

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

    什么是編碼方式、數(shù)據(jù)質(zhì)量和傳輸需求

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

    編碼器的種類全解析

    編碼器的種類按工作原理分類 光電式編碼器簡(jiǎn)述: 光電式編碼器由一個(gè)中心有軸的光電碼盤,其上有環(huán)形通、暗的刻線,有光電發(fā)射和接收器件讀取,獲得四組正弦波信號(hào)組合成 A、B、C、D,每個(gè)正
    的頭像 發(fā)表于 12-11 16:57 ?2253次閱讀
    <b class='flag-5'>編碼</b>器的種類全<b class='flag-5'>解析</b>

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

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

    光纜8d與8b區(qū)別

    光纜8D與8B的主要區(qū)別體現(xiàn)在其結(jié)構(gòu)、光纖類型以及應(yīng)用場(chǎng)景上。以下是對(duì)兩者的詳細(xì)比較: 一、結(jié)構(gòu)差異 GYTY53-8D光纜: 是一種充滿油脂的松散層絞合室外光纜。 內(nèi)護(hù)套由聚乙烯制成,外護(hù)套為鋼
    的頭像 發(fā)表于 10-30 10:13 ?993次閱讀

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

    運(yùn)行的穩(wěn)定性和精確性。因此,變頻器與編碼器的連接方式對(duì)于整個(gè)系統(tǒng)的性能具有重要影響。本文將從多個(gè)角度詳細(xì)解析變頻器與編碼器的連接方式,包括其
    的頭像 發(fā)表于 10-23 15:52 ?1405次閱讀

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

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

    DVEVM/DVSDK 1.2的編碼解碼演示

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

    視頻編碼器與解碼器的應(yīng)用方案

    視頻解碼器和視頻編碼器是數(shù)字信號(hào)處理中常用的設(shè)備,它們?cè)跀?shù)據(jù)的傳輸和轉(zhuǎn) 換中發(fā)揮著重要作用。概述與應(yīng)用 它是將模擬信號(hào)或數(shù)字信號(hào)轉(zhuǎn)換為數(shù)字信號(hào)的編碼設(shè)備,將輸入的視音頻信號(hào)源 進(jìn)行壓縮
    發(fā)表于 09-10 16:04 ?1次下載

    使用8b-10b線路編碼和可編程實(shí)時(shí)單元的驅(qū)動(dòng)器內(nèi)通信

    電子發(fā)燒友網(wǎng)站提供《使用8b-10b線路編碼和可編程實(shí)時(shí)單元的驅(qū)動(dòng)器內(nèi)通信.pdf》資料免費(fèi)下載
    發(fā)表于 09-04 09:50 ?0次下載
    使用<b class='flag-5'>8b-10b</b>線路<b class='flag-5'>編碼</b>和可編程實(shí)時(shí)單元的驅(qū)動(dòng)器內(nèi)<b class='flag-5'>通信</b>