8B10B编解码及FPGA实现

2023-05-16

概述

         在使用ALTERA的高速串行接口时,GXB模块里硬件实现了8B10B编码,用户只是“傻瓜”式的使用,笔者也一直没有弄清楚。网上搜索了一些学习资料,结合参考文献希望能够对其进行消化。另外,ALTERA现在已经提供8B10B IP,用户可以直接使用,不过有时候为了代码可移植性需要自己写代码实现8B10B编解码,笔者希望在这方面也做些实践。

8B10B编码概念

         基本概念网上可以轻易找到答案,简单的说就是将8bit数据转换成10bit数据,显然这个转换过程有20%的开销,大部分公开资料提出8B10B编码的开销是25%,我同意开销大于20%,因为码流中必然存在一些控制码,但是为何是25%而不是24%或者26%呢?

         为什么要使用8B10B编码呢?是因为8B10B编码的特性之一就是保证直流平衡,即编码后二进制数据流中“0”和“1”的数量基本保持一致,因为我们知道当高速串行流的逻辑1和逻辑0有多个位没有产生变化时(即所谓的长连0和长连1),信号的转换就会因为电压位阶的关系而造成信号错误,直流平衡最大好处就是可以克服这个问题。

         8B10B编码是怎么做到DC平衡的呢?转换的时候,连续的“0”或者“1”数量不超过5位,即每5个连续的“0”或者“1”后必须插入一位“1”或者“0”,从而保证信号DC平衡。这样可以保证串行数据可以在接收端被正确复原,同时利用一些特殊代码(K码)也可以帮助接收端进行复原工作,且可以在早期发现数据位传输错误,抑制错误继续发生。

         通过以上解释,那么一个8bit的二进制位流,变成10bit后,10B中0和1的位数只可能出现下面3种可能情况:

{C}l  有5个0和5个1

{C}l  有6个0和4个1

{C}l  有4个0和6个1

这样就引出一个新的名词“不均等性”,即Disparity。就是1的位数和0的位数的差值,根据上述3种情况,那么就有3种Disparity,即0、-2、+2。

8B10B编码工作原理

 

  

图1:8B10B编码器逻辑设计原理框图

         如图1所示,8bit(HGFEDCBA,H是MSB,A是LSB)原始数据会被分成两部分,低5bit进行5B6B编码,高3bit则进行3B4B编码,这已成约定俗成的标准,所以8bit数据(0到255)也被表示为Dx.y的形式,其中x就是低5bit对应的十进制数值,而y就是高3bit对应的十进制数值。例如8bit数“101 10101”,即十进制数181,这时候按照上述划分原则x=10101(21),y=101(5),所示这个数被表示为D21.5。这叫Code Notation。

Running Disparity

         Running Disparity缩写成RD,有正和负之分,即RD+和RD-。有时候也认为RD- = -1,RD+ = +1,所以Running Disparity只有两种状态,而-1是其初始状态。根据上述“不均等性”定义,8-Bit码有3种Disparity,那么又是如何计算出Running Disparity呢?

         根据参考[1]的描述,如果每个5B6B和3B4B码中“1”和“0”的数目不相等,那么就有两种码流可能来进行传输,一种是“1”比“0”多2个,另外一种就是直接取反从而“1”比“0”少2个。到底采取哪一种,编码原则根据当前的Running Disparity信号(也即图1中的RD in)来选择。很明显,当5B6B和3B4B码中“1”和“0”的数目相等的时候,由于Disparity没有改变,所以这里似乎没有选择。但是这时候的编码原则如下:

{C}l  如果6-Bit子块为“000111”,那么6-Bit子块结束RD为正

{C}l  如果4-Bit子块为“0011”,那么4-Bit子块结束RD为正

{C}l 如果6-Bit子块为“111000”,那么6-Bit子块结束RD为负

{C}l  如果4-Bit子块为“1100”,那么4-Bit子块结束RD为负

总的计算Running Disparity的原则如图2所示:

 

 

 

图2:计算Running Disparity规则

需要注意的是ALTERA高速接口里8B10B模块的Running Disparity是基于10bit的子块计算出来的。10B被分为2块,一个6bit子块(abcdei)和一个4bit子块(fghj),如图3所示。

 

 

 

图3:10-Bit Grouping of 6-Bit & 4-Bit Sub-Blocks

         6-Bit子块的起始Running Disparity等于上一个10-Bit码的结尾Running Disparity。而4-Bit子块的Running Disparity等于6-Bit子块结尾的Running Disparity。4-Bit子块结尾的Running Disparity等于10-Bit码的Running Disparity。如图4所示。

 

 

 

图4:Running Disparity between Sub-Blocks

         ALTERA给出的计算Running Disparity规则如下所示(如果条件不符合,那么子块结尾的Running Disparity与子块开头的一样),与上述参考[1]的内容相符,注意和图2比较。

