FPGA使用GPIO实现串行数据解码的方法

FPGA使用GPIO实现串行数据解码的方法

  • FPGA使用GPIO实现串行数据解码的方法
    • 信号处理流程
      • 随路时钟提取与采样
      • 串并转换
      • 帧格式解析
      • 总结

FPGA使用GPIO实现串行数据解码的方法

基于基于FPGA的通用IO资源实现串行数据接收前级接收,以125M线速的100BaseFx数据流为例,基本流程如下:1、提取随路时钟采样获取原始码流;2、实施NRZI解码,串并转换;3、4B5B解码,得到原始帧;4、数据链路层帧格式校验提取。

信号处理流程

随路时钟提取与采样

以100BaseFx为例,数据码流速率为125Mbps。基于当前的FPGA硬件性能水平,在125M这个数量级上,一般可以用两种方法:用几倍于基带频率的高频时钟采样也叫时间过采样;用PLL产生固定相移的多个时钟采样也叫空间过采样。两者的原理类似。根据工程实践经验,4倍频过采样已经能满足需要。
FPGA使用GPIO实现串行数据解码的方法_第1张图片

iserdes模块使用500MHz单沿或250MHz双沿采样,每一个125MHz的时钟周期,推出4个对应于不同相位的采样点:
FPGA使用GPIO实现串行数据解码的方法_第2张图片
每个周期得到(Q1、Q2、Q3、Q4)4个点。根据相邻两个周期的4点,判断当时刻的中心点位置:
FPGA使用GPIO实现串行数据解码的方法_第3张图片
如(Q1、Q2、Q3、Q4、P1、P2、P3、P4)=(1、1、1、1、0、0、0、0)或(0、0、0、0、1、1、1、1),中心点为2.
(Q1、Q2、Q3、Q4、P1、P2、P3、P4)=(1、1、1、0、0、0、0、X)或(0、0、0、1、1、1、1、X),中心点为1.
(Q1、Q2、Q3、Q4、P1、P2、P3、P4)=(X、X、1、1、1、1、0、0)或(X、X、0、0、0、0、1、1),中心点为4.
(Q1、Q2、Q3、Q4、P1、P2、P3、P4)=(X、1、1、1、1、0、0、0)或(X、0、0、0、0、1、1、1),中心点为3.
中心点判决条件不满足时(如正好采到跳变沿),会保持之前的中心点。
每当中心点在变动时,表示发送频率和接收频率在发生偏差,当中心点从1变为4或4变为1时,由于本地总是逐个周期取4bit数据,直接根据中心点来获取NRZ码的话,会多一个或者少一个bit。
如,前一个周期中心点是4,而下一个周期变为1,此时原本的Q1就比Q4早,所以中心点切成1的时刻,会多一个采样点(可以认为切之后的1就是切之前的4),以仿真波形为例:

FPGA使用GPIO实现串行数据解码的方法_第4张图片
如上图,中心点从边界“11”切到“00”的瞬间,NRZ[0]总是比NRZ[3]晚一个周期,当nrz取NRZ[3]到nrz取NRZ[0]这个变化瞬间,多出一个bit,此时用一个高电平表示此处的码元丢弃。同理,当中心点从1变成4时,会多一个bit,多出的1bit用另外一根数据线来表征:
FPGA使用GPIO实现串行数据解码的方法_第5张图片
NRZ[0]总是比NRZ[3]晚,所以从NRZ[0]切成NRZ[3]时,会丢一个bit,此处用两根数据线,1bit表示需要插入,1bit表示插入的码元。(此处还约定insert_nrz插入的码元在本周期nrz_right之前。)最终CDR输出的数据线包括NRZ、discard、insert、insert_nrz:
FPGA使用GPIO实现串行数据解码的方法_第6张图片
可以认为,收发时钟的频率偏差,是通过本地125M的NRZ码流携带discard或insert信息来表征的。

串并转换

为了抵消时钟偏差,串并转换需要容忍discard或insert信息,在串并转换之前,设计一个小型的FIFO使数据规整。
FPGA使用GPIO实现串行数据解码的方法_第7张图片
写端口2bit宽度,每bit带写有效,当discard来临时,两个有效均为低,当insert来临时,两个有效均为高(内部约定DATA1在前,与CDR约定一致),平时写就写入一个数据。读端口,当深度大于一定阈值,读一次,固定出两个bit数据。相当于用125M×2的吞吐率处理,因此后续的所有逻辑均携带“有效”标志。
后级总体上是通过一个“移位寄存器”,锁存一段时间的NRZ流,由于空闲态唯一,且为“11111”,因此起始符SOF来临时,移位寄存器内会出现特定的码型,用码型来确定“串行转换的字符边界”。
FPGA使用GPIO实现串行数据解码的方法_第8张图片
当SOF来临时,最先出现在移位寄存器窗口内的码型是唯一的(idle码和数据编码是分开的),根据出现特殊码型的时机能够直接确定串行流中的字符边界。
当实际是“2bit移位寄存器”时,每次插入2bit,同时并不是每周期插入(平均2周期插入一次),因此特殊码型仍然存在,但位置会出现两种情况。
FPGA使用GPIO实现串行数据解码的方法_第9张图片
当移位寄存器窗口确定上述两种码型之一时,即捕获到字符边界,同时,原先1bit移位寄存器每插入5个有效bit后,读出一个5bit码元,现改为:确定字符边界后,等插入2个2bit有效数据后,读一个5bit码元,再等插入3个2bit有效数据后,读一个5bit码元,再等2个2bit数据读一个码元。同时从移位寄存器读数据的窗口位置也会前后变化。
最后串并模块输出的5bit并行数据自然地携带有效标志。

帧格式解析

当得到并行的数据流后,后续暂时是简单处理。

  1. 直接4B5B解码,由于idle码、SOF、EOF和数据是分开编码的,因此解码后处理流程简单。
  2. 解码后的数据流经过格式校验:
    FPGA使用GPIO实现串行数据解码的方法_第10张图片
    FPGA使用GPIO实现串行数据解码的方法_第11张图片

总结

异步串行数据流的接收,其关键点就是适配收发两端的频率差,因此使用一个高带宽+使能信号的组合,可以灵活的适配频率偏高或者偏低的情况。

你可能感兴趣的:(FPGA使用GPIO实现串行数据解码的方法)