高速接口_(10Gbps )万兆网络中物理编码层 64B66B 编码解码实现
万兆网络中物理编码层 64B66B 编码解码实现
目的
- 万兆以太网的物理编码层(PCS)的编码和解码工作原理和实现方法
- 使用赛灵思官方提供的 GT Wizard IP 来配置和控制高速接口的参数和功能
- 实现自定义的 64B66B 编码器和解码器,并进行了测试和验证
- 使用自定义的数据或标准的以太网数据来进行高速传输
前提条件
- 需要有一个支持 10.3125 Gbps 的高速接口的开发板或服务器
- 需要有一定的 FPGA 开发和高速接口设计的基础知识
万兆以太网的架构和层次结构
其中:
- MAC层:媒体访问控制层,负责生成和解析以太网帧,提供全双工的MAC接口。
- RS子层:重协调子层,负责在MAC层和XGMII子层之间进行信号映射,添加或删除控制字符。
- XGMII子层:10千兆位媒体独立接口子层,负责提供32位宽的并行数据路径,支持全双工操作。
- PCS子层:物理编码子层,负责将8字节的XGMII数据编码为66位的块,或者将66位的块解码为8字节的XGMII数据,传输给PMA子层或从PMA子层接收。
- PMA子层:物理介质附着子层,负责将PCS子层的数据进行串行化或并行化,并提供时钟恢复功能。
- PMD子层:物理介质相关子层,负责将PMA子层的信号转换为适合传输介质的电气或光学信号,或者将传输介质的信号转换为适合PMA子层的信号。
- MDI子层:媒体相关接口子层,负责定义传输介质的类型、规格和连接方式。
物理编码层(PCS)的作用和结构
- PCS 是万兆以太网中负责将 MAC 层的数据转换为适合高速传输的格式的层
- PCS 的主要功能有:
- 将 64 位数据转换为 66 位数据,添加同步头(SYNC Header)来区分不同类型的帧
- 对数据进行加扰(Scrambling)来保证零一均衡,避免直流失调和时钟恢复困难
- 对数据进行变速器(Gearbox)操作,实现并行数据和串行数据之间的速率转换
- 对接收到的数据进行同步头搜索(SYNC Header Search),实现帧对齐和锁定
- 对发送端的数据进行序列暂停(Sequence Pause),实现流量控制
- PCS 的结构如下图所示:
说明:
- MAC层是媒体访问控制层,负责以太网帧的生成和解析。
MAC 层负责将上层提供的数据帧进行封装、校验、排队等处理,然后通过可重组子层(RS)将数据帧分割为 64 比特的块,并添加一些控制信息,然后交给 PCS 层
- RS层是重新分片层,负责在MAC层和PCS层之间进行数据的分片和重组。
- PCS层是物理编码层,负责将64比特数据转换为66比特数据,并进行加扰和同步头的添加。
PCS 层负责将 MAC 层提供的数据进行编码、加扰、同步等处理,然后通过物理媒介附件层(PMA)和物理媒介依赖子层(PMD)将数据串行化并发送到物理媒介上
- PMA层是物理媒介附加层,负责将66比特数据转换为高速接口所需的格式,并进行时钟恢复和对齐。
- PMD层是物理媒介依赖层,负责将高速接口的信号转换为电气或光学信号,并进行驱动和接收。
- 高速接口是用于连接不同设备的串行接口,如SFP+或QSFP+等。
64B66B 编码原理和规则
- 64B66B 编码是一种将 64 位数据转换为 66 位数据的编码方式,每个帧都有两位同步头来标识帧类型
- 64B66B 编码有两种帧类型:
- 纯数据帧(Data Frame):同步头为 01,后面跟着 64 位数据,无控制字(Control Character)
- 混合数据帧(Mixed Data Frame):同步头为 10,后面跟着一个字节的类型字段(Type Field),表示控制字或数据字的个数,以及 56 位的控制字或数据字
- 控制字是一种用于表示特殊含义的 7 位字符,如空闲、起始、结束等,它们不会出现在正常的数据中,可以用于帧对齐和识别
- 数据字是一种用于表示正常数据的 8 位字符,它们可以是 MAC 层传递过来的任意数据
- 下表给出了不同类型字段对应的混合数据帧结构:
Type Field | Frame Structure | Description |
---|---|---|
0x78 | SYNC + Type + D0 + D1 + … + D6 | 起始帧,后面跟着七个字节的数据 |
0x79 | SYNC + Type + C0 + D0 + … + D5 | 起始帧,后面跟着一个控制字和六个字节的数据 |
… | … | … |
0x7F | SYNC + Type + C0 + C1 + … + C6 | 起始帧,后面跟着七个控制字 |
0x87 | SYNC + Type + C0 + C1 + … + C7 | 结束帧,后面跟着八个控制字 |
… | … | … |
0x8F | SYNC + Type + D0 + D1 + … + D7 | 结束帧,后面跟着八个字节的数据 |
0x1E | SYNC + Type + C0 + C1 + … + C7 | 空闲帧,后面跟着八个控制字 |
加扰和解扰的原理和方法
- 加扰(Scrambling)是一种对数据进行变换的方法,目的是使数据中的零和一的比例接近 50%,避免出现长串的零或一,影响高速传输的质量
- 解扰(Descrambling)是一种对加扰后的数据进行还原的方法,目的是恢复原始的数据内容,便于后续的处理
- 加扰和解扰使用相同的多项式和电路,只是输入和输出互换,多项式为 x^58 + x^19 + 1
设计加扰器
根据加扰器的结构框图设计加扰器,并用 verilog 代码实现,使用以上提供的
测试向量进行激励,对比加扰之后的结果是否正确。
58个寄存器初始值初始值全 1;
有两种方案:
第一种使用组合逻辑描述这个编码过程,然后用寄存器锁存编码结果。
模块接口定义
输入:
sclk,系统时钟
rst,复位, 高有效
data_valid_in,rawdata 有效标志
data_in,需要加扰的数据[63:0]
head_valid_in,头有效信号
head_in,头信号用于 64/66 编码
输出:
data_valid_out,加扰之后的数据有效标志
Data_out,加扰后的数据
Head_valid_out,头有效信号
Head_out,
第二种方案:使用移位寄存器加时序逻辑的并行运算模式
S58=D58+S19+S0
S59=D59+S20+S1
S60=D60+S21+S2
…………………………
需要推到出来送入此绕码模块并行的 64bit 数据 1 个时钟节拍输出绕码结果
推到过程标
绿色表示前一拍的值,紫色表示当前拍值
Sr 寄存器变量需要时序逻辑实现。Sr 在没有赋值之前是保存着上一拍的组合逻辑结果。
S 组合逻辑实现,s[64]~s[127]是当前拍的组合逻辑结果
D 当前的输入等待编码的数据,可以理解 d[64:127] 当前输入的 d[0:63]
s58 | = | d58 | s19 | s0 | sr58 | |
---|---|---|---|---|---|---|
s59 | = | d59 | s20 | s1 | sr59 | |
s60 | = | d60 | s21 | s2 | sr60 | |
s61 | = | d61 | s22 | s3 | sr61 | |
s62 | = | d62 | s23 | s4 | sr62 | |
s63 | = | d63 | s24 | s5 | sr63 | |
s64 | = | d64 | sr25 | sr6 | = | sr0 |
s65 | = | d65 | sr26 | sr7 | = | sr1 |
---|---|---|---|---|---|---|
s66 | = | d66 | sr27 | sr8 | = | sr2 |
s67 | = | d67 | sr28 | sr9 | = | sr3 |
s68 | = | d68 | sr29 | sr10 | = | sr4 |
s69 | = | d69 | sr30 | sr11 | = | sr5 |
s70 | = | d70 | sr31 | sr12 | = | sr6 |
s71 | = | d71 | sr32 | sr13 | = | sr7 |
s72 | = | d72 | sr33 | sr14 | = | sr8 |
s73 | = | d73 | sr34 | sr15 | = | sr9 |
s74 | = | d74 | sr35 | sr16 | = | sr10 |
s75 | = | d75 | sr36 | sr17 | = | sr11 |
s76 | = | d76 | sr37 | sr18 | = | sr12 |
s77 | = | d77 | sr38 | sr19 | = | sr13 |
s78 | = | d78 | sr39 | sr20 | = | sr14 |
s79 | = | d79 | sr40 | sr21 | = | sr15 |
s80 | = | d80 | sr41 | sr22 | = | sr16 |
s81 | = | d81 | sr42 | sr23 | = | sr17 |
s82 | = | d82 | sr43 | sr24 | = | sr18 |
s83 | = | d83 | sr44 | sr25 | = | sr19 |
s84 | = | d84 | sr45 | sr26 | = | sr20 |
s85 | = | d85 | sr46 | sr27 | = | sr21 |
s86 | = | d86 | sr47 | sr28 | = | sr22 |
s87 | = | d87 | sr48 | sr29 | = | sr23 |
s88 | = | d88 | sr49 | sr30 | = | sr24 |
s89 | = | d89 | sr50 | sr31 | = | sr25 |
s90 | = | d90 | sr51 | sr32 | = | sr26 |
s91 | = | d91 | sr52 | sr33 | = | sr27 |
s92 | = | d92 | sr53 | sr34 | = | sr28 |
s93 | = | d93 | sr54 | sr35 | = | sr29 |
s94 | = | d94 | sr55 | sr36 | = | sr30 |
s95 | = | d95 | sr56 | sr37 | = | sr31 |
s96 | = | d96 | sr57 | sr38 | = | sr32 |
s97 | = | d97 | sr58 | sr39 | = | sr33 |
s98 | = | d98 | sr59 | sr40 | = | sr34 |
s99 | = | d99 | sr60 | sr41 | = | sr35 |
s100 | = | d100 | sr61 | sr42 | = | sr36 |
s101 | = | d101 | sr62 | sr43 | = | sr37 |
s102 | = | d102 | sr63 | sr44 | = | sr38 |
s103 | = | d103 | s64 | sr45 | = | sr39 |
s104 | = | d104 | s65 | sr46 | = | sr40 |
s105 | = | d105 | s66 | sr47 | = | sr41 |
s106 | = | d106 | s67 | sr48 | = | sr42 |
s107 | = | d107 | s68 | sr49 | = | sr43 |
s108 | = | d108 | s69 | sr50 | = | sr44 |
---|---|---|---|---|---|---|
s109 | = | d109 | s70 | sr51 | = | sr45 |
s110 | = | d110 | s71 | sr52 | = | sr46 |
s111 | = | d111 | s72 | sr53 | = | sr47 |
s112 | = | d112 | s73 | sr54 | = | sr48 |
s113 | = | d113 | s74 | sr55 | = | sr49 |
s114 | = | d114 | s75 | sr56 | = | sr50 |
s115 | = | d115 | s76 | sr57 | = | sr51 |
s116 | = | d116 | s77 | sr58 | = | sr52 |
s117 | = | d117 | s78 | sr59 | = | sr53 |
s118 | = | d118 | s79 | sr60 | = | sr54 |
s119 | = | d119 | s80 | sr61 | = | sr55 |
s120 | = | d120 | s81 | sr62 | = | sr56 |
s121 | = | d121 | s82 | sr63 | = | sr57 |
s122 | = | d122 | s83 | s64 | = | sr58 |
s123 | = | d123 | s84 | s65 | = | sr59 |
s124 | = | d124 | s85 | s66 | = | sr60 |
s125 | = | d125 | s86 | s67 | = | sr61 |
s126 | = | d126 | s87 | s68 | = | sr62 |
s127 | = | d127 | s88 | s69 | = | sr63 |
设计解扰器
第一种方法:
模块接口定义
输入:
sclk,系统时钟
rst,复位, 高有效
data_valid_in,rawdata 有效标志
data_in,需要加扰的数据[63:0]
head_valid_in,头有效信号
head_in,头信号用于 64/66 编码
输出:
data_valid_out,加扰之后的数据有效标志
Data_out,加扰后的数据
Head_valid_out,头有效信号
Head_out,
第二种方法:
并行推导解扰的公式
D[0:63]解扰输出
S64~s127 是待解码的数据输入
Sr0~63 在没有更新之前是保存着上一排的 s 的值。
d58 | = | s58 | s19 | s0 | s58 | = | sr58 | |
---|---|---|---|---|---|---|---|---|
d59 | = | s59 | s20 | s1 | s59 | = | sr59 | |
d60 | = | s60 | s21 | s2 | s60 | = | sr60 | |
d61 | = | s61 | s22 | s3 | s61 | = | sr61 | |
d62 | = | s62 | s23 | s4 | s62 | = | sr62 | |
d63 | = | s63 | s24 | s5 | s63 | = | sr63 | |
d0 | = | s64 | sr25 | sr6 | s64 | = | sr0 | |
d1 | = | s65 | sr26 | sr7 | s65 | = | sr1 | |
d2 | = | s66 | sr27 | sr8 | s66 | = | sr2 | |
d3 | = | s67 | sr28 | sr9 | s67 | = | sr3 | |
d4 | = | s68 | sr29 | sr10 | s68 | = | sr4 | |
d5 | = | s69 | sr30 | sr11 | s69 | = | sr5 | |
d6 | = | s70 | sr31 | sr12 | s70 | = | sr6 | |
d7 | = | s71 | sr32 | sr13 | s71 | = | sr7 | |
d8 | = | s72 | sr33 | sr14 | s72 | = | sr8 | |
d9 | = | s73 | sr34 | sr15 | s73 | = | sr9 | |
d10 | = | s74 | sr35 | sr16 | s74 | = | sr10 | |
d11 | = | s75 | sr36 | sr17 | s75 | = | sr11 | |
d12 | = | s76 | sr37 | sr18 | s76 | = | sr12 | |
d13 | = | s77 | sr38 | sr19 | s77 | = | sr13 | |
d14 | = | s78 | sr39 | sr20 | s78 | = | sr14 | |
d15 | = | s79 | sr40 | sr21 | s79 | = | sr15 | |
d16 | = | s80 | sr41 | sr22 | s80 | = | sr16 | |
d17 | = | s81 | sr42 | sr23 | s81 | = | sr17 | |
d18 | = | s82 | sr43 | sr24 | s82 | = | sr18 | |
d19 | = | s83 | sr44 | sr25 | s83 | = | sr19 | |
d20 | = | s84 | sr45 | sr26 | s84 | = | sr20 | |
d21 | = | s85 | sr46 | sr27 | s85 | = | sr21 | |
d22 | = | s86 | sr47 | sr28 | s86 | = | sr22 | |
d23 | = | s87 | sr48 | sr29 | s87 | = | sr23 | |
d24 | = | s88 | sr49 | sr30 | s88 | = | sr24 | |
d25 | = | s89 | sr50 | sr31 | s89 | = | sr25 | |
d26 | = | s90 | sr51 | sr32 | s90 | = | sr26 | |
d27 | = | s91 | sr52 | sr33 | s91 | = | sr27 | |
d28 | = | s92 | sr53 | sr34 | s92 | = | sr28 | |
d29 | = | s93 | sr54 | sr35 | s93 | = | sr29 | |
d30 | = | s94 | sr55 | sr36 | s94 | = | sr30 | |
d31 | = | s95 | sr56 | sr37 | s95 | = | sr31 | |
d32 | = | s96 | sr57 | sr38 | s96 | = | sr32 | |
d33 | = | s97 | sr58 | sr39 | s97 | = | sr33 | |
d34 | = | s98 | sr59 | sr40 | s98 | = | sr34 | |
d35 | = | s99 | sr60 | sr41 | s99 | = | sr35 | |
d36 | = | s100 | sr61 | sr42 | s100 | = | sr36 | |
d37 | = | s101 | sr62 | sr43 | s101 | = | sr37 | |
d38 | = | s102 | sr63 | sr44 | s102 | = | sr38 | |
d39 | = | s103 | s64 | sr45 | s103 | = | sr39 | |
d40 | = | s104 | s65 | sr46 | s104 | = | sr40 | |
d41 | = | s105 | s66 | sr47 | s105 | = | sr41 | |
d42 | = | s106 | s67 | sr48 | s106 | = | sr42 | |
d43 | = | s107 | s68 | sr49 | s107 | = | sr43 | |
d44 | = | s108 | s69 | sr50 | s108 | = | sr44 | |
d45 | = | s109 | s70 | sr51 | s109 | = | sr45 | |
d46 | = | s110 | s71 | sr52 | s110 | = | sr46 | |
d47 | = | s111 | s72 | sr53 | s111 | = | sr47 | |
d48 | = | s112 | s73 | sr54 | s112 | = | sr48 | |
d49 | = | s113 | s74 | sr55 | s113 | = | sr49 | |
d50 | = | s114 | s75 | sr56 | s114 | = | sr50 | |
d51 | = | s115 | s76 | sr57 | s115 | = | sr51 | |
d52 | = | s116 | s77 | sr58 | s116 | = | sr52 | |
d53 | = | s117 | s78 | sr59 | s117 | = | sr53 | |
d54 | = | s118 | s79 | sr60 | s118 | = | sr54 | |
---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- |
d55 | = | s119 | s80 | sr61 | s119 | = | sr55 | |
d56 | = | s120 | s81 | sr62 | s120 | = | sr56 | |
d57 | = | s121 | s82 | sr63 | s121 | = | sr57 | |
d58 | = | s122 | s83 | s64 | s122 | = | sr58 | |
d59 | = | s123 | s84 | s65 | s123 | = | sr59 | |
d60 | = | s124 | s85 | s66 | s124 | = | sr60 | |
d61 | = | s125 | s86 | s67 | s125 | = | sr61 | |
d62 | = | s126 | s87 | s68 | s126 | = | sr62 | |
d63 | = | s127 | s88 | s69 | s127 | = | sr63 |
GT Wizard IP 的配置和使用
GT Wizard IP 是什么?
- GT Wizard IP 是赛灵思官方提供的一个用于配置高速接口的 IP,可以支持多种协议和模式,如 64B/66B、8B/10B、Aurora 等。
- GT Wizard IP 可以根据用户的选择,生成相应的 GT 子系统,包括 PMA、PCS、TX/RX Buffer 等模块,以及一些示例代码和测试平台。
- GT Wizard IP 可以帮助用户快速搭建高速接口的设计,无需了解底层的细节,只需要通过图形界面设置一些参数,就可以生成可综合的 HDL 代码。
如何配置 GT Wizard IP?
- 配置 GT Wizard IP 的第一步是选择目标器件和目标协议,例如,在项目中,选择 Kintex UltraScale+ 器件和 64B/66B 协议。
- 配置 GT Wizard IP 的第二步是设置 PMA 层的参数,例如,在本项目中,设置线速率为 10.3125 Gbps,参考时钟为 156.25 MHz,数据宽度为 64 位等。
- 配置 GT Wizard IP 的第三步是设置 PCS 层的参数,例如,在本项目中,设置编码方式为 64B/66B,同步头为 01 或 10,加扰方式为 X58 + X19 + 1 等。
- 配置 GT Wizard IP 的第四步是设置 Buffer 层的参数,例如,在本项目中,设置 TX Buffer 和 RX Buffer 的深度为 16 字节,使能了 TX Buffer 的 FIFO 模式和 RX Buffer 的帧模式等。
- 配置 GT Wizard IP 的第五步是生成输出文件,包括 HDL 源码、仿真文件、约束文件、文档等。
如何使用 GT Wizard IP?
- 使用 GT Wizard IP 的第一步是将生成的 HDL 源码添加到项目中,并根据需要修改一些参数或逻辑。
- 使用 GT Wizard IP 的第二步是将生成的约束文件添加到项目中,并根据实际的管脚分配进行修改。
- 使用 GT Wizard IP 的第三步是将生成的仿真文件添加到项目中,并根据需要修改一些测试向量或波形。
- 使用 GT Wizard IP 的第四步是进行综合、布局、布线、生成比特流等操作,得到可以烧录到 FPGA 上的文件。
- 使用 GT Wizard IP 的第五步是将 FPGA 连接到高速接口的物理媒介上,并进行实际的数据传输和测试。
举例说明
- 假设要设计一个 10Gbps 的以太网收发器,使用 Kintex UltraScale+ 器件和 FMC 卡作为硬件平台。
- 可以按照以下步骤来配置和使用 GT Wizard IP:
- 打开 Vivado 软件,创建一个新项目,选择 Kintex UltraScale+ 器件作为目标器件。
- 在项目中添加一个新的 IP 核,搜索并选择 GT Wizard IP。
- 在 GT Wizard IP 的图形界面中,选择 Line Rate 为 10.3125 Gbps,Reference Clock Frequency 为 156.25 MHz,Data Width 为 64 bits。
- 在 PMA Attributes 标签页中,选择 Transceiver Technology 为 GTH/GTY/GTP/GTX/GTPE2/GTZE2/GTHE4/GTYE4/GTME4/GTYE3/GTHE3/GTXE2/GTPA1/GTPA2/GTPDUAL,选择 Line Side Mode 为 64B/66B,选择 Reference Clock Selection 为 Single-ended。
- 在 PCS Attributes 标签页中,选择 PCS Mode 为 64B/66B,选择 Sync Header 为 01 or 10,选择 Scrambler Polynomial 为 X58 + X19 + 1。
- 在 Buffer Attributes 标签页中,选择 TX Buffer Depth 为 16 bytes,选择 RX Buffer Depth 为 16 bytes,使能 TX Buffer FIFO Mode 和 RX Buffer Frame Mode。
- 在 Output Products 标签页中,选择生成 HDL Source Files、Simulation Files、Constraints Files、Documentation 等输出文件。
- 点击 Generate 按钮,等待 GT Wizard IP 生成输出文件,并将其添加到项目中。
- 在项目中打开生成的 HDL 源码,查看并修改一些参数或逻辑,例如,在本文中,我们修改了 TX 的数据生成逻辑,使其能够发送一个以太网帧的数据。
- 在项目中打开生成的约束文件,查看并修改一些管脚分配,例如,在本文中,我们修改了 GT REFCLK 的管脚分配,使其能够接收 FMC 卡上的差分时钟信号。
- 在项目中打开生成的仿真文件,查看并修改一些测试向量或波形,例如,在本文中,我们修改了 RX 的数据检测逻辑,使其能够验证接收到的以太网帧的数据是否正确。
- 在项目中进行综合、布局、布线、生成比特流等操作,得到可以烧录到 FPGA 上的文件。
- 将 FPGA 连接到 FMC 卡上,并将 FMC 卡上的高速接口连接到以太网交换机或其他设备上。
- 使用 JTAG 或其他方式将比特流文件烧录到 FPGA 上,并观察高速接口的数据传输和测试结果。
- GT Wizard 的主要接口有:
- TXUSRCLK/TXUSRCLK2:用户时钟,用于驱动 TX 端的并行数据和控制信号
- TXDATA/TXD[63:0]:用户数据,64 比特宽度,用于发送到 PCS 的编码数据
- TXHEADER/TXH[1:0]:用户头部,2 比特宽度,用于发送到 PCS 的同步头
- TXELECIDLE:用户空闲信号,用于控制 PCS 进入空闲状态
- RXUSRCLK/RXUSRCLK2:用户时钟,用于驱动 RX 端的并行数据和控制信号
- RXDATA/RXD[63:0]:用户数据,64 比特宽度,用于接收从 PCS 的编码数据
- RXHEADER/RXH[1:0]:用户头部,2 比特宽度,用于接收从 PCS 的同步头
- RXELECIDLE:用户空闲信号,用于检测 PCS 是否处于空闲状态
变速器(Gearbox)的原理和方法
Gearbox是什么?
- Gearbox是一种用于高速串行接口的数据速率转换器,可以在不同的数据速率之间进行数据的对齐和转换。
- Gearbox可以分为发送端和接收端,发送端用于将并行数据转换为串行数据,接收端用于将串行数据转换为并行数据,并进行同步头的搜索和锁定。
Gearbox为什么需要?
-
Gearbox的作用是为了适应高速接口的数据传输需求,例如:
- 在10G以太网中,物理编码层(PCS)使用64位数据,而物理媒介层(PMA)使用66位数据,因此需要一个64B/66B同步Gearbox来进行转换。
- 在PCIe中,传输层(TL)使用32位数据,而物理层(PHY)使用8位或16位数据,因此需要一个32B/8B或32B/16B异步Gearbox来进行转换。
-
Gearbox的主要作用是解决高速串行接口中的两个问题:
- 数据速率不匹配:由于不同的编码方式或者不同的传输介质,发送端和接收端的数据速率可能不一致,例如64B/66B编码和8B/10B编码。
- 数据同步丢失:由于高速串行接口中没有时钟信号,发送端和接收端需要通过同步头来进行数据的对齐和恢复,但是由于信号干扰或者编码方式的不同,同步头可能会被破坏或者无法识别。
Gearbox如何工作?
-
Gearbox工作的基本原理是使用一组寄存器和逻辑门来实现数据的缓存、移位和选择。
-
Gearbox有两个主要部分:发送端Gearbox和接收端Gearbox。
-
发送端Gearbox将64位并行数据转换为66位串行数据,接收端Gearbox将66位串行数据转换为64位并行数据
-
发送端Gearbox:
- 发送端首先将并行数据按照一定的编码方式进行编码,例如64B/66B编码或者8B/10B编码,以增加数据的可靠性和传输效率。 - 发送端然后将编码后的并行数据通过Gearbox进行速率转换,使得输出的串行数据与接收端的速率相匹配,例如将64位并行数据转换为66位串行数据。 - 发送端最后将串行数据通过高速接口进行传输,例如通过光纤或者电缆。
- 发送端Gearbox的输入是64位并行数据和一个时钟信号。
- 发送端Gearbox的输出是66位串行数据和一个时钟信号。
- 发送端Gearbox的工作流程如下:
- 将64位并行数据按照8字节为一组进行分组,并在每组前面添加两位同步头(01或10)。
- 将每组66位数据存储到一个66位寄存器中,并使用一个计数器记录当前存储了多少组数据。
- 当计数器达到8时,表示已经存储了一帧(512位)的数据,此时启动一个输出使能信号,并将寄存器中的数据依次移出。
- 使用一个分频器将输入时钟信号分频为输出时钟信号,使得输出时钟信号的频率为输入时钟信号的8.25倍(即10.3125Gbps)。
- 使用输出时钟信号作为移位寄存器的时钟,将寄存器中的数据按照从高位到低位的顺序移出,并输出为66位串行数据。
-
接收端Gearbox:
- 接收端首先将从高速接口接收到的串行数据通过Gearbox进行速率转换,使得输出的并行数据与发送端的速率相匹配,例如将66位串行数据转换为64位并行数据。 - 接收端然后通过Gearbox进行同步头的搜索和锁定,以确定数据的起始位置和结束位置,并进行时钟恢复。 - 接收端最后将并行数据按照一定的编码方式进行解码,例如66B/64B解码或者10B/8B解码,以还原原始的数据内容。
- 接收端Gearbox的输入是66位串行数据和一个时钟信号。
- 接收端Gearbox的输出是64位并行数据和一个时钟信号。
- 接收端Gearbox的工作流程如下:
- 使用一个锁相环(PLL)将输入时钟信号锁定到10.3125Gbps,并产生一个本地时钟信号。
- 使用本地时钟信号作为移位寄存器的时钟,将输入的66位串行数据按照从低位到高位的顺序移入,并存储到一个66位寄存器中。
- 使用一个状态机来检测同步头(01或10),并根据同步头的位置来确定数据的边界。
- 当检测到一组完整的66位数据时,将寄存器中的数据移出,并去掉同步头,只保留64位数据。
- 将每组64位数据存储到一个64位寄存器中,并使用一个计数器记录当前存储了多少组数据。
- 当计数器达到8时,表示已经存储了一帧(512位)的数据,此时启动一个输出使能信号,并将寄存器中的数据依次移出。
- 使用一个分频器将本地时钟信号分频为输出时钟信号,使得输出时钟信号的频率为本地时钟信号的0.121倍(即1.25Gbps)。
- 使用输出时钟信号作为移位寄存器的时钟,将寄存器中的数据按照从高位到低位的顺序移出,并输出为64位并行数据。
Gearbox如何设计?
Gearbox的设计要考虑以下几个方面:
-
数据对齐:要保证输入和输出的数据在时序上正确对齐,避免数据丢失或错误。
-
数据同步:要保证输入和输出的数据在时钟上正确同步,避免时钟偏差或抖动。
-
数据格式:要保证输入和输出的数据在格式上正确转换,避免编码错误或冲突。
-
发送端:
- 发送端需要设计一个编码器,用于将并行数据按照一定的编码方式进行编码,例如64B/66B编码或者8B/10B编码。
- 发送端需要设计一个变速器(gearbox),用于将编码后的并行数据进行速率转换,例如将64位并行数据转换为66位串行数据。
- 发送端需要设计一个高速串行器(serializer),用于将变速器输出的串行数据进行串行化,并输出到高速接口。
-
接收端:
- 接收端需要设计一个高速反串器(deserializer),用于将从高速接口接收到的串行数据进行反串化,并输出到变速器。
- 接收端需要设计一个变速器(gearbox),用于将反串器输出的串行数据进行速率转换,例如将66位串行数据转换为64位并行数据。
- 接收端需要设计一个解码器,用于将变速器输出的并行数据按照一定的编码方式进行解码,例如66B/64B解码或者10B/8B解码。
- 接收端需要设计一个同步头搜索器(sync header detector),用于在解码后的并行数据中搜索和锁定同步头,以确定数据的起始位置和结束位置,并进行时钟恢复。
Gearbox如何实现?
- Gearbox的实现可以分为两个部分:发送端和接收端。
- 发送端:
- 发送端可以使用Verilog或者VHDL等硬件描述语言来实现编码器、变速器和高速串行器等模块,并进行仿真和综合。
- 发送端可以使用赛灵思(Xilinx)或者英特尔(Intel)等FPGA厂商提供的IP核来实现高速串行接口,例如GTY或者GXB等。
- 发送端可以使用赛灵思(Xilinx)或者英特尔(Intel)等FPGA厂商提供的开发板和工具链来实现硬件上板和测试。
- 接收端:
- 接收端可以使用Verilog或者VHDL等硬件描述语言来实现高速反串器、变速器、解码器和同步头搜索器等模块,并进行仿真和综合。
- 接收端可以使用赛灵思(Xilinx)或者英特尔(Intel)等FPGA厂商提供的IP核来实现高速串行接口,例如GTY或者GXB等。
- 接收端可以使用赛灵思(Xilinx)或者英特尔(Intel)等FPGA厂商提供的开发板和工具链来实现硬件上板和测试。
Gearbox有什么应用?
- Gearbox有很多应用,例如:
- 在10G以太网中,使用64B/66B编码和8B/10B编码的混合模式,需要在发送端和接收端使用Gearbox进行数据速率转换。
- 在25G以太网中,使用64B/66B编码和64B/67B编码的混合模式,需要在发送端和接收端使用Gearbox进行数据速率转换。
- 在PCI Express中,使用8B/10B编码和128B/130B编码的混合模式,需要在发送端和接收端使用Gearbox进行数据速率转换。
Gearbox有什么优点和缺点?
- Gearbox的优点是:
- 可以在不同的数据速率之间进行数据的对齐和转换,提高了数据传输的效率和兼容性。
- 可以在不同的编码方式之间进行数据的转换,增加了数据传输的可靠性和安全性。
- 可以在不同的传输介质之间进行数据的转换,扩展了数据传输的范围和场景。
- Gearbox的缺点是:
- 增加了硬件设计的复杂度和成本,需要额外的电路资源和功耗。
- 增加了数据传输的延时和误差,需要额外的同步头和校验位。
- 增加了数据传输的风险和故障,需要额外的错误检测和恢复机制。
同步头搜索和帧对齐的原理和方法
-
同步头搜索(SYNC Header Search)是一种对接收到的数据进行帧对齐和锁定的方法,目的是识别出不同类型的帧,并将其分配给相应的处理模块
-
同步头搜索有两种模式:
- 初始搜索模式(Initial Search Mode):在接收端复位后或者失去锁定后,对接收到的数据进行同步头匹配,找出起始帧或空闲帧,并进入锁定模式(Locked Mode)
- 锁定模式(Locked Mode):在找到起始帧或空闲帧后,根据同步头和类型字段来确定每个帧的长度和类型,并将其发送给相应的处理模块,如解码器、序列暂停处理器等,如果发现错误或失去同步,则返回初始搜索模式(Initial Search Mode)
-
同步头搜索使用一个 gearbox 模块来实现,gearbox 模块可以将串行数据转换为并行数据,并进行速率转换和同步头检测
序列暂停的原理和方法
- 序列暂停(Sequence Pause)是一种对发送端的数据进行流量控制的方法,目的是使发送端和接收端之间的数据速率保持一致,避免出现数据溢出或丢失
- 序列暂停有两种类型:
- 发送端序列暂停(TX Sequence Pause):在发送端收到接收端的暂停请求后,停止发送正常数据,而是发送一系列的空闲帧,直到接收端取消暂停请求或者超时
- 接收端序列暂停(RX Sequence Pause):在接收端检测到数据缓冲区快满时,向发送端发送一个暂停请求,请求发送端停止发送正常数据,直到接收端检测到数据缓冲区有足够的空间时,再向发送端发送一个取消暂停请求
解码器的原理和方法
- 解码器(Decoder)是一种对接收到的数据进行还原和校验的方法,目的是恢复原始的 MAC 层数据,并检测是否有错误或异常
- 解码器的主要功能有:
- 根据同步头和类型字段来识别不同类型的帧,并将其分为控制字和数据字
- 对控制字进行解释,如空闲、起始、结束等,并根据其含义来处理数据流
- 对数据字进行还原,去除多余的填充字节(Pad Byte),并拼接成 MAC 层数据
- 对数据进行校验,计算并比较循环冗余校验码(CRC),如果发现错误或异常,则报告给上层
序列暂停处理器的原理和方法
- 序列暂停处理器(Sequence Pause Processor)是一种对接收到的暂停请求和取消暂停请求进行处理的方法,目的是控制发送端的数据流量,避免出现数据溢出或丢失
- 序列暂停处理器的主要功能有:
- 根据接收到的控制字来识别暂停请求和取消暂停请求,并将其转换为相应的信号
- 对发送端序列暂停模块进行控制,使其根据暂停请求和取消暂停请求来调整发送数据的状态
- 对发送端序列暂停模块进行监测,检测是否有超时或异常情况,并报告给上层
测试和验证的步骤和方法
- 测试和验证(Test and Verification)是一种对编码解码实现进行功能和性能检测的步骤和方法,目的是确保编码解码实现能够正确地工作,并满足万兆以太网的标准
- 测试和验证的主要步骤有:
- 准备测试环境,包括开发板或服务器、高速接口线缆、测试仪器等
- 配置测试参数,如线速率、参考时钟、编码方式等,使之与 GT Wizard IP 的配置一致
- 生成测试数据,可以使用随机数生成器或者预先定义的数据模式,如全零、全一、交替等
- 运行测试程序,将测试数据通过高速接口发送给编码解码实现,并观察输出数据是否与输入数据一致,以及是否有错误或异常发生
- 分析测试结果,计算并记录各项性能指标,如误码率(BER)、吞吐量(Throughput)、延迟(Latency)等,并与万兆以太网的标准进行比较