FPGA实现SRIO通信(Nwrite+Doorbell)

可参考gongzhonghao:小苏的FPGA

目录

一、SRIO概述

1.1 、SRIO介绍

1.1.1、SRIO核框架

1.1.2 、逻辑层接口

1.1.3 、通信收发接口

1.2 常用的包协议

1.2.1、包结构

1.2.2、Hello包

1.3 时钟关系

1.3.1、7系列及UltraScale系列的时钟框架

1.3.2、SRIO及GT时钟关系

1.3 、复位

二、SRIO核的使用

2.1 、SRIO核的设置

2.2 、核时钟资源共享使用

三、SRIO通信程序设计(NWRITE+DOORBELL)

3.1 、测试控制模块

3.2 、Hello包封装模块

3.3 、Hello包解析模块

3.4 、链路自复位功能

3.5 、整体工程

四 、 仿真测试

五、 上板测试

5.1 、链路稳定性测试

5.2 、发包测试

5.3、收包测试


摘要

        SRIO常用于FPGA与DSP、FPGA与FPGA、板间的通信。

        根据之前在项目中实现FPGA板间、FPGA与DSP间应用SRIO协议通信的经验,分享如何在FPGA中简单应用开发SRIO。

        本文主要介绍NWRITE+DOORBELL形式的数据通信,需要相关代码的私信。

        上图为一种多颗FPGA、DSP间的数据协议转换方案。

一、SRIO概述

1.1 、SRIO介绍

        SRIO是串行RapidIO的简称,高速串行通信协议,在FPGA端基于SerDes实现,且采用8B/10B编码

        SRIO协议由逻辑层、传输层和物理层构成。

        逻辑层定义协议和包格式,比如用户接口:IO和消息接口,实现通信。

         传输层为数据通道相关信息:包交换、路由寻址。例如支持8bit/16bit器件ID,可容纳256或65536个器件互联。

         物理层描述了设备之间接口协议,例如流控,lane数目等。

1.1.1、SRIO核框架

         SRIO核框架如下:

        上图描述了SRIO的3层协议:逻辑层(LOG)、传输层(BUF)和物理层(PHY),以及GT接口,时钟及复位关系。SRIO是在高速收发器GT的基础上封装的。PHY层是基于GT对数据进行组帧、解帧,PHY层和GT的时钟相关,逻辑层与PHY层的时钟可能不同,通过BUF进行缓冲数据。时钟与复位关系同GT收发器核应用相同。

1.1.2 、逻辑层接口

       对于开发SRIO协议通信,主要关注逻辑层接口,特别是用户接口。逻辑层分成几个部分以实现收发数据包。逻辑层有3类接口:用户接口,传输接口和配置接口,粗箭头表示AXI-Stream协议,细箭头表示AXI-Lite协议。

        传输接口与BUFFER直接相连,配置接口用于配置逻辑层的一些寄存器参数,一般不常用。用户接口经常使用IO端口收发数据,其余端口也不常用

         用户接口主要包括IO port,Messaging Port,Maintenance Port,User-Defined Port。常用IO端口收发数据,其余端口不常用。

      配置接口主要用于一些寄存器参数配置,不常用。

      传输接口包含发送和接收两个端口,连接Buffer,对开发者不可见。

      IO port :常用的事务类型如NWRITE,NWRITE_R,SWRITE,NREAD和RESPONSE(不含维护响应)、DOORBELL等,都是在IO端口上进行的。使用HELLO或SRIO Stream两种数据格式,常用HELLO格式

        Messaging Port :message 也可以通过IO prot传输(比如门铃DOORBELL只能在IO端口);

         Maintenance Port:维护数据包,配置底层寄存器需要选择使用;

        User-Defined Port :自定义协议类型。

1.1.3 、通信收发接口

        在用户接口中常用的数据收发通信如下,AXI Stream协议模式:

        发送数据:本地设备生成的请求(本地发送的数据)及门铃通过ireq通道发送;

        接收发送响应:如果本端发送带相应的事务(如NWRITE_R),远端设备产生的响应包通过iresp通道接收来;

        接收数据:远端设备生成的请求(对端发送的数据)及门铃通过treq通道接收;

        发送接收响应:本地设备产生的响应包通过tresp通道发送(比如本端对NWRITE_R的响应);

