8B10B编码(高速收发器五)

1、8B10B解决的问题

  8B10B编码是1983年IBM公司提出的传输编码标准,通常用于高速收发器中,常见的JESD204B、SATA等接口协议,使用查表就可以实现编码和解码。

  在这些高速收发器的接收端需要通过CDR技术去恢复时钟与数据的相位关系,在这个过程中需要不断的检测数据边沿和数据中心,从而调整时钟和数据的相位,因此需要保证接收的数据需要不断的变化,从而给CDR提供足够多的待检测数据边沿。

  另外高速接口电路一般采用交流耦合方式进行连接,在交流耦合电路中的信号线会接电容(隔直通交),如果传输的数据在一段时间内全是1或全是0,那么这段时间传输的信号可以等效成直流信号,会产生直流偏移,在通过电容时,有可能解码错误。

  因此通过8B10B编码,保证编码后的数据在一定时间内0的个数与1的个数保持相等。

2、8B10B编码规则

  8B10B就是把8位数据编码成10位数据,8位共有256种状态,而10位数据有1024种状态,可以从1024种状态中选取256种0和1个数相等的数据作为编码结果,在从剩下的数据中选取12个作为控制字符,即常见的K码。

  如下图所示,将输入的8位数据分为高3位和低5位,分别进行3B4B、5B6B编码,结果为10位数据。

在这里插入图片描述

图1 8B10B编码原理

  通常把编码前的低5位数据EDCBA的十进制数值记为x,把编码前的高3位数据HGF的十进制数值记为y,原始8位数据可以表示为D.x.y。

  比如待编码数据为110_00011,高3位数据的十进制为6,低5位的十进制数据为3,则D.3.6就表示110_00011。

  常见的控制字符K.28.5的也是采用上述方式,控制字符的编码结果是固定的,不会与数据的编码结果冲突。

  低5位数据总共有32种状态,对应的5B6B编码规则如下表所示。

在这里插入图片描述

图2 5B6B编码原理

  下面是3B4B编码的表格,原理与5B6B编码一致。

在这里插入图片描述

图3 3B4B编码原理

  可能第一次看下表会有疑问,为什么D.00的编码结果有两种?RD又是什么东西?

  5位数据总共有32种状态,编码结果有6位数据,0和1数量相等的只有000_111、001_011…、110_001、111_000等20种状态。其中000_111和111_000存在三个连续相同的状态,并没有被使用。导致编码后0和1数据相等的结果就只有18种状态,并不能满足输入5位数据的32种数据状态,3B4B编码也有同样的问题。

  此时设计编码的人提出,一次编码如果不能保证编码结果0和1个数相等,那么可以让连续两次编码结果的0和1相等,也能满足要求。

  极性偏差(running disparity,RD)用来记录上一次编码结果中0和1个数的多少。RD=-1表示编码结果0多于1,RD=1表示编码结果1多于0。

  如果编码结果的1和0个数相等,称为平衡编码,此时RD的数值保持不变。如果编码结果1和0个数不等,称为非平衡编码,此时RD的数值翻转,下次编码采用RD对应数值的编码作为编码结果。

  将上次8B10B编码结果的RD数值用作本次5B6B编码的起始RD,而3B4B编码的起始RD等于5B6B编码结果的RD,3B4B编码结果的RD作为本次8B10B编码的RD。

  对应的编码状态跳转如下图所示。

在这里插入图片描述

图4 编码状态

  通过这种方式才能保证一次编码结果要么0和1个数相等,要么相差两个。关于这方面的讲述,网上绝大多数文章都是错误的,认为上次8B10B编码结果的RD会作为下次5B6B和3B4B编码的起始RD,造成3B4B编码错误。

  上述讲解的是数据编码过程,因为8B10B编码大多用于异步串行通信,接收方需要识别数据的帧头、帧尾这些控制信息,从而完成数据的对齐、同步等等。

  因此8B10B编码有12个控制字符,通常称为K码,这些控制字符的编码结果是唯一的,不会与数据编码的结果重复。下表就是12个控制字符的编码。

在这里插入图片描述

图5 K码的编码规则

  因为K码的编码结果是唯一的,因此接收端检测K码的方式很简单,通过一组移位寄存器,将输入数据依次移入,当移位寄存器的数值与K码的编码结果相同时,就认为检测到对应K码了,从而实现对应功能,包括逗号检测、时钟纠正、起始位、停止位等等。

