8B/10B编码解析或者说是理解

8B10B编码用于解决光纤通讯和LVDS信号的直流平衡问题,避免长串0或1导致的采样识别错误。通过将8位数据转换为10位编码,确保传输信号中0和1的数量接近,减少基线漂移和解码错误风险。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

8B10B编码表可以查看链接:https://blog.csdn.net/weixin_36590806/article/details/109822204

8b10b解码verilog代码:ttps://blog.csdn.net/weixin_36590806/article/details/111059629

8b10b编码verilog代码:https://blog.csdn.net/weixin_36590806/article/details/111059582

转载:https://blog.csdn.net/weixin_36590806/article/details/109518493

本文就说下我自己对8B/10B的理解;

 

8b/10b最常见的是应用于光纤通讯和LVDS信号的。由于光模块光模块只能发送亮或者不亮,也就是0或者1这两种状态这种单极性码,那么这会存在一个问题,如果传输中出现较长的连0或者连1(例如111111100000000),那么接收端将没有办法正确的采样识别信号,另外还会由于单极性码含有直流分量,这种直流成分会随数据中1和0的随机变化也呈现随机性,这会引起接收端的基线漂移导致接收端误判。LVDS信号一样会存在这个问题,随着线路上的信号频率越来越高,如果线路上的0和1数量不均衡(直流不平衡)那么线路上的基电压会出现偏移,一样会导致解码错误。

总之一句话,8b/10b是为了解决直流平衡而推出的。

8B/10B编码是加扰二进制码的一种,在此之前这种技术已得到应用,只是没有像8B10B那么普遍。目前采用8b/10b编码的串行高速接口总线有IEEE 1394b、SATA、PCI Express、Infini-band、Fiber Channel、RapidIO、USB3.0、MIPI M-phy 等。

 

8b/10b编码方式详解

8b/10b编码的位域映射关系

编码前的原始数据以字节为单位,每字节数据从高到低位用HGFEDCBA表示,首先将8b拆为高3位HGF,低5位EDCBA,然后将HGF从3bit编码成4bit,编码后的4bit用jhgf表示,将EDCBA从5bit编码为6bit, 编码后后的6bit为iedcba, 将编码的4bit和6bit拼在一起即为10bit jhgfiedcba,发送时由于是小端模式,因为表示为abcdeifghj,如图下:


通常人们会将编码前低位的5bit EDCBA按其十进字数值计为X,高位的3bit HGF按其十进制数值为计Y,把这8bit数据计为D.x.y。在进行传输时我们除了传输数据本身,我们还需要嵌入一些控制信号,控制信号则依上面的规则计为K.x.y(称之为“comma”)。这里会有一个疑问,D.x.y中的x最多到D.31.y,y最多到D.x.7,xy都被数据占完了,还用什么表示控制码的K.x,y,下面一一道来。

3b/4b和5b/6b码表

8bit原始数据有256个码,而编码后的10b数据有1024码,这里面肯定有很多是用不着的,那么具体到一个8bit的数据编码到什么样的10bit数据能够尽可能的做到直流平衡?这个可以自己去推导,也可以直接查表。

symbol列表示可读命名, EDCBA是原始5b,abcdei是编码后的6b, HGF是原始3b, fghj是编码后4b。这个表中Symbol列以D开头的行是数据的编码,以k开头的是控制符号的编码。看到这里应该就明白了用什么表示k.x.y,因为5b6b码表中除了K28.y外其它几个码值的K和D的x码值是共用的,如D.K/23,这种情况下用以区分数据和控制符的其实是在3b4b码表的D.x.7,D.x.7有两个编码一个是主编码D.x.P7,另一个是D.x.A7。关于控制码也有一个专门的码表,如下:

从控制符码表可以看到k.28.y本身的K.28跟D.28是不同的码值。K27.y, K29.y,K30.y的编码由于y=7存在两种编码,也不冲突。

但上面的码表有个疑问表上的RD表示什么呢?从码表上可以看到在4bit的子分组中,16种编码中只有6 种是完美平衡(0,1个数相等)的,这对于3bit的8种编码值是不够的。 同时,在6bit的子分组中也只有20种编码是完美平衡的,对于5bit的32种编码值也是不够的。RD( running disparity)极性偏差就是用来表示0,1的不平衡性的,

编码时,数据不断地进入8b10b编码器生成10b数据,前面所有已编码的10b数据不一致性累积产生的状态就是运行不一致性(Runing Disparity)就是RD。RD仅会出现+1与-1两种状态,分别代表位”1”比位”0”多或位”0”比位”1”多,其初始值是-1。根据Current RD的值来决定5B/4B和 3B/4B编码映射。

这样,经过8B/10B编码以后,连续的“1”和“0”基本上不会超过5bit,只有在使用comma时,才会出现连续的5个0或1。

在FPGA设计中实现源同步LVDS接口的字对齐,是一个涉及精确时序控制和信号处理的复杂过程。它要求设计者充分理解LVDS信号的特性、8B/10B编码规则以及时钟恢复技术。以下是实现字对齐和数据稳定恢复的关键步骤: 参考资源链接:[FPGA中LVDS接收的字对齐策略:源同步时钟与8B/10B编码应用](https://wenku.csdn.net/doc/1iobx63jmb?spm=1055.2569.3001.10343) 1. **理解LVDS信号特性**:LVDS是一种低电压差分信号技术,它通过差分对传输数据,有效地减少共模噪声,提高信号的抗干扰能力。由于差分信号的特性,接收端可以有效地从噪声中提取信号,因此,在设计中应尽量保持信号的差分完整性。 2. **应用8B/10B编码**:8B/10B编码是一种常用的数据编码技术,它将8位数据编码10位符号,增加了额外的位用于字节边界标识和同步。在字对齐的过程中,可以通过识别特定的同步字符(如K28.5)来确定数据的起始点,这对于后续的数据同步至关重要。 3. **时钟恢复与节拍同步**:在源同步设计中,数据传输常常伴随着一个独立的时钟信号或者使用数据流本身携带的时钟信息(如在8B/10B编码中)。FPGA需要能够从接收到的信号中恢复出时钟信号,该信号随后被用于同步数据接收。这通常涉及到锁相环(PLL)或数字时钟管理(DCM)等技术,以确保时钟的稳定性和准确性。 4. **实施字对齐算法**:字对齐通常在FPGA的逻辑中实现,可以采用硬件描述语言(HDL)如VHDL或Verilog进行编写。字对齐算法需要能够检测到8B/10B编码中的同步字符,并据此确定数据字的边界。字对齐后,数据可以按预期的格式正确地解码和使用。 5. **错误检测与校验**:为了确保数据的完整性和正确性,在字对齐后通常还需要执行错误检测和校验。这可能包括奇偶校验、循环冗余校验(CRC)等技术。 总之,FPGA中的字对齐和数据恢复是一个涉及多个技术层面的综合过程。通过理解LVDS和8B/10B编码的特性,并运用精确的时钟恢复技术,可以有效地实现高速数据流的稳定接收和处理。为了深入掌握这一过程,推荐阅读《FPGA中LVDS接收的字对齐策略:源同步时钟与8B/10B编码应用》。这份资源提供了全面的理论知识和实践指导,帮助读者深入理解并实践FPGA中字对齐的相关技术。 参考资源链接:[FPGA中LVDS接收的字对齐策略:源同步时钟与8B/10B编码应用](https://wenku.csdn.net/doc/1iobx63jmb?spm=1055.2569.3001.10343)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值