1.2 常用的包协议

      用户接口通信用途的包有hello包和流式包;hello包时序如下:

       在实际项目中hello包应用最多,valid和ready握手表示协议有效,last表示包结束,data表示数据和头部信息,keep表示data的有效字节,user包含ID信息。

      stream包时序如下:

1.2.1、包结构

         SRIO具有3层:用户层、传输层、物理层,对应的包结构也有三层:不同字段代表不同含义。

        白色部分对应于应用层;灰色部分对应于传输层,黄色对应于物理层。对于开发者,需要构造、解析应用层。

        事务类型主要有:由Ftype和Ttype字段决定,FPGA中常用NWRITENWRITE_RDOORBELL、NREAD、RESPONSE(有无数据)。

1.2.2、Hello包

        hello包格式如下:左侧红框标志为事务类型,上方黄框标志为64bit,列表内为具体位置的含义。HELLO数据包格式中逻辑层每个时钟传输64 bit。

        字段含义:主要关注NWRITE、DOORBELL相关字段,其中size表示数据字节数-1,每包最多可传输256字节;addr地址值要与每包数据字节数对应变化。在实际开发中,每包TID值要不同,DOORBELL的TID要与最后一包的TID值相对应,否则有概率会造成掉链。

        当有效数据不足8字节或不是8字节整数倍时,需要其他控制字段表示;实际应用中,大都会避开此种应用,这里不再展开描述。

1.3 时钟关系

        SRIO支持的线速率与GT参考时钟主要有以下几种:有“x”标志的是SRIO支持的类型组合。

1.3.1、7系列及UltraScale系列的时钟框架

        SRIO及GT时钟关系如下:7系列和UltraScale/+系列

         上述时钟框架中:phy_clk是主内核时钟,gt_pcs_clk用于GT与PHY通信的时钟信号(usrclk2),gt_clk是GT内PCS与PMA并行数据的时钟信号(usrclk)。log_clk为SRIO逻辑层的数据、配置等时钟。cfg_clk为SRIO配置接口时钟,与log_clk时钟相同。

           gt_pcs_clk的时钟频率=gt_clk/2 (usrclk2usrclk频率的一半),phy_clk=(gt_clk *lane数目)/4。为了防止BUFFER溢出,log_clk应不低于phy_clk,且log_clk与phy_clk同步

1.3.2、SRIO及GT时钟关系

        SRIO支持的lane数目及线速率主要有以下几类:GT数目,x4、x2、x1三种模式。

        

        上述表格中在不使用Train down功能中,phy_clk时钟频率等于log_clk

        在GT内并行数据位宽=线速率/usrclk=线速率/gt_clk=20bit,8/10B转换,实际数据位宽为16bit。usrclk2usrclk频率的一半,PHY传输一次数据,GT需要传输两次数据。

        根据用户层log_clk/phy_clk一次传输64bit,在GT内usrclk2(gt_pcs_clk)该数据传输的次数,可推导gt_pcs_clk与log_clk/phy_clk的频率关系进行印证。

1.3 、复位

        关于复位的使用可参考SRIO核example design中的复位使用方法。每个时钟域下都有对应的复位信号,复位信号在相应时钟域下至少拉高四个时钟周期才有效。

二、SRIO核的使用

        由于我的开发板上只有一个QSFP光模块单芯,且GT参考钟为156.25MHz,为了便于测试验证,此次设置采用x4模式,线速率为3.125Gbps或6.25Gbps。

2.1 、SRIO核的设置

        本次设计示例不涉及维护端口,模式选择Basic

        

        GT类型取决于FPGA型号,vivado自动选择;

        Lane速率及数目、参考时钟选择:根据自己的开发板设置。由于我的开发板上为QSFP及156.25MHz,所以选择4条lane,参考钟设置为156.25MHz,在此限制下线速率有3.125Gbps和6.25Gbps两种选择,本次仿真中采用线速率3.125Gbps,上板测试选用6.25Gbps。

        Buffer深度可选择8、16、32,建议选32,余量大些。

        本端ID:ID位宽及具体值。

        由于本次设计不涉及Train down,可以勾选phy_clk时钟频率等于log_clk。

        最后是关于资源类型选择,由于我的开发板上该部分GT时钟只有SRIO使用,不存在与别的GT共享时钟资源,可选择为core内部。

2.2 、核时钟资源共享使用

        该部分主要是GT时钟的使用,当GT时钟由多个不同的GT使用时,需要共享时钟资源,选择其中一个类型为共享在核内,剩余的选择为in Example Design;将in Core开放的对应时钟及复位连接in Example Design。