3、8B10B编码练习

  8B10B相关的理论讲解就到此结束了,以两个示例测试是否真的掌握该编码,请问D.8.3的8B10B编码结果是多少?

  由于起始RD并没有明确指出,可能为1或者-1,所以会存在两种编码结果。

  首先RD=-1时,根据图2得D.8的5B6B编码结果为111001,5B6B编码完成后,RD翻转变为1。将RD=1作为D.x.3的3B4B编码起始RD,根据图3查表得编码结果为0011,再次将RD翻转作为本次8B10B编码结果的RD。

  因此起始RD=-1的编码结果为111001_0011,先输出高位数据。

  当起始RD=1时,根据图2得D.8的5B6B编码结果为000110,RD翻转作为3B4B起始RD,得D.x.3的3B4B编码结果为1100,因此8B10编码及热锅为000110_1100。

  怎么验证上述计算是否正确呢?

  Xilinx的UG476手册的附录有所有8B10B编码数据的结果,如下图所示,起始RD=-1时,D.8.3编码结果为111001_0011,起始RD=1时,D.8.3编码结果为000110_1100,与上述计算结果保持一致,证明计算方法没有问题。

在这里插入图片描述

图6 D.8.3的编码结果

  第二个问题,当前RD=1,则K.28.5、D.2.6、D.23.4的编码结果依次是多少,且最终的RD是多少?

  首先RD=1时,通过图5查得k.28.5编码结果为110000_0101,然后RD保持不变,因为K28.5的5B6B和3B4B都是不平衡编码,因此RD翻转两次的结果就是不变。

  因此D.2.6的起始RD=1,首先D.2的5B6B编码结果为010010,RD翻转变为-1。D.x.6的3B4B编码结果为0110,由于D.x.6是平衡编码,因此RD保持不变。

  故D.2.6的编码结果为010010_0110,RD最终为-1。

  当RD=-1时,D.23.4的5B6B编码结果为111010,然后RD翻转为1。之后D.x.4的编码结果为0010,RD的极性再次翻转为-1。

  所以K.28.5、D.2.6、D.23.4的编码结果依次是110000_0101、010010_0110、111010_0010,RD的最终取值为-1。D.2.6、D.23.4的查表结果如下图所示,与上述计算结果保持相同,证明编码规则没有问题。

在这里插入图片描述

图7 D.2.6的编码结果

在这里插入图片描述

图8 D.23.4的编码结果

  从上述编码过程可知,每个输入数据通过查表都可以得到其唯一的编码结果,根据编码结果也可以查表反推进行解码,所以实现这个编码和解码的思路比较简单,直接使用查表法即可。

  通过上述编码也可以很清晰知道该编码的缺陷,每次传输的10位数据中有2位是无效数据,损耗比较大。后续的64B66B编码就是为了解决这个问题提出的,但是8B10B编码的误码率会比64B66B编码低。

  关于8B10B编码内容讲解就到此结束了,本来最开始是不想写这方面内容的,结果在CSDN和B站看到很多大佬对RD极性变化的理解都有问题,编码结果与官方提供的结果都不相同,因此写了这篇文章,希望对大家的理解有帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/13257.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux day6 yum下载,systemctl,

yum命令 yum [-y] install wget 通过yum下载wget小工具 -y的意思是,如果有询问,自动确认(总是允许)。 yum remove wget 也可以通过这种方式卸载wget

Git版本控制工具的原理及应用详解(四)

本系列文章简介: 随着软件开发的复杂性不断增加,版本控制成为了开发团队中不可或缺的工具之一。在过去的几十年里,版本控制工具经历了各种发展和演变,其中Git无疑是目前最受欢迎和广泛应用的版本控制工具之一。 Git的出现为开发者…

Apache Flink典型应用场景全面解析

Apache Flink作为一个高度灵活且功能强大的开源流处理框架,因其在实时数据处理、大规模数据分析以及事件驱动应用方面的卓越表现而受到广泛青睐。以下是Flink几个典型的使用场景,展示了其在不同行业和业务需求中的应用潜力。 实时数据分析与监控 应用描述…

工作小记2——二周年记

不知不觉,工作已经有二周年, 由于公司电脑不能登录csdn,不能登github,我已经好久没有碰过我的个人博客空间啦。现在从大厂跳到小公司,舒适度翻倍提升!现在我要回归CSDN啦! 总体感受&#xff1a…

playwright 自动化框架python教程(九)

Playwright 提供了一系列API来处理各种浏览器中的特殊操作 Playwright 提供了一系列API来处理各种浏览器中的特殊操作,包括弹窗(如alert、confirm、prompt)、新窗口的打开与管理,以及其他一些高级交互。以下是处理这些情况的一些…

Solon Cloud Event 新的事务特性与应用

1、Solon Cloud Event? 是 Solon 分布式事件总线的解决方案。也是 Solon “最终一致性”分布式事务的解决方案之一2、事务特性 事务?就是要求 Event 有原子性,当多个 Event 发布时,要么全成功,要么全失败。 public …

PyQt5 中的 List View

文章目录 1. 基础概念2. 创建 List View2.1 PyQt5 中一个简单的 List View 实例2.2 代码解释2.3 运行结果 3. 数据模型3.1 标准模型3.2 自定义模型 4. 自定义 List View4.1 使用样式表 (QSS)4.2 设置项委托 (Item Delegate) 5.事件处理6. 与数据交互6.1 添加数据6.2 删除数据6.…

【哈希】Leetcode 205. 同构字符串【简单】

同构字符串 给定两个字符串 s 和 t ,判断它们是否是同构的。 如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的。 每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上&am…

如何解决 Scrapy 下载图片时的文件名错误问题

在使用 Scrapy 的 ImagesPipeline 下载图片时,有时会遇到因为文件名的问题导致下载失败的情况。本文将详细解释这种错误的原因,并提供一个简单易懂的解决方案,帮助大家避免类似的问题。 问题描述 在下载图片时,如果图片的名字是…

C语言到底怎么学?

C语言到底怎么学? 1、工欲善其事,必先利其器 这里介绍几个华清远见学习C语言必备的工具: VMware、ubuntu。 VMware是一家提供虚拟化软件和解决方案的公司,VMware的旗舰产品是VMware Workstation,这是一种虚拟机软件,…

echers配置项:数据过多时,折叠数据缩放查看

当数据过多时,如上图所示的时间点,会自动折叠,此时鼠标缩放还不起作用,我们配置如下代码 let option {dataZoom: [{startValue: 05:00}, // 这个值需要跟 第一条 时间数据对应上{type: inside}], }配置后,就可以进行…

echers配置项:折线图,折现的颜色修改

如上图所示:红框内的折现颜色修改,并隐藏默认的点 series: [{data: [1, 230, 224, 218, 135, 147, 760,1500,1200,2500,2000],type: line,lineStyle: {color: #00DBFE // 折现颜色},symbol:none, // 不显示点smooth: true, // 折现角度:圆滑…

hadoop生态圈集群搭建(持续更新240513)

Hadoop生态圈 Linux1.修改ip地址2.重启network服务3.安装插件4.关闭防火墙5.创建用户6.创建目录7.修改目录的所属主和所属组为lxy8.修改主机名:hadoop102 (注意名字后面不要加空格)9.修改hosts文件10.等插件都装完后再重启Linux11.把xshell的登录用户换成lxy (注意&…

5W 3KVAC隔离 宽电压输入 AC/DC 电源模块——TP05AL系列

TP05AL系列产品是一款经济型开板式开关电源,输出功率为5W,具有可靠性高、小体积、性价比高等特点,广泛用于工控和电力仪器、仪表、智能家居等相关行业。

通过 Apple Vision Pro 释放创造力:深入研究空间计算

Apple 最新进军空间计算领域的 Apple Vision Pro,标志着重新定义我们与技术交互方式的重大飞跃。空间计算超越了传统界限,允许用户以无缝集成到物理世界的方式参与 2D 和 3D 内容。 我们可以关注两种类型的体验: 在空间中渲染 2D 内容。这涉及将现有设备窗口投影到空间领域…

通过C++和libcurl下载网易云音乐音频文件的5个简单步骤

概述 在网络编程中,使用C和libcurl库下载文件是一项常见的任务。网易云音乐作为中国领先的在线音乐服务平台之一,以其丰富的音乐资源、优质的音质和智能推荐系统而广受欢迎。由于其平台提供了大量的正版音乐资源,用户在下载音频文件时可能会…

开源发布:JAVA版低代码报文网关-通过简单配置快速对接银行渠道

大家好,我是隐墨星辰,自从《百图解码支付系统设计与实现》专栏中的文章《图解支付报文网关:一种低代码报文网关的设计思路与核心代码实现》发表以来,不少同学留言或私信问我如何实现,说是虽然看懂了思路,但…

pycharm 里面安装 codeium 插件的时候,不能够弹出登录界面

pycharm 里面安装 codeium 插件的时候,不能够弹出登录界面 pycharm 里面安装 codeium 插件的时候,不能够弹出登录界面--解决如下A pycharm 里面安装 codeium 插件的时候,不能够弹出登录界面–解决如下 #踩坑/pycharm/codeium插件无法登录 安…

微信联登报invalid code, rid: 66446806-0826d0b4-3a94ce3a ,错误码:40029解决方法

目录 一、问题描述二、问题原因三、解决方法 一、问题描述 微信登录报错: invalid code, rid: 66446806-0826d0b4-3a94ce3a ,错误码:40029二、问题原因 后端设置的 appsecret 和 appid 与前端的 appid 不一致。 三、解决方法 检查是否已…

用Ai编写一个电机驱动程序

问:帮我写一个步进电机的控制程序,要有包括加减速,以及电机步中断处理函数。 答:编写一个步进电机的控制程序涉及到硬件层面的操作,通常需要依赖特定的硬件平台和相应的驱动程序。以下是一个简化的示例,它展…