{C}l  满足下列条件,子块结尾的当前Running Disparity为正

{C}n  子块中“1”比“0”多

{C}n  6-Bit子块为6’b000111

{C}n  4-Bit子块为4’b0011

{C}l  满足下列条件,子块结尾的当前Running Disparity为负

{C}n  子块中“1”比“0”少

{C}n  6-Bit子块为6’b111000

{C}n  4-Bit子块为4’b1100

数据编码表

         参考[1]将8B10B数据码表分成两部分,即5B6B码和3B4B码表。

 

 

 

图5:5B6B数据码表

 

 

 

图6:3B4B数据码表

D.x.7有两种选择(即初始码D.x.P7或者可选码D.x.A7),编码器根据与5B6B编码组合是否产生5个连续“1”或者“0”来选择对应的码。序列中如果出现5个相同的位,使用逗号码(comma code)来进行同步。当RD=-1的时候,只有x=17、x=18和x=20时使用D.x.A7。当RD=+1的时候,只有x=11、x=13和x=14是才使用D.x.A7。当x=23、x=27、x=29和x=30时控制码K.x.7也使用A7这个码型。其他任何K码都不能使用x.A7码型,否则会有可能导致序列中逗号码对不齐(即导致逗号码漏检)。

只有K.28.1、K.28.5和K.28.7可以作为“comma”码,因为控制码K.x.y的可选编码使得其Disparity为0,而且数据bit流中找不到这种编码。

控制码表

 

 

 

图7:控制码

在控制代码中,K.28.1 K.28.5 K.28.7 是逗号序列,逗号序列是用来同步的(即用来8B10B比特流字节对齐),如果K.28.7没有被使用,序列0011111 或者 1100000 是不会出现在任何数据编码中的。

如果K.28.7被用于实际编码,一种比中提到的更复杂的同步码型需要被定义使用。组合成K.28.7的码与其它码容易组合成其它的逗号码,两个相邻码就有可能变成相交码,从而导致对齐错误。在任何情况下多个K.28.7序列不允许被同时使用,它将导致不可测的误对齐逗号序列。

所谓控制码,是比特流中的10B没有对应的8B数据字节,通俗讲就是这些码不属于上述图5和图6组合成的数据中。这些码用于底层控制功能。ALTERA的GXB链接建立之前一般都要发IDLE码,链接建立以后对了使得接收端能对齐数据字节边界还要在发数据的同时发送一些控制码,一般都是发送K28.5(即十六进制的BC)。

         另外,下面这句话应该如何理解:

K.28.7 is the only comma symbol that cannot be the result of a single bit error in the data stream.

FPGA中实现8B10B编解码

         ALTERA不但提供8B10B的IP,而且还提供Verilog编写的8B10B源代码。图8是一个具体应用,将数据先进行8B10B编码,然后并转传输出。

 

 

 

图8:应用实例

分析及结论

深入了解了什么8B10B编码,解码的过程与编码相逆,通过ALTERA提供源代码可以进一步学习解码的具体过程。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

