前言:很多知识我们往往只是了解了皮毛,不知道它为什么产生,更不清楚它深层的应用,很多人半瓶水晃荡,而这正是我最厌恶的,对于8B/10B编码这个知识点我就来扯开它的神秘面纱。

8b/10b的由来:

8B/10b编码也叫做8字节/10字节,是目前高速串行通信中经常用到的一种编码方式,该编码方式最初是由IBM公司在1983年发明并应用于ESCON[200M互联系统],由AI widmer和Peter Franaszek在IBM的刊物“研究与开发”上提出。

8b/10b提出原因:

高速串行信号为啥要编码?它本身的码型有什么不好的地方吗?那么就用下面的图来解释一下为什么?

单看这个图大家可能还是不太明白为啥,解释一下,由于串行电路通常采用交流耦合的方式(串接电容)我们知道理想电容的阻抗公式 ,通过这个公式可以知道,频率f越高,阻抗越低,反之,频率越低,阻抗越高。因此上图中的情况,当码型是高频的时候,基本可以不损耗的传输过去,但是当码型为连续的0或者1的时候,电容的损耗就很大,导致幅度不断降低,最严重的后果就是无法识别到底是0还是1,因此8b/10b编码就是为了尽量把低频的码型优化成较高频率的码型,从而降低阻抗带来的损耗。明白为什么要搞8B10B编码了吧,嘿嘿嘿。

8b/10b编码算法:

8b/10编码的特性就是保证DC平衡——直流平衡,这是啥?怎么听起来这么高端,其实就是串行数据中连续出现的1/0达到一个平衡均匀的状态,没啥牛逼的一个东西。

8b/10b编码将串行的数据以8bit为一个单位进行编码处理得到一个10bit的数据,具体怎么操作呢,假设原始8位数据从高到低用HGFEDCBA表示,将8位数据分成高3位HGF和低5位EDCBA两个子组。经过5B/6B编码,将低5位EDCBA映射成abcdei;高3位经过3B/4B编码,映射成fghj,最后合成abcdeifghj发送。

如下图中所示:

而关于上图人家已经把这张图表格化了,网络上有很多关于8b/10b编码的博客,上来就丢一张表给你,看不懂啊,里面乱七八糟都是些什么东西,而博主往往自己也没有真正的理解,加上一堆莫能两可的文字描述让读者看了更晕。那么关于这张表我就来好好捋一捋它!

问:表里面的D.x.x是什么?

答:将低5位EDCBA按其十进制数值记为x,将高3位按其十进制数值记为y,将原始8bit数据记为D.x.y。

举个例子:8bit数“100 11001”,即十进制数181,按照3/5的划分原则x=11001(25),y=100(4),所示这个数被表示为D.25.4

所以上面的表中最大是D.31,下面的表中最大是D.x.7

问:8bit的数据0,1的组合有256种,10bit的数据0,1组合有1024种,这个是怎么对应的?

答:这个问题很好,1024种组合里,8b/10b编码选择了256种0和1尽量保持均匀的组合,列在表里了。

问:表头的RD是什么意思呀?怎么还有+/-,对应的数也不一样。

答:我先翻译一下:RD:running disparity 直译“运行不一致性”,也翻译成“极性偏差”(running disparity,RD),RD是对编码后的数据流Disparity的一个统计,+1用来表示1比0多,-1用来表示0比1多,-1是它的初始化状态。

还要说一个概念:Disparity,这个玩意表示编码后的码型数据中“1”的个数与“0”的个数的差值。由表1,表2的编码规则可知:Dirparity的取值只有“+2”(“0”比“1”多两个)、“0”(“0”和“1”数量相等)和“-2”(“0”比“1”少两个)三种可能。编码中“1”和“0”数量相等的码字称为“完美平衡码”。

那定义+-RD有什么意义呢?+/-RD代表着同一个码型的两种编码方式。再举个例子比如:在表1中,对于D.x.4(100),其对应的4B码字有两种:1101和0010,若此时RD为负,则取1100作为其对应的4B码字作为输出,同时检验此时的编码是否为完美编码,如果是完美编码,则保持RD的极性不变;否则改变RD的极性。通过控制RD的极性,同时在编码时根据RD的极性选择相对应的编码值,使得编码后的数据流有更好的直流平衡特性,达到我们的缓解长“0”或长“1”的目的。

如下图:

问:怎么表里面还有一个D.x.P7,D.x.A7呢,这是啥呀?

答:对于D.x.7† ,当和5B/6B组合时D.x.P7和D.x.A7编码必须选择一个来避免连续的5个0或1。

具体怎么选择呢,是有规则的:

D.x.A7用在:x=17 x=18 x=20当RD=-1时;

x=11 x=13 x=14 当RD=+1时。

其他情况下x.A7码不能被使用

问:怎么表里面D.23,D.27,D.29,D.30后面带个 † 呢,这是啥呀?

答:和上面D.x.P7†一样,它有自己的特殊配对规则,当x=23 x=27 x=29 x=30时,3b/4b这边使用K.x.7进行编码。

问:怎么表里还有个K.28呢?这是干啥的呀?

答:K.28用于和带‡ 的候补编码作为“逗号码”来保证数据流中的唯一性,如K.28.1 K.28.5 K.28.7等。

逗号码:

上面我们提到的“逗号码”,其实都是当初在规划8B/10B编码机制的时候,所谓的控制代码(Control Characters)的其中之一。8B/10B标准中使用了12个特殊的控制代码,他们能在数据中被发送,还可以组合成各种“原语”。

