JESD204B协议学习

📅 发布时间:2026/7/17 4:42:09
JESD204B协议学习 在通信中JESD204B的优势在于时延低与确定性时延。通信中为什么需要低时延与确定性时延在JESD204B的协议的实现过程中是怎么保证这个低时延与确定性时延的在下面将详细讨论。5G通信需要低时延5G 的关键指标是 uRLLC超高可靠低时延通信和超高吞吐量。反馈越快空口吞吐量越高HARQ 进程 手机和基站之间传数据时如果手机没收到基站需要快速重传HARQ 机制。如果数据在“射频芯片 →JESD204B →FPGA 物理层 → 基带算法”这一路耽误了太长时间基站的重传响应就会变慢。整个空口的等待时间变长直接拉低了手机用户的实测速率。5G 帧结构变短 4G 的一个子帧是 1ms而 5G 采用了子载波间隔扩张比如 30kHz一个时隙Slot被压缩到了 0.5ms 甚至更短。帧结构变短了留给基带芯片计算和传输数据的时间被成倍压缩。接口传输如果多耽误几个微秒后级的 LDPC 解码器或数字前段算法DFE就会因为超时而直接把数据包“憋死”在里面。JESD204B如何满足低时延对比传统 LVDS传统的 LVDS 接口由于时钟同步和 PCB 布线密度的限制单根线的速率很难跑到 1.5Gbps 以上。为了传大带宽的 5G 信号只能用几十根线“并行”着跑。并行的致命问题是FPGA 为了等最慢的那根线到达内部必须开辟很大的缓冲区这引入了很大的逻辑等待时延。JESD204B 的降维打击JESD204B 采用 SerDes串行收发器技术单根物理线的速率可以直接飙到 9.8304Gbps甚至 204B 最大支持 12.5Gbps。时延体现在线速率Lane Rate极高意味着传输一个比特bit在物理线上飞过的时间极短。既然都是串行传输为什么基站内部不用 PCIe 或者是标准的以太网万兆网来传射频数据对比以太网/PCIe这些传统通用串行协议的时延非常大。因为以太网有复杂的包头IP头、MAC头、有握手重传机制TCP/IP、有软件协议栈的处理开销数据进了 FPGA 还得进 CPU 绕一圈。JESD204B 的物理直通车JESD204B 是一个纯粹的硬核协议。时延体现在哪数据建立连接只需要经过极短的 CGS代码组同步和 ILAS初始通道对齐序列阶段。一旦进入 Data Phase正常通车阶段FPGA 内部的物理层是直接用硬件状态机Verilog 寄存器逻辑秒级处理 8b/10b 译码的。数据从物理引脚进来经过译码器查表几个core_clk周期后直接就吐给了你的 DDUC 算法模块中间没有任何软件干预时延通常在纳秒ns级这是网络协议根本做不到的。为什么需要确定性时延对于通信基站的上行与下行来说一个周期都不能错吗通信的上行与下行需要非常严格的确定性时延一个周期都不能错。下行空口同步与抗干扰死穴TDD时分双工的开关切换目前的 5G 宏基站绝大多数跑在 TDD 频段如 3.5GHz 频段。TDD 意味着同一个天线、同一个频率要在极短的微秒级时间内不停地切换“发射”和“接收”状态。工程现状基站会给射频芯片下发高精度的上下行切换控制信号TX_EN / RX_EN。错一个周期的灾难如果 JESD204B 下行链路的时延在某次开机或由于外界干扰错了一个时钟周期意味着基站实际从天线把 5G 信号打出去的时间比BBU/数字板预期的慢了或快了一个周期。 这一个周期的错位可能导致下行物理信号直接撞上 TDD 帧结构里的保护间隔Guard Period或者直接侵占了上行接收的时间窗口。这在空口上会导致极其严重的“自发自收干扰”整个扇区下的手机可能瞬间集体断连。多天线技术的死穴MIMO多输入多输出与波束赋形Beamforming现在的 5G 基站全部是 Massive MIMO大规模天线阵列比如常见的 64T64R64个发射通道64个接收通道。工程现状波束赋形的本质是依靠算法精确控制 64 根天线发射出去的信号的幅度和相位时延让它们在空中叠加时像一束聚光灯一样精准射向用户的手机。错一个周期的灾难这 64 个通道通常是由几颗不同的射频芯片共同承载的。如果其中某一颗芯片的 JESD204B 下行链路在某次开机时延上“错了一个周期”那么这颗芯片负责的几根天线发射出去的信号在时域上就会产生一个固定的相位偏差。 相位一旦对不准空中的波束就会直接“散架”或者“指歪了”导致波束赋形增益大幅度暴跌手机信号质量SINR和吞吐量Throughput直接崩盘。在通信基站的物理层 RD 中JESD204B 的确定性时延是一个系统级的前提条件上行/反馈RX/ORx为了保住DPD 算法的收敛让 PA 安稳工作。下行TX为了保住TDD 空口同步以及MIMO 波束赋形的相位对齐。无论是上行还是下行只要链路建立好从数字基带FPGA到模拟射频RFIC之间的绝对延迟在生生世世的每一次上电开机中都必须死死固定在同一个时钟周期上半个周期都不能妥协。那对于JESD204B来说不确定时延的原因出现在哪里怎么把它给去掉“确定性延迟Deterministic Latency”的真正定义是 无论系统复位、断电、重新上电多少次从 ADC 采样的那一瞬间到 FPGA 接收到该数据的延迟永远是雷打不动的固定 N 个时钟周期比如固定是 120 个周期每一次开机都是 120绝对不能变成 121 或 119。分频器的随机性外部时钟芯片源源不断送进来一个超高频主时钟比如 3GHz。ADC 和 FPGA 内部的数字电路不需要这么快需要把它进行 4 分频变成 750MHz 使用。分频器本质上是一个计数器。每次开机上电释放复位的一瞬间由于电压爬升的微小随机差异分频计数器可能会在主时钟的第一个上升沿醒过来也可能在第三个上升沿才醒过来。这就导致每次开机芯片内部时钟的相位是随机差了 1 到 2 个主时钟周期的SerDes 串并转换的随机性SerDes 在把 10 位串行比特恢复成并行字节时根据它抓到起始位的先后开机对齐的逻辑位置也会有 1、2 个比特的随机偏差。因为这两个随机性的存在导致每次开机数据从 ADC 传到 FPGA 的时间都在变问题两边分频都偏移了难道不能“负负得正”互相抵消吗我们可以把“确定性时延”的考核标准死死卡在数据从 ADC 的模拟采样点开始到进入 FPGA 后级算法为止全链路的总时间延迟 是否恒定。假设外部时钟芯片源源不断地送入 3GHz的 Device Clock。第一次开机ADC 的分频器在第 1 个沿醒来它的分频时钟相位是 0。FPGA 的分频器运气也很好在第 1 个沿醒来相位也是 0。此时全链路的总时延假设是10个纳秒。第二次开机断电重启ADC 内部因为电容放电残余稍微迟钝了一下在第 3 个沿才醒来ADC 侧时钟相位漂移了 2 个高频周期。这意味着什么意味着 ADC 的数据打包发射在时间轴上天然就落后了 666 皮秒与此同时FPGA 侧可能因为电压抬升的微小随机差异在第 2 个沿醒来了FPGA 侧漂移了 1 个高频周期。问题2CGS 阶段纠正了错位的比特但时间上是不是依然错失了 1~2 bit 的时间在 CGS 阶段当 SerDes 串并转换Deserializer因为开机噪声或者线长漂移错把第 2 个 bit 当成了排头兵时FPGA 内部的桶形移位器Barrel Shifter在 10b 混沌世界里抓到了K28.5的特征码。它发现原本应该在第 0 位出现的比特现在跑到第 2 位去了。 于是硬件逻辑会在内部进行内容旋转校正相当于在并行总线上把数据往前或往后拨了 2 个 bit。结果译码器10b 转 8b查字典不会报错了吐出来的数字内容百分之百正确。但是内容虽然纠正了但第二次打包出来的这个字节在物理时间轴上已经实打实地比第一次开机整体滞后了 1~2 个比特周期Bit Period这个微小的物理时间错位通常是几十到一百多皮秒被永久地留在了串行链路的物理传输线时延里。那JESD204B中是如何解决这个时延的不确定的呢sysref信号LMFC的多帧边界。从 CGS 到 ILAS 的连贯动作1. 准备阶段上电时外部时钟芯片打出一发SYSREF脉冲同时注入 ADC 和 FPGA。结果ADC 内部的 LMFC 计数器和 FPGA 内部的 LMFC 计数器同时被清零重启。从此两端的“多帧整点节拍”实现了空间上的跨芯片绝对同步。2. CGS阶段FPGA 刚解复位主动拉低SYNC~引脚。ADC 收到SYNC~低电平后开始疯狂发送/K/码K28.5。注意ADC 此时发送/K/码是不管什么 LMFC 边界的就是纯粹刷屏发送。FPGA 内部的 SerDes 抓到/K/码后完成了字节对齐内容不乱码了随即把SYNC~拉高。到这一步为止FIFO 还不需要去卡 LMFC。3. ILAS阶段真正开始用 FIFO 蓄水池对齐多帧边界发射端ADC的动作 ADC 看到SYNC~被拉高了它不会马上发送数据。它会原地默默等到属于它自己内部的下一个 LMFC“整点时刻”。 一旦下一个 LMFC 边界到来ADC 准时发车把 ILAS 对齐车队包含/R/码、/A/码打到串行线上。传输线上Lane 0/1 数据在物理线上飞奔因为线长不同Lane 0 跑得快先到Lane 1 跑得慢后到。接收端FPGA的接收 FIFO 缓冲Lane 0 到了抓到开头的/R/码和后面的/A/大红旗FPGA 把 Lane 0 的并行数据写入 Lane 0 专用的弹性 FIFO。此时只管写入不能读取过了一会儿几百皮秒或几个 bit 周期慢吞吞的 Lane 1 也到了抓到了/A/红旗数据写入 Lane 1 的弹性 FIFO。此时所有的 Lane 都已经成功把多帧对齐标志/A/码抓到了各自的 FIFO 蓄水池里。FPGA 读取放水LMFC 边界到来 FPGA 内部默默数着自己的 LMFC 时钟。当FPGA 本地的下一个 LMFC 整点节拍“啪嗒”一声到来时FPGA 内部的读使能控制逻辑同时打开所有 Lane 的 FIFO 读取端。JESD204B的一个协议的过程第一步下发参数配置配时钟芯片LMK04828 通过 SPI 写寄存器让它为 FPGA 拨出路一根245.76MHz的设备时钟为 ADC 拨出路一根491.52MHz 的采样时钟。同时开启SYSREF脉冲分发。举例子具体时钟按需要来设置配 ADC 芯片通过 SPI 寄存器 往 ADC 的 JESD204B 参数寄存器里填入M2, L2, F4, S2, K32。此时ADC 内部的数字交叉矩阵开关自动闭合把两路 ADC 核心的数据揉碎到你焊死的 2 根 Lane 引脚上。配 FPGAVivado JESD204 IP核 在 IP 核的 GUI 界面上填入一模一样的参数M2, L2, F4, S2, K32。下发配置释放 Reset——两边开始低电平拉低SYNC~CGS阶段对齐后拉高SYNC~发射 4 个带有大红旗/A/的多帧进行布线对齐ILAS阶段。那什么是K28.5码/R/码、/A/码K码K28.5二进制长相0011111010或反转的1100000101。它的规则拥有全字典独一无二的“连续 5 个 1 1 个 0”的特征组合Comma 码正常业务数据D码无论怎么拼接都凑不出这个特征。它是CGS代码组同步阶段的绝对主角。刚开机时FPGA 面对一堆0101混沌流就是靠死死抓住K28.5的这把特征切刀咔嚓一声把每 10 个比特的字节边界给强行卡准。/R/码K28.0二进制长相0011110100或反转的1100001011。它的规则在ILAS初始通道对齐序列阶段发射端ADC/DAC发送的测试车队里每一个常规帧Frame的第一个字节必须强制放置一个/R/码。它是“帧对齐”的起点标尺。/A/码K28.3二进制长相0011110011或反转的1100001100。它的规则在 ILAS 阶段发射端会在整个多帧Multiframe通常包含32帧的最后一个字节上死死插上一面/A/码红旗。它是确定性时延的灵魂符号。接收端的弹性 FIFO 蓄水池就是靠盯着各条物理线上的/A/码红旗把早到的线扣留住等晚到的线也把/A/旗子交上来最后在本地 LMFC 边界整点放水彻底抹平走线时差。/Q/码K28.4二进制长相0011110010或反转的1100001101。它的规则同样在 ILAS 阶段发射端要把自己的配置参数如通道数 M、线数 L、帧长 F发给接收端。在发这段配置数据之前必须紧跟在第二帧的开头并由/Q/码带头。/F/码K28.7二进制长相0011111000或反转的1100000111。它的规则在正常传输 5G 数据的Data Phase 阶段使用。如果某一帧的最后一个字节数据碰巧和前一帧的最后一个字节数据完全相同链路层就会偷偷把这个位置的数据替换为/F/码。它是后台巡逻兵。因为正常传数据时/R/和/A/都不发了接收端在后台默默监控/F/码用来验证在高速通车过程中这条物理线有没有因为外界电磁干扰发生跑偏、位移或错位。D码Data Code就是真正要传输的“业务数据”在 8b/10b 世界里的“代号”。概念来源在未编码前计算机和 FPGA 内部处理的都是 8 位1 Byte的原始字节范围是00000000到11111111十六进制的0x00到0xFF总共256 种状态。命名规则为了方便在协议里称呼它们8b/10b 协议把这 8 位数据拆成了两部分低 5 位对应 32 种状态记为 X和高 3-位对应 8 种状态记为 Y。组合起来就给这 256 个常规字节起了一套江湖绰号叫做DX.Y。在 FPGA 的底层设计或者 ASIC 芯片如高速 ADC/DAC的数字电路里8b/10b 编码器最核心的物理载体就是一张映射表Look-Up Table, LUT或者用组合逻辑门阵列实现。当你给编码器输入一个 8 位数据时内部发生的微观画面是这样的第一步判定是“数据”还是“控制”编码器旁边有一个“裁判旗”在 FPGA 里通常是一个叫tx_is_k或control_ind的 1-bit 信号。如果裁判旗为0电路就知道“这是常规业务数据”于是扭头去翻【D码映射表】。如果裁判旗为1电路就知道“这是协议控制命令”于是扭头去翻【K码映射表】。第二步灵魂机制——双列查表直流平衡的奥秘8b/10b 的标准映射表无论是 D 码表还是 K 码表会发现每一个输入代号竟然对应着“两列” 10 位的二进制编码这两列分别对应两种极性状态RD-不平衡度为负和RD不平衡度为正。K28.5/K/码的【K码表】举例如果电路计算出前面发送的数据里0比1多当前状态为 RD-那这次查表就会输出001111 1010这一串里 1 多用来把直流电平拉回来。如果电路计算出前面发送的数据里1比0多当前状态为 RD那这次查表就会输出110000 0101这一串里 0 多用来把直流电平压下去。同理【D码表】里的 256 种数据也是这么查的。比如业务数据D0.0查 RD- 列输出100111 0100查 RD 列输出011000 1011。