本文为明德扬原创文章,转载请注明出处!作者:小耀
光纤接口是FPGA比较常用的接口之一,它的传输方式与一些寻常接口的传输方式有些不同,为了让大家了解光纤接口,并避免配置接口时的一些常见问题,我特意写下了这个总结,希望能够对大家有所帮助。
一、光纤接口的传输特点
大多数接口发送包文数据时会发送:数据data、有效指示信号data_vld、包文起始信号data_sop、包文结束信号data_eop以及无效字节数data_mty等。如下图1所示。
图1
光纤接口和上述接口发送的方式不同,光纤接口发送包文数据时只会发送数据txdata和K码tx_k,内部读取数据时也只会读取数据rxdata和k码rx_k。若数据(txdata、rxdata)为8字节,则k码为8位数据。如下图2所示。
图2
二、k码的表示
k码是用来表示数据是否有效的,那么我们应该如何设定k码呢?假设用下述方式表示k码:
数据无效时:8’b0 ;
数据有效+SOP时:8’mty(4位mty)+0110 ;
数据有效+EOP时:8’mty(4位mty)+0011 ;
数据有效+其它时:8’mty(4位mty)+0010 ;
我们会发现数据会出现错误!因为数据和k码在传输过程中可能会发生偏移!例如发送第一个数据时,txdata=64’h0102030405060708,tx_k=8’b00000110。
而内部接收时,数据可能会右移2位,造成接收到的数据与发送出的数据有所不同。如rxdata=64’h0000010203040506,rx_k=8’b000000001。即如下图所示3。
图3
因此,我们仅将k码用做有效无效的指示信号以及同步信号,并用下述方式进行表示:
数据无效时,发送固定k码:0x01,接收根据这个1的位置,判断开始位;
数据有效时,发送固定k码:0x00,接收根据k码的值,识别数据是否有效。
在这种情况下,即使发生了偏移,我们也能知道k码中1后面的8个0所对应的rxdata为有效数据。例如,第n个周期接收到rxdata=64’h00bc010203040506,接收到rx_k=8’b01000000,第n+1个周期接收到rxdata=64’h0708020304050607,接收到rx_k=8’b00000000。通过第n个周期rx_k中的1能够判断出后面8位0所对应的rxdata=64’h0102030405060708为有效数据。
三、比特位顺序调换
我们先介绍一下小头模式和大头模式。小头模式指的是低位在前高位在后,大头模式指的是高位在前低位在后。例如同样的数据012345678,在小头模式中,0是最低位,8是最高位,在大头模式中则0是最高位,8是最低位。由于光纤接口是小头模式,而我们熟悉的是大头模式。因此我们需要将光纤接口数据的比特位顺序进行调换。
四、数据对齐
由于我们接收到的数据是偏移了的,因此我们需要利用一个模块将光纤接口偏移的数据进行还原。例如,第n个周期接收到rxdata=64’h00bc010203040506,接收到rx_k=8’b01000000,第n+1个周期接收到rxdata=64’h0708020304050607,接收到rx_k=8’b00000000,我们通过对其模块将其还原成第n个周期为rxdata=64’0102030405060708,rx_k=8’00000000即将下图4变换成下图5。
图4
图5
五、数据解包与打包
我们定义发送包文的方式是发送:55D5+16b长度+长度字节个DATA+校验和。为了判断是否接收有效包文,我们设定当接收到55D5时,表示后面的数据信号有效,接着接收数据的长度,表示该包文的有效长度,然后接收数据,最后再接收一个校验位,检验包文是否有错误。
例如接收到8’h55+8’hd5 + 8’h00+8’h03 + 8’h12+8’hbc +8’h63 + 8’h00+ 8’h03 , 表示55d5后面的数据是包文,包文内数据一共有3个,数据分别是 8’h12、8’hbc、8’h63,最后检验位显示一共有3个数据,包文正确。这样我们就将一个有效包文解包成有效数据 8’h12、8’hbc、8’h63。
数据打包的过程与打包的过程正好相反,假如我们接收到5字节有效数据8’h12、8’hbc、8’h63、8’hbc、8’h63,我们需要将其打包成8’h55+8’hd5 + 8’h00+8’h05 + 8’h12+8’hbc +8’h63 + 8’hbc +8’h63 + 8’h00 +8’h05。
六、光纤串口的模块
在接收端中,我们利用Rx_data_reverse模块和Rx_ctrl_reverse模块将输入的rxdata和rx_k执行要点三的比特位顺序调换操作,利用Rx_align模块执行要点四的数据对齐操作,利用Decoder模块执行有效数据的判断,利用Unpackcomm模块执行数据的解包操作。
在发送端中,我们利用packcommpack模块将数据进行打包,再利用Tx_data_reverse模块和Tx_ctrl_reverse模块将数据从大头模式还原成小头模式,即再进行一次比特位顺序的调换,然后再发送。