8B10B编解码及FPGA实现 的相关文章

  • 交换机的配置文件备份到TFTP和FTP服务器

    1 构建拓扑 2 配置地址 Switch gt Switch gt en Switch conf t Switch config hostname 666 修改交换机名字 666 config interface vlan 1 进入虚拟接口
  • 推荐几款常用的Socks5代理软件

    一 Sockscap 荐 SocksCap是目前对网络游戏兼容性最好的代理工具之一 SocksCap32 软件是由美国 NEC USA Inc 公司出品的代理服务器第三方支持软件 拥有功能强大的 SOCKS 调度 xff0c 使用它就可以让
  • Nginx根据post参数转发请求 (OpenResty)

    最近有个需求 xff0c 需要nginx根据POST参数将请求转发到不同的后端 xff0c 调研后决定使用OpenResty xff08 Nginx 43 Lua xff09 作为代理服务器 写个小Demo location span cl
  • Windows 10访问共享时提示“过时的SMB1协议”的修复办法

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 公司有台Windows XP老版本系统的文件共享服务器 xff0c 前段时间好好的能正常访问 xff0c 今天访问时突然提示 因为文件共享不安全 xff0c 所以你不能连接
  • 关于Video Src 带有 blob:http的视频如何下载的问题

    我们如果使用爬虫 xff0c 想爬取一些视频的时候 xff0c 会发现一些网站提供的视频链接打开是 404 xff1b span class hljs tag lt span class hljs name video span span
  • Wcf 双工通信的应用

    概述 双工 xff08 Duplex xff09 模式的消息交换方式体现在消息交换过程中 xff0c 参与的双方均可以向对方发送消息 基于双工MEP消息交换可以看成是多个基本模式下 xff08 比如请求 回复模式和单项模式 xff09 消息
  • Foxit PDF Reader能有效升级日文包

    Foxit Reader 原名 Foxit PDF Reader xff0c 是一款 PDF文档阅读软件 xff0c 它具有比Adobe Reader更加小巧的身材 xff0c 更加快速的速度 xff0c 以及更加丰富的插件 xff0c 完
  • JIRA学习

    Jira是Atlassian公司出品的一款事务管理软件 无论是 需求 xff0c 还是 BUG xff0c 或是 任务 xff0c 都是 事务 的一种 xff0c 所以Jira可以胜任非常多的角色 xff1a 需求管理 缺陷跟踪 任务管理等
  • python 面向对象编程

    面向对象与面向过程 参考链接 xff1a https www liaoxuefeng com wiki 0014316089557264a6b348958f449949df42a6d3a2e542c000 0014318645694388f
  • pycharm调整代码长度分割线

    1 File gt Settings gt Code Style gt Right margin columns 的值为80 xff0c 大功告成 2 具体设置的数值可以根据个人电脑的屏幕大小而定 xff0c 如果屏幕比较大可以设置的长一些
  • ppt点击文字出现图片,再次点击消失

    实现效果 xff1a 在PPT一个页面的任意位置 xff0c 单击左键 xff0c 出现图片 xff1b 在图片上 xff0c 单击左键 xff0c 图片消失 实现思路 xff1a 给图片做两个动画 xff0c 一个进入 xff0c 文字作
  • OC中APPDelegate[[UIApplication shareApplication]delegate]]Swift实现

    直接上代码 xff1a var myDelegate AppDelegate myDelegate 61 UIApplication sharedApplication delegate as AppDelegate
  • 安装好Pycharm后如何配置Python解释器简易教程

    这两天有许多Python小白加入学习群 xff0c 并且问了许多关于Pycharm基本使用的问题 xff0c 今天小编就以配置Python解释器的问题给大家简单絮叨一下 1 一般来说 xff0c 当我们启动Pycharm xff0c 如果P
  • MySQL net start mysql 发生系统错误5 解决办法

    产生的原因是权限不够 用管理员权限打开命令提示符就OK 啦 Win10解决办法 xff1a 使用快捷键win 43 x xff0c 或右击开始图标 xff0c 打开命令提示符 xff08 管理员 xff09 就解决啦
  • Docker查看远端仓库的标签工具

    背景 最近入坑了docker xff0c 比如本地想要启动一个elastic容器的话 xff0c 直接通过以下命令即可快速启动一个elasticsearch的实例 docker run d p 9200 9200 p 9300 9300 n
  • 互斥锁mutex的简单实现

    mutex一般用于为一段代码加锁 xff0c 以保证这段代码的原子性 xff08 atomic xff09 操作 xff0c 即 xff1a 要么不执行这段代码 xff0c 要么将这段代码全部执行完毕 例如 xff0c 最简单的并发冲突问题
  • Exception in thread "main" java.lang.NoClassDefFoundError: XXX

    Exception in thread 34 main 34 java lang NoClassDefFoundError XXX编译时没有报错 xff0c 一运行就不听话 网上找了一大堆 xff0c 各种解决方案都不是适合我 xff0c
  • 分享几个免费IP地址查询API接口

    1 IP地址查询接口 xff1a http apis juhe cn ip ip2addr 要先去https www juhe cn docs api 申请APPKEY 2 新浪的IP地址查询接口 xff1a http int dpool
  • 解决Cannot read property 'range' of null 错误

    为什么80 的码农都做不了架构师 xff1f gt gt gt vue工程npm run serve start dev启动时 xff0c node modules文件报 xff1a Cannot read property 39 rang
  • Gitlab Pipelines一直无法通过的临时解决办法

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 新Gitlab系统是自己搭建的 xff0c 为了使用pages功能 xff0c 因为少于8 8版本貌似就不能使用 xff01 下一篇我会补充 xff0c 毕竟是转发的 xf

