背景
串行电路通常采用交流耦合方式(串接电容)。理想电容阻抗公式为 Z=1/(2πf),频率越低,阻抗越高。若信号中直流分量过大,会导致幅度衰减严重,甚至无法识别高低电平。因此,保持直流平衡(使 0 和 1 的数量尽可能相等)是提升通信可靠性的关键。
编码原理
8B/10B 编码将 8 位并行数据拆分为高 3 位和低 5 位,分别通过 3B/4B 和 5B/6B 模块进行转换,最终输出 10 位串行码。注意高低位编码后的极性偏差(RD)是级联传递的,并非独立计算。

编码映射
具体的 5B/6B 和 3B/4B 映射关系需查阅标准转换表。以 5B/6B 为例,输入 EDCBA = 01010,查表可得 RD- 时为 010110,RD+ 时同样为 010110(差异为 0)。



关键术语
- D.x.y:数据码。低 5 位十进制值为 x,高 3 位为 y。例如 D1.2 对应 8'b010_00001。
- K.x.y:控制码(如 K28.5),用于同步,类似 H_SYNC。
- RD (Running Disparity):极性偏差。+1 表示 1 比 0 多,-1 表示 0 比 1 多。初始态规定为 -1。
- P7/A7 码:针对 D.x.7 特例。当组合后可能出现连续 5 个 0 或 1 时,需根据当前 RD 选择 P7 或 A7 编码以避免违规。
设计思路
实现 8B/10B 主要有三种方式:查找表、纯逻辑运算、模块化混合。查找表简单但占用存储资源;纯逻辑运算节省面积但逻辑复杂度高,可能限制最高工作频率。本方案采用模块化实现,在资源消耗与速度之间取得平衡。
核心逻辑
这里有个常见的误区需要澄清:很多资料认为上一次的 8B10B 整体 RD 直接作为本次 5B6B 和 3B4B 的起始 RD,这是错误的。
正确的判决逻辑链如下:
- 上一次 8B10B 编码结果的 RD 数值,用作本次 5B6B 编码的起始 RD。
- 本次 5B6B 编码结果的 RD,作为本次 3B4B 编码的起始 RD。
- 本次 3B4B 编码结果的 RD,才是本次完整的 8B10B 编码 RD。
排查许久未果,确认了该状态流转逻辑后,代码运行结果才符合 Xilinx 手册规范。下图展示了 D23.4 在正确逻辑下的 RD 变化过程。


