如何运行 NI-USRP RIO 10Gb Ethernet 范例

更新 Nov 18, 2020

环境

硬件

  • USRP-2945
  • USRP-2955

准备工作

  • 软件:如果是在LabVIEW NXG上运行,需要安装NXG 3.1 以及NI-USRP 19.0以上版本。如果在LabVIEW上运行,需要安装NI-USRP 19.5以上版本。
  • 硬件:USRP 2945/2955、PC、Intel X520 NIC、MXI x4线缆和10Gb SFP+光纤跳线、两个10Gb SFP+光模块(一个连接PC端,另一个连接USRP RIO)。
注:
  1.  范例中使用的是USRP 2945 & 2955作为FPGA target,准备硬件的时候需要注意使用USRP 2945或者USRP 2955。
  2. USRP 2974 的10Gb SFP+ 无法直接与USRP RIO相连接,建议使用PC + Intel X520 NIC 作为上位机进行连接。

  1. 打开LabVIEW,在点击创建项目,在项目模板中找到NI-USRP RIO 10Gb Ethernet,创建该范例项目。
  2. 在项目浏览器中展开My Network Host v1.lvlib,并打开其中的Applications文件夹,会发现其中有三个子文件夹。这三个子文件夹的名称分别与FPGA Target 中 My Network FPGA v1.lvlib 内 Applications 文件夹中的3个vi相对应。以TenGbE_FPGA 为例,其中的三个 Getting Started vi 对应的都是TenGbE_FPGA.vi,在 FPGA Bitfiles 中对应的是OpenCore TenGbE.lvbitx。

Loopback Test

  1. 使用 10Gb SFP+ 线缆连接 USRP RIO 的 Port 1 和 Port 0。使用 MXI x4 线缆连接 USRP RIO 和 PC。此时看到 USRP RIO 的两个 SFP+ 接口绿色 LED 都是亮起的,橙色 LED 不处于常亮状态。
  1. 打开Getting Started (Loopback Test).vi。在程序的前面板做如下配置:
  • resource name 改为 USRP RIO 在 NI MAX 中的设备名称。
  • TX InstanceRX Instance 分别为 0, 1 或 1, 0(只要不是同为 0 或 1 即可)。
  • RX IP AddressTX IP Address 设为相同的值。
  • UDP Destination Port 的值不需要进行改动。
  1. 点击运行,该程序没有设计连续运行,如果需要连续运行,在程序框图自行增加循环结构即可。
以下是 Loopback 程序的运行架构。PC 通过 PCIe 将长度为 256 的数据传输给FPGA端,FPGA TX 部分的代码将data 从 DMA FIFO 中取出并通过 UDP 发送。FPGA TX 部分的代码通过 UDP 接收 data,并将其通过 DMA FIFO 上传至 PC 端并进行显示。由于 TX 和 RX 共用一个 UDP Destination Port,所以无需在前面板上特意修改该参数。且由于 PC 端和 USRP RIO 之间不存在网络通信,所以 IP 地址可以填写符合规范的任意值(如1.1.1.1)。
 

RX on FPGA

  1. 使用 10Gb SFP+ 线缆连接 PC 与 USRP RIO 的 Port 0 (或Port 1)。使用MXI x4线缆连接USRP和PC。此时看到USRP用于连接 PC 的 SFP+ 接口绿色 LED 都是亮起的,橙色LED 是熄灭状态。PC 上的 10Gb 以太网卡(此处使用Intel X520 NIC)连接 USRP RIO 的绿色 LED 灯亮起。下图仅展示将 USRP RIO 的 Port 1 与 PC 相连。

  1. 在PC端的命令行中输入 ipconfig 命令来查询 10Gb 以太网卡的IP地址。Intel X520 NIC 有两个 10Gb 以太网接口,仅使用一个接口连接 USRP RIO 时,另一个接口会显示“媒体已断开连接”。此处我是用以太网适配器 以太网 6 连接 USRP RIO 的 SFP+ Port 1.


 
  1. 打开 Getting Started (RX on FPGA).vi。在程序框图的前面板中做如下配置:
  • resource name 改为 USRP RIO 在 NI MAX 中的设备名称
  • RX Port 选择为 1(如果使用 SFP+ Port 0 进行连接,则该参数为 0)
  • Local IP Address 改为 169.254.23.224。由于此处的 Local IP Address 指的是 USRP RIO 的 IP 地址,所以需要将 ipconfig 中得到的 PC 端的 IP 地址尾数 +1,即 169.254.23.(223+1)。
  • MAC Source Address UDP Destination Port 无需做更改。

  1. 打开 NI Example Finder,搜索 “UDP”,找到 Simple UDP.lvproj。打开其中的 Simple UDP-Sender.vi

  1. 进入程序框图,将地址修改为与 Local IP Address 相同,此处为为 169.23.224。将远程端口修改为与 UDP Destination Port 相同,即 35311。之后运行 Simple UDP-Sender.vi Getting Started (RX on FPGA).vi


以下是 RX on FPGA 程序的运行架构。PC 获取 FPGA 引用调用 USRP RIO 中 FPGA 的程序(即TenGbE_FPGA.vi)。PC 通过 Simple UDP-Sender.vi 这个程序不断向指 USRP RIO 所在的IP地址发送数据。FPGA RX 部分的代码通过 UDP 接收该数据,并将其通过 DMA FIFO 上传至 PC 端并进行显示。此时需注意:
  • Simple UDP-Sender.viGetting Started (RX on FPGA).vi 使用的是同一个 UDP Destination Port。RX 程序中,FPGA 抓取 UDP Destination Port 地址上的 UDP 数据。所以在配置 Sender 时,需要把 Sender 的destination 设置为与 RX 的 Destination 一致。
  • 由于在 RX 程序端,Local IP Address 指的是 USRP RIO 的 IP Address,所以不能直接使用 ipconfig 获取的 IP 地址。
  • 如果连接 Port 1,则 RX 程序面板上CLIP state 中的 signal_detect_Port1aBlockLockPort1 会亮起。如果将 Port 1 和 Port 0 都连接 PC,则 CLIP state 中四个 LED 都将亮起,无论该 SFP+ 是否参与 UDP 数据传输。

 

TX on FPGA

  1. 硬件连接与运行 Getting Started (RX on FPGA).vi 时相同。下图仅展示将 USRP RIO 的 Port 0 与 PC 相连。

  1. 在PC端的命令行中输入 ipconfig 命令来查询 10Gb 以太网卡的 IP 地址。此处我是用以太网适配器以太网 7 连接USRP RIO 的 SFP+ Port 0.

  1. 打开 Getting Started (TX on FPGA).vi。在程序框图的前面板中做如下配置:
  • resource name 改为 USRP RIO 在 NI MAX 中的设备名称
  • RX Port 选择为0(如果使用SFP+ Port 1 进行连接,则该参数为 1)
  • Local IP Address 改为169.254.70.153,Dest IP Address 改为 169.254.70.152。由于此处的Local IP Address 指的是 USRP RIO 的 IP地址,所以需要将 ipconfig 中得到的 PC 端的 IP 地址尾数+1,即 169.254.23.(223+1)。Dest IP Address 即 PC 的 IP 地址。
  • TX 程序没有设计连续运行,如果需要连续运行,在程序框图自行增加循环结构即可。


 
  1. 打开 Simple UDP-Receiver.vi,进入程序框图,接收方端口修改为与 UDP Destination Port 一致,即 35311。之后运行 Simple UDP-Receiver.vi Getting Started (TX on FPGA).vi


以下是 Getting Started (TX on FPGA).vi 程序的运行架构。PC 获取 FPGA 引用调用 USRP RIO 中 FPGA 的程序(即 TenGbE_FPGA.vi )。PC 通过 DMA FIFO 不断向 USRP RIO 传输数据,并将该数据通过 UDP 的方式发送至 UDP Destination Port。PC 端运行的 Receiver 不断从接收方端口接收该数据,并在 PC 端显示。

 

 

FPGA 部分代码

FPGA与PC交互通信的程序集中在PORT 0和PORT 1这两个单周期定时循环中,其中每个循环内都有单独的RX和TX程序。

Create Ethernet MAC – CLIP v1.viCreate Network API.vi 中,根据以下物理层的帧结构示意图来创建Ethernet Frame结构。


 
在 RX 程序中,给出了两种模式:
  •  RAW Mode:即并不按照指定 UDP 端口和 IP 地址来抓取数据包,而是将所有 Ethernet Frame 统统抓取。之后通过对Checksum进行匹配,如果能够匹配,则该帧以 “End of Good Frame” 结束,反之则是 “End of Bad Frame”。将收到的 Good Frame 和 Bad (Error) Frame 进行计数并输出至 debug data。
  • 非RAW Mode:在获取 UDP 数据包后通过筛选帧结构中的 IPv4 Header 和 UDP Header 部分,获取 sender 实际发送的数据包。


 


由于所有 Ethernet Frame 中 Payload 这一部分的数据都是相似的。在属性节点中可以看到,data stream 具有data、data valid 和 byte enables 的属性。当 data valid 为 true 时,数据可以直接交付给 FIFO 进行传输,而无需先等待 checksum 的匹配。

在 TX 程序中,首先将数据元素从 FIFO 中取出,通过 Stream IDL 来控制和监控来自 FIFO 的数据传输。此后,数据流根据用户设定的首选数据报大小被进行分块,将分块完毕的数据写入 buffer,再封装成 Ethernet Frame 进行 UDP 传输。同时,TX 还加入了 Packet Governor 的功能,当远程目标无法跟上 TX 端发送速率的时候,该 vi 能够限制 FPGA 程序把数据包写入到 Ethernet Frame 的速度。

下一步

一些关于 Ethernet Frame 的介绍以及该项目的其他内容可以参考项目浏览器中的 documentation 文件夹。