† 在控制代码中,K.28.1 K.28.5 K.28.7 是逗号序列,逗号序列是用来校准用的,如果K.28.7没有被使用,序列0011111 或者 1100000 是不会出现在任何编码中的。

‡ 在实际编码中如果K.28.7可以被使用,一种更复杂的校准规范需要†被使用,它们能组合成各种“原语”,在任何情况下多个K.28.7序列不允许被同时使用,它将导致不可探测的逗号序列。

PS:本篇博客的完成借鉴了一下几位博主的博文,特此感谢!

8B/10B编码_yundanfengqing_nuc的博客-CSDN博客_8b10b编码

(1条消息) 8B/10B编码基本原理_你看不到我在伤心的博客-CSDN博客_8b10b编码

高速信号编码之8B/10B (sohu.com)

让我们来搞清楚8b/10b编码到底是怎么回事吧相关推荐

  1. 8b/10b编码是什么?

    8b/10b的由来: 8B/10b编码也叫做8字节/10字节,是目前高速串行通信中经常用到的一种编码方式,该编码方式最初是由IBM公司在1983年发明并应用于ESCON[200M互联系统],由AI w ...

  2. TX的8B/10B编码功能

    Transmitter功能介绍 每个收发器(Transceiver)包括一个独立的发射器(Transmitter),它由PCS和PMA组成.下图显示了发射器(Transmitter)的功能块.并行数据 ...

  3. 高速串行总线系列(1)8B/10B编码技术

    目录 8B/10B编码 5B/6B 编码表 3B/4B 编码表 控制字符编码表 8B/10B编码的利用率 参考文献 8B/10B编码 为什么要使用8B/10B编码? 8b/10b编码的特性之一是保证D ...

  4. 高速收发器之8B/10B编码

    前面文章说过,在高速链路中导致接收端眼图闭合的原因,很大部分并不是由于高频的损耗太大了,而是由于高低频的损耗差异过大,导致码间干扰严重,因此不能张开眼睛.针对这种情况,前面有讲过可以通过CTLE和FF ...

  5. 线路/信道编码技术(1)——8B/10B编码

    1. 线路编码技术 线路编码机制将输入原始数据转变为接收器可接收的数据格式,同时保证数据流中有足够的时钟信息提供给接收端的时钟恢复电路.线路编码技术提供了一种将数据对齐到字节/字的方法,可以保持良好的 ...

  6. #PCIE# 8b/10b 编码

    前言 8B/10B,也叫做8字节/10字节或8B10B.8B/10B方式最初由IBM公司于1983年发明并应用于ESCON(200M互连系统),由Al Widmer和Peter Franaszek在I ...

  7. 高速串行通信常用的编码方式-8b/10b编码/解码

    绪论 8b/10b编码/解码是高速串行通信,如PCle SATA(串行ATA),以及Fiber Channel中常用的编解码方式.在发送端,编码电路将串行输入的8比特一组的数据转变成10比特一组的数据 ...

  8. 8B/10B编码原理详解、Verilog实现及在JESD204B中的应用

    目录 1.8B/10B介绍 2.原理 3.Verilog实现 4.实例:在JESD204B中的应用 参考资料: 1.8B/10B介绍 8B/10B编码的目的是防止串行的数据出现长时间的连0连1,因为这 ...

  9. 8b10b编码源码 matlab,8b/10b编码技术系列(一):Serdes、CDR、K码

    和大家分享一下关于8b/10b编码的知识点,如有什么错误之处或大家有什么额外的见解欢迎大家公众号后台留言! 一.Serdes高速收发器 在传统的源同步传输中,数据和时钟分离,在速率较低(<100 ...

最新文章

  1. [转] createObjectURL方法 实现本地图片预览
  2. Win10:你需要来自XXX的权限才能对此文件夹进行更改
  3. kubernetes集群命令行工具kubectl
  4. 【Machine Learning】决策树之ID3算法 (2)
  5. Keras学习笔记:序列式模型
  6. 汇编语言王爽第二版-课后答案以及解析
  7. php中的fpm_详解PHP中PHP-FPM是什么?有什么用?
  8. commit分拆多个 git_这才是真正的Git——Git内部原理
  9. linux SHELL脚本编程
  10. python设置堆大小_Python中的堆问题
  11. finalize()方法什么时候被调用?析构函数(finalization)的目的是什么?
  12. 题目1022:游船出租(结构体使用)
  13. 强化学习的数学基础4---Q-Learning进阶
  14. linux monit安装配置
  15. ovito :qt.qpa.plugin: Could not load the Qt platform plugin “xcb“ in ““ even though it was found.
  16. 【iOS】下的读写锁的简单实现
  17. 工业机器人的臂部配置形式_工业机器人臂部设计注意事项
  18. 多项式拟合(polyfit和polyval)
  19. 小谈startup类ConfigureServices方法的作用
  20. Excel学习笔记4||数据处理函数ROUND、INT、TRUNC、MAX、MIN、ROW、COLUMN

热门文章

  1. MMD以及核公式推导
  2. firebase 推送_使用Firebase Cloud Messaging发送推送通知
  3. 数组12:激光与巧克力
  4. R语言的导数计算(转)
  5. 字符集与比较规则及在Mysql中的应用
  6. Aforge做图像处理
  7. 百度Ai实现网络图片文字识别--Java
  8. ggplot2–绘制分布图
  9. numpy 查找 返回索引_numpy中实现ndarray数组返回符合特定条件的索引方法
  10. 你不是学生,你是开发者