官方论坛
官方淘宝
官方博客
微信公众号
点击联系吴工 点击联系周老师
您的当前位置:主页 > 项目 > 光纤 >

光纤项目中光纤用户层接口设计分享(个人总结)

发布时间:2019-12-18   作者:小耀 浏览量:


本文为明德扬原创文章,转载请注明出处!

光纤接口FPGA比较常用的接口之一,它的传输方式与一些寻常接口的传输方式有些不同,为了让大家了解光纤接口,并避免配置接口时的一些常见问题,我特意写下了这个总结,希望能够对大家有所帮助。

 

一、光纤接口的传输特点

大多数接口发送包文数据时会发送:数据data、有效指示信号data_vld、包文起始信号data_sop、包文结束信号data_eop以及无效字节数data_mty等。如下图1所示。



1

 

光纤接口和上述接口发送的方式不同,光纤接口发送包文数据时只会发送数据txdataKtx_k,内部读取数据时也只会读取数据rxdatakrx_k。若数据(txdatarxdata)为8字节,则k码为8位数据。如下图2所示。

2

 

二、k码的表示

k码是用来表示数据是否有效的,那么我们应该如何设定k码呢?假设用下述方式表示k码:

数据无效时:8’b0 

数据有效+SOP时:8’mty(4mty)+0110 

数据有效+EOP时:8’mty(4mty)+0011 

数据有效+其它时:8’mty(4mty)+0010 

我们会发现数据会出现错误!因为数据和k码在传输过程中可能会发生偏移!例如发送第一个数据时,txdata=64’h0102030405060708tx_k=8’b00000110

而内部接收时,数据可能会右移2位,造成接收到的数据与发送出的数据有所不同。如rxdata=64’h0000010203040506,rx_k=8’b000000001。即如下图所示3

 

3

 

因此,我们仅将k码用做有效无效的指示信号以及同步信号,并用下述方式进行表示:

数据无效时,发送固定k码:0x01,接收根据这个1的位置,判断开始位;

数据有效时,发送固定k码:0x00,接收根据k码的值,识别数据是否有效。

在这种情况下,即使发生了偏移,我们也能知道k码中1后面的80所对应的rxdata为有效数据。例如,第n个周期接收到rxdata=64’h00bc010203040506,接收到rx_k=8’b01000000,n+1个周期接收到rxdata=64’h0708020304050607,接收到rx_k=8’b00000000。通过第n个周期rx_k中的1能够判断出后面80所对应的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’0102030405060708rx_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’h128’hbc8’h63,最后检验位显示一共有3个数据,包文正确。这样我们就将一个有效包文解包成有效数据 8’h128’hbc8’h63

数据打包的过程与打包的过程正好相反,假如我们接收到5字节有效数据8’h128’hbc8’h638’hbc8’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模块将输入的rxdatarx_k执行要点三的比特位顺序调换操作,利用Rx_align模块执行要点四的数据对齐操作,利用Decoder模块执行有效数据的判断,利用Unpackcomm模块执行数据的解包操作。

在发送端中,我们利用packcommpack模块将数据进行打包,再利用Tx_data_reverse模块和Tx_ctrl_reverse模块将数据从大头模式还原成小头模式,即再进行一次比特位顺序的调换,然后再发送。

 

下一篇:没有了
  •   
  •   
  •   
  •  
  • FPGA教育领域第一品牌
  • 咨询热线:020-39002701
  • 技术交流Q群:544453837