三、SRIO通信程序设计(NWRITE+DOORBELL)

        结合实际应用场景经验,选择NWRITE+DOORBELL应用广泛,DoorBell门铃作为一次通信中断。一次NWRITE携带256字节数据,在实际应用中不足256字节的可以补零填充。

        测试场景:QSFP进行收发自回环测试;VIO控制测试进行,可设置一次通信发送的字节数,不足256字节整数倍的自动补充成256字节,测试数据为递增数,最后发送DOORBELL。

3.1 、测试控制模块

        测试模块:根据VIO信息产生测试数据,控制测试数据FIFO写;以及结合ireq模块状态控制读取FIFO数据及封装Hello包所需的信息。

        参数信息:端口ID,数据地址,doorbell信息。

        端口信息:链路状态,nwrite状态;输出hello包头部信息,数据及发送触发等。

        测试数据的状态机:

        关于NWRITE及DOORBELL相关信息及控制的状态主要涉及:

3.2 、Hello包封装模块

        Hello包的发送在ireq接口,这部分主要封装NWRITE和DOORBELL的包。端口信息如下:

        输入来源于测试控制模块,输出对应于SRIO核的axis_ireq接口。其中状态机设计如下:其中nwrite与doorbell之间加了延时,如果不加,doorbell与最后一个nwrite包会背靠背连在一起。

3.3 、Hello包解析模块

        主要根据Hello包时序及不同字段的含义解析NWRITE和DOOBELL信息。

        输入来自于对端发过来的axi_treq接口,输出响应信号(可选择的送到SRIO核的tresp端口),接收的NWEITE数据及地址信息和DOORBELL信息。

3.4 、链路自复位功能

        当监测到链路掉链时,要产生至少4个时钟周期的复位信号,复位SRIO核;否则容易造成SRIO核状态信号不正常,导致通信无法继续。

3.5 、整体工程

        测试工程结构如下:

四 、 仿真测试

        仿真测试,容易观测很多细节信息;仿真采用3.125Gbps x4模式。

        建链过程如下:

           从上图可以看出port_initialized 信号与 link_initialized 信号拉高先后顺序,分别表示端口和链路被成功初始化。

        下方表示链路建立之前的时钟及复位关系。

        只有当链路初始化成功后,方可使用SRIO进行通信。

        时钟关系如下:频率及相位关系与datasheet相对应。

        NWRITE+DOORBELL收发过程如下:4个NWRITE+1个DOORBELL

        发送的第1、2包如下:

        上述hello首包可知。地址信息分别为0x001000000、0x001000100,协议类型组合为NWRITE

        接收的第1、2包如下:解包数据为递增数,解包无误。

        发送的DOORBELL如下:hello包头信息不再赘述。

输入来自于对端发过来的axi_treq接口,输出响应信号(可选择的送到SRIO核的tresp端口),接收的NWEITE数据及地址信息和DOORBELL信息。

五、 上板测试

        设置信息如下:起始地址与doorbell信息。由于是自回环,收发器件ID相同,与核设置相同。

        硬件平台如下:

5.1 、链路稳定性测试

        上电后,以链路掉链作为触发,观测10分钟,链路状态稳定。

5.2 、发包测试

        VIO设置发包数及使能:数据大小1K字节

        4包NWRITE及DOORBELL整体信息如下:

        从上图可获得每包的地址,相关控制信息及状态等。第一包的hello头细节信息如下:

        DOORBELL包信息如下:头部信息、时序、状态机转换。

5.3、收包测试

        接收的ILA信息:4个nwrite和1个门铃。doorbell信息为0x0001,每包的地址信息与发包对应。

        第一包信息:数据为1~32递增数,解析正确。

图片

往期精彩回顾

FPGA实现SD卡内文件的读写功能(FAT32文件系统)

FPGA实现千兆网UDP协议(含ARP、ICMP)

Xilinx DDR4 MIG IP核的AXI接口:FIFO应用

基于ZYNQ的远程更新功能

FPGA实现Aurora光通信应用

Xilinx PCIE数据交互应用(XDMA)

基于FPGA的USB3.0使用(CYUSB3014)

基于FPGA的以太网流控技术实现

多相DDS波形产生工程应用

宽带信号多相滤波及脉压处理(FPGA+ADC)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值