随机推荐

  • Generate Parentheses

    Given n pairs of parentheses write a function to generate all combinations of well formed parentheses For example given
  • C++11新特性不完全测试

    摘要 Lambda auto 统一初始化 xff0c 智能指针 xff0c Regex Random function and bind xff0c hash map 右值引用和Move语义 并发 多线程库 发布 阅读全文 Richard
  • matlab练习程序(生成高斯图像)

    cl m 61 31 n 61 31 img 61 zeros m 43 1 n 43 1 img 61 double img pi 61 3 1415926 sigma 61 10 for i 61 m 2 m 2 for j 61 n
  • Ubuntu远程桌面xrdp方法

    xrdp方式 xff0c 该方法支持多用户登录并远程桌面 首先在Ubuntu上安装GNOME 界面 xff0c 在终端输入命令 xff1a sudo apt get install gnome panel 安装完成后注销用户 点击自己用户的
  • Linux通过ssh传输文件

    一 scp是什么 scp是secure copy的简写 xff0c scp是linux系统下基于ssh登陆进行安全的远程文件拷贝命令 用于在Linux下进行远程拷贝文件的命令 xff0c 和它类似的命令有cp xff0c 不过cp只是在本机
  • 认识CoreData-基础使用

    第一篇文章中并没有讲CoreData的具体用法 xff0c 只是对CoreData做了一个详细的介绍 xff0c 算是一个开始和总结吧 这篇文章中会主要讲CoreData的基础使用 xff0c 以及在使用中需要注意的一些细节 因为文章中会插
  • 如何在Debian Linux上安装配置ISC DHCP服务器

    动态主机控制协议 DHCP 给网络管理员提供了一种便捷的方式 xff0c 为不断变化的网络主机或是动态网络提供网络层地址 xff0c 其中最常用的 DHCP 服务工具是 ISC DHCP Server DHCP 服务的目的是给主机提供必要的
  • SQL学习笔记1

    以下内容是我在学习SQL xff08 http www w3school com cn sql index asp xff09 的时候的学习笔记 学习时使用的数据库软件是MySQL 数据库可视化工具 SQLyogEnt 如果大家有发现什么不
  • BAT-使用BAT方法结束进程(删除进程)

    64 echo off taskkill f im GAM exe taskkill f im GCL10 exe
  • 解决访问apache中文乱码的问题

    解决访问 apache 中文乱码的问题 修改 apache 的配置文件 Vi etc httpd conf httpd conf 在 AddDefaultCharset UTF 8 下面添加 AddDefaultCharset UTF 8
  • linux远程灰屏,Ubuntu 15.10安装VNC灰屏问题解决

    1 在Ubuntu上首先需要安装vnc4server apt get install vnc4server 2 第一次执行vncserver的时候需要为客户端连接设置8位的密码 3 打开服务后 xff0c 根据客户端号连接 也可以指定客户端
  • Android IOS WebRTC 音视频开发总结(十五)-- 培训课程大纲

    Android IOS WebRTC 音视频开发总结 xff08 十五 xff09 培训课程大纲 最近在给公司做内部培训 xff0c 主要是关于即时通讯和移动视频通话 xff0c 包括android与android xff0c ios与io
  • Docker 1.12 : 使用 Swarm 的新姿势

    本文首发于我的博客 原文链接 xff1a Docker 1 12 新特性 Docker1 12 版本做出了很大的改动 xff0c 特别是增加了对 swarm 的原生支持 xff0c 下面对新版的使用做一个总结 xff0c 供大家查阅 doc
  • 用CSS写一个简单的幻灯片效果页面

    这里是修真院前端小课堂 xff0c 每篇分享文从 背景介绍 知识剖析 常见问题 解决方案 编码实战 扩展思考 更多讨论 参考文献 八个方面深度解析前端知识 技能 xff0c 本篇分享的是 xff1a 用CSS写一个简单的幻灯片效果页面 1
  • Go程序Windows运行时不显示cmd窗口

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 非常简单 xff0c 编译时候加参数 go build ldflags 61 34 H windowsgui 34 转载于 https my oschina net pok
  • Python3 创建虚拟环境

    目的 使用虚拟环境是为了隔离不同项目之间的Python库 创建虚拟环境 Python3 内置了venv模块 xff0c 首先创建项目目录 xff0c 进入目录后 xff0c 执行 python3 m venv venv 激活虚拟环境 在开始
  • Ubuntu18.04LTS 文件系统简记

    Ubuntu18 04LTS 文件系统 了解Linux文件系统是熟悉掌握使用Linux系统的第一步 首先安装名为tree的工具 sudo apt install tree 运行 tree help 查看tree命令的详细用法 运行 tree
  • windows下nvm安装node之后npm命令找不到问题解决办法

    主要关键解解决办法 xff1a 61 61 61 适 用于所有东西的安装 安装有关环境配置类的软件及其他 xff0c 一般情况下切记不要安装到c盘programfiles下 xff0c 否则会出现各种问题的报错 xff01 xff01 xf
  • [问题2014S14] 复旦高等代数II(13级)每周一题(第十四教学周)

    问题2014S14 设 V 为酉空间 证明 不存在 V 上的非零线性变换 varphi 使得对 V 中任一向量 v 均有 varphi v v 61 0 注 本题是复旦高代教材 P326 习题 9 1 5 的推广
  • 8B10B编解码及FPGA实现

    概述 在使用ALTERA的高速串行接口时 xff0c GXB模块里硬件实现了8B10B编码 xff0c 用户只是 傻瓜 式的使用 xff0c 笔者也一直没有弄清楚 网上搜索了一些学习资料 xff0c 结合参考文献希望能够对其进行消化 另外