8B10B编解码及FPGA实现(转)
"8B10B编解码及FPGA实现" 在使用 ALTERA 的高速串行接口时,GXB 模块里硬件实现了 8B/10B 编码,用户只是“傻瓜”式的使用,笔者也一直没有弄清楚。网上搜索了一些学习资料,结合参考文献希望能够对其进行消化。另外,ALTERA 现在已经提供 8B/10B IP,用户可以直接使用,不过有时候为了代码可移植性需要自己写代码实现 8B/10B 编解码,笔者希望在这方面也做些实践。 8B/10B 编码概念: 8B/10B 编码的基本概念网上可以轻易找到答案,简单的说就是将 8bit 数据转换成 10bit 数据,显然这个转换过程有 20%的开销,大部分公开资料提出 8B/10B 编码的开销是 25%,我同意开销大于 20%,因为码流中必然存在一些控制码,但是为何是 25%而不是 24%或者 26%呢? 8B/10B 编码的特性之一就是保证直流平衡,即编码后二进制数据流中“0”和“1”的数量基本保持一致,因为我们知道当高速串行流的逻辑 1 和逻辑 0 有多个位没有产生变化时(即所谓的长连 0 和长连 1),信号的转换就会因为电压位阶的关系而造成信号错误,直流平衡最大好处就是可以克服这个问题。 8B/10B 编码是怎么做到 DC 平衡的呢?转换的时候,连续的“0”或者“1”数量不超过 5 位,即每 5 个连续的“0”或者“1”后必须插入一位“1”或者“0”,从而保证信号 DC 平衡。这样可以保证串行数据可以在接收端被正确复原,同时利用一些特殊代码(K 码)也可以帮助接收端进行复原工作,且可以在早期发现数据位传输错误,抑制错误继续发生。 通过以上解释,那么一个 8bit 的二进制位流,变成 10bit 后,10B 中 0 和 1 的位数只可能出现下面 3 种可能情况: {C} 有 5 个 0 和 5 个 1 {C} 有 6 个 0 和 4 个 1 {C} 有 4 个 0 和 6 个 1 这样就引出一个新的名词“不均等性”,即 Disparity。就是 1 的位数和 0 的位数的差值,根据上述 3 种情况,那么就有3 种 Disparity,即 0、-2、+2。 8B/10B 编码工作原理: 图 1:8B/10B 编码器逻辑设计原理框图 如图 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} 如果 6-Bit 子块为“000111”,那么 6-Bit 子块结束 RD 为正 {C} 如果 4-Bit 子块为“0011”,那么 4-Bit 子块结束 RD 为正 {C} 如果 6-Bit 子块为“111000”,那么 6-Bit 子块结束 RD 为负 {C} 如果 4-Bit 子块为“1100”,那么 4-Bit 子块结束 RD 为负 总的计算 Running Disparity 的原则如图 2 所示: 图 2:计算 Running Disparity 规则
- 粉丝: 1
- 资源: 27
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助