基于FPGA的多路远传TDM帧板间传输设计
2021-11-05郭永超李淯阳潘波
郭永超 李淯阳 潘波
(重庆金美通信有限责任公司 重庆市 400030)
1 引言
多路远传信号跨单元板传输时,若把所有的信号线一对一连接,由于线数太多造成PCB 布线困难,且占用大量FPGA 管脚,因此需要把多路的串行码流复接成一路TDM 帧进行跨单元板传输,从而达到减少线数,节约资源的目的。
板间传输的难点有二,一是时钟抖动造成滑码[1],二是时钟和数据的相位偏移造成误码。时钟抖动主要由于远传模块时钟质量不好引起,时钟和数据的相位偏移主要由于时钟和数据PCB 布线长度不一致以及各种干扰引起。
2 TDM帧板间传输的总体设计方案
有线传输模块共有8 路远传,可实现256kbit/s、512kbit/s、1024kbit/s、2048kbit/s 的传输速率。本方案设计了三个单元板,有线传输模块位于单元板一,该单元板完成有线传输模块的数据收发、TDM 成帧、解帧。单元板二完成远传数据收发、TDM 成帧、解帧,远传数据处理。单元板一、二的区别在于一个做主模块,一个做从模块。另有一块联络板,为单元板一和二供电,并把两者之间的相关信号连接起来。
3 TDM帧板间传输的具体实现
TDM 帧由tdm_clk、tdm_fs、tdm_txd、tdm_rxd 这四个信号组合实现。tdm_clk 是时钟信号,频率为32MHz,其它信号均与之对齐;tdm_fs 是帧起始信号,表示一帧的开始,其脉冲宽度为一个tdm_clk 周期;tdm_txd 和tdm_rxd 表示发送和接收的TDM 数据。采用自定义的帧格式[2],一帧划分为16 个时隙,每个时隙8 个bit,前8 个时隙发送8 路远传数据,后8 个时隙发送单元板之间的控制维护消息,每路远传的波特率为2Mbps,,如要调整传输速率,只需要调整tdm_clk 即可,但是要注意与远传时钟匹配。
3.1 发送模块(TDM成帧)实现原理
发送模块主要完成远传时钟、数据同步,串并转换,block-RAM 读写,时隙分配,TDM 帧发送等功能。其具体数据处理流程如图1所示,可分为九个步骤。
图1:TDM 发送模块数据处理流程
(1)打拍缓存,消除亚稳态[3]。采用上升沿检测的方式把远传时钟和数据同步到系统时钟上来,数据放到寄存器组txdata_temp。
(2)移位寄存。为每一路远传都设置一个32bit 的移位寄存器,在远传时钟的上升沿把txdata_temp[1]放入移位寄存器的最低位txdata_shift[0],同时txdata_shift 左移一位。
(3)串并转换。每一路远传都有一个计数器对移位寄存器接收的数据进行计数,每记满32bit 就把txdata_shift 中的数据放入txdata_parallel,实现了串并转换为写入block-RAM 做好了准备。
(4)数据写入block-RAM 进行缓存。为了消除远传时钟的抖动造成的滑码,采用block-RAM 来缓存数据,本设计所采用的FPGA 芯片是xilinx 公司的K7 系列,一个block-RAM 的数据宽度为36 位(实际只用到低32 位,高4 位置0);寻址范围0-511,9位地址线[4,5]。对于一路远传而言,它的时钟频率较低,数据量不大,较小的缓存容量就足以应对时钟抖动引起的滑码问题。为了节约block-RAM 资源,把一个block-RAM 做地址分割,共分为8 个缓存通路,高3 位地址线作为通路地址,低6 位地址线作为通路内地址,这样每一路的缓存容量为32bit*64=2048bit。为了避免数据溢出,为每一通路设置一个门限,只有在门限内才允许对通路内的数据进行读写。门限由三个参数组成,写上限、读开始、读下限,比如设置写上限为2000bit、读开始门限为1000bit、读下限为50bit,当通道内的数据量大于2000bit 时不允许写入,数据量大于1000bit 时开始读出数据,数据量小于50bit 时不允许读数据,理想情况下通道的读写速率是一致的,这样通道内的数据量就会保持在中间值左右,从而最大限度的发挥“缓冲”作用。txdata_parallel 每更新一次,产生一次写使能信号,相应通路的写使能有效且通道内数据量未达到写上限时,数据才能够写入。
(5)数据从block-RAM 读出。读使能信号有效时,在帧定位信号tdm_fs 的节拍下,远传数据从block-RAM 读出并放入寄存器组dataout_temp,控制维护消息由FPGA 内部模块产生,与远传数据相互独立。
(6)打一拍时序对齐。数据从block-RAM 到dataout_temp 的过程,因为各通道的读使能信号不一定同时有效,所以dataout_temp 数组中各通路的数据不一定同时变化,后一级寄存器组需要做双字到字节转换,每一个tdm_fs 周期要分四次从前一级的寄存器组取一个字节的数据,有可能四个字节还没取完dataout_temp 中的数据就改变了,导致数据丢失,因此有必要插入一个寄存器组dataout_temp2,在tdm_fs 的节拍下把dataout_temp 赋值给dataout_temp2,为双字到字节转换做准备。
(7)双字到字节转换。因为TDM 帧格式的每一个时隙有8bit,而block-RAM 出来的数据是32bit,需把四字节的数据转成单字节,转换后的数据放入寄存器组dataout_toByte。
(8)按时隙顺序把各通道数据放入移位寄存器。dataout_toByte 的16 个寄存器对应16 个时隙,计数器每计满8 个bit 就从dataout_toByte 中取一个字节数据出来,其数据位D7 放入tdmdata,D6~D0 放入tdmdata_shift 的D7~D1。
(9)在tdm_clk 的节拍下,把tdmdata_shift 的最高数据位D7放入tdmdata,同时tdmdata_shift 整体左移一位,这样就完成了八路远传数据,及八路控制消息的成帧和发送过程。
3.2 接收模块(TDM解帧)实现原理
接收模块完成远传时钟、数据同步,移位寄存,解帧,数据发送等功能。在数据的接收端,因为TDM 信号经过了跨板传输,受PCB 布线等因素影响,TDM 时钟、帧定位、数据信号之间的相位关系难免发生偏移,需对远传数据做一定处理才能正确解码。数据处理流程如图2所示。
图2:TDM 接收模块数据处理流程
(1)打拍缓存,消除亚稳态。首先用一个高倍时钟对tdm_clk、tdm_fs、tdm_rxd 进行同步,同步数据放入tdmdata_temp 寄存器。
(2)移位寄存。在tdm_clk 的节拍下把同步后的数据依次存入一个8 位的移位寄存器,每8bit 取一个时隙的数据出来放入寄存器组byte_temp。
(3)打一拍时序对齐。为了便于后续处理,把寄存器组byte_temp 的值在tdm_fs 的节拍下赋给寄存器组byte_temp2,byte_temp2的前8 路是远传数据,要对外发送,后面8 路是两个单元板的控制维护消息,内部使用。
(4)移位寄存,并串转换。在每一个tdm_fs 的上升沿把byte_temp2 的前8 个通道的数据赋值给移位寄存器组txdata_shift,在每一个远传时钟的上升沿(2MHz,FPGA 内部产生),把rxdata_shift 的每一路的最高位赋值给相应的rxdata 管脚,至此完成了TDM 接收模块的解帧和远传数据对外发送。
接收模块没有用block-RAM 做数据缓存,因为接收端主要解决的问题是相位对齐,因此只需要打拍消除亚稳态,并用系统时钟进行边沿采样,就能正确的接收数据,同时接收端的远传数据处理模块的收时钟是由FPGA 内部产生,不存在时钟抖动的问题,因此解码后的数据也不需缓存就可直接发出。
3.3 时钟预处理模块的作用
tdm_clk 和tdm_fs 都是单向的,所以两个单元板必须一个做主一个做从。时钟预处理模块通过参数化的配置实现主从切换,当配置为主时,模块自身生成tdm_clk 和tdm_fs,除了给板内的收发模块提供以外还对外提供;配置为从时接收板外的tdm_clk 和tdm_fs,与板内主时钟同步后提供给板内的收发模块。
3.4 时延分析
TDM 数据在发送端成帧之前需要经过block-RAM 缓存,缓存大小及门限值影响时延大小。每个通道的缓存容量为2048bit,写上限为2000bit、读开始门限为1000bit、读下限为50bit,数据时钟为2MHz。最小时延Tmin=25us,典型时延Ttyp=500us,最大时延Tmax=1000us。
4 结束语
本文提出了一种基于FPGA 实现多路远传TDM 数据帧板间传输的方案, 在TDM 帧的发送端使用一个双端口RAM,实现了8路远传数据的缓存及跨时钟域同步,既节约了资源又有效的解决了滑码的问题,采用自定义的帧格式,在传输远传数据的同时还能传输单元板间的控制维护消息,具有一定的扩展性。