> Ubantu 20.04 下使用GNU Radio3.8 + RFNoC 4.0 开发USRP 片上FPGA资源


前言

软件无线电平台USRP是发射、接收无线电信号十分方便的一个工具。如果只使用其进行信号的发射和接受,通过UHD,GNU Radio,matlab,Mulstim等软件可以方便地完成信号处理。我在GNU Radio中完成过很多与USRP的开发工作,例如收发信号,信号处理,变换,通信系统模拟,雷达探测,雷达信号处理。
采用基础的USRP收发信号+PC信号处理的方法,优点在于简单,但也有很多缺陷,当面临复杂功能需求时,这些缺陷可能致命。

1 USRP设备与PC之间通过USB/网线连接时,通信速率太慢导致信号带宽过窄。
2 计算机cpu计算速度不足导致处理信号速度过慢

解决问题1 的方法包括,使用万兆网口,PCIe接口。一般的电脑没有万兆接口,像我的电脑主板就是2.5G网口。解决方法是使用主要插万兆网卡或雷电接口转万兆转接器的方式,PCIe接口也是需要增加电脑硬件,十分麻烦。

解决问题2 的方法除了换好电脑外没别的方法,使用多线程操作可以在一定程度上解决问题,但只能解决一小部分根本问题。

除了发射和接收,USRP的X系列(X300 X310 X410),E系列(E310,E320)都提供了开发片上FPGA的功能。 通过开发FPGA可以对USRP射频子板直接接收到的高采样率信号进行处理。并且可控制USRP以低采样率输出处理过的信号(具体原理不详细说明),据此可以解决第一个问题。FPGA片上具有高速并行的计算资源,其特点就是实时数据流的处理,这解决了第二个问题。因此开发FPGA对使用USRP完成复杂高级的功能有很大作用。例如下图所示的一个例子,RFNoC:mod1是FPGA的信号处理模块,此外在计算机上还有很多信号处理模块,这样可以实现更复杂的功能。
在这里插入图片描述

写这篇文章的目的在于,目前关于开发USRP片上FPGA的资料很少。UHD 3.15 + GNU Radio 3.7 + RFNoC 3 的开发流程,在这篇文章中有详细教学。

RFNoC3 开发

我之前也使用以上旧版本开发了一整个工程,觉得将FPGA开发嵌入到 gr_ettus 工具包的开发方式很方便,通过使用GNU Radio将模块连接。但当我使用了新版以后,我发现新版比旧版有很大提升。RFNoC4 在自建模块,生成FPGA镜像时,比RFNoC3 更快,更稳定(RFNoC3 我经常遇见生成一半报错的问题)。而且习惯以后用着简便舒服很多。但RFNoC4的学习资料实在太少。关于RFNoC4 的开发资料主要是官网的一些文档。

Ettus 官方开发资料总库,可以搜索RFNoC

RFNoC 4 开发教程

RFNoC 4 开发教程2

本文主要目的在于RFNoC4 开发的教学,用简单的方式结合自身开发经历说明RFNoC4的安装,使用方法,使用注意事项。

一、RFNoC4.0开发环境介绍与前置条件

本文的开发环境是Ubantu 20.04 + UHD 4.1 + GNU Radio 3.8 + RFNoC4(gr_ettus maint-3.8-UHD4.0)

安装双系统

gnuradio 安装

如果你有翻墙,按这个执行GNU Radio安装即可,如果没有,我建议你往下看看关于下载的说明,直接按照官方方法下载安装会非常非常慢,且会安装到一半失败。

如果你是USRP的初学者,我建议看看下面这个链接
gnuradio使用usrp练习

https://github.com/EttusResearch/gr-ettus

二、RFNoC4.0安装

1 下载

首先说一下下载的问题,我不建议使用官方的方法下载,使用git clone 方便管理各个软件包的版本,但是我觉得不适合用于国内,git clone 按我的经验很慢,至少我的网络上github是一阵一阵的,有时能上有时上不了。

我推荐使用github手动下载或者gitee下载
以gr_ettus 工具包为例,github下载界面如下,左边选版本 , 右边点下载Zip。

(这里还有一点,用这个方法下载GNU Radio时 注意里面的volk文件夹下载下来没有,如果没有单独下载一下volk,我也不知道具体为啥,但确实有这个问题,如果你没遇到是最好。)

github下载gr_ettus 界面
另一个方法是gitee下载,这个完全不用翻墙,更快,
这个注册账号就能下载,搜索以后点下载,然后点下载zip就行
(注意一下gr_ettus别在这下载,有问题)

gitee下载界面

2 安装

如果你已经成功安装了UHD 和 GNU Radio,那么我相信RFNoC 的 安装对你是没啥问题的,基本都完全一样。
需要先安装Vivado再安装,Vivado 安装2019.1版本

Vivado ubantu安装

安装包在这下载

破解文档在这下载
链接:https://pan.baidu.com/s/17_cPUahNzHmm-3xKsKQ7GQ
提取码:rop0

破解过程看这

然后去gr_ettus 的文件夹里安装gr_ettus包就可以了

像我是习惯把所有的安装包都放在主目录的work下

cd gr_ettus
mkdir build
cd build
cmake ../
make -j16
sudo make install
sudo ldconfig

然后就安装完成了

三、RFNoC4.0使用(与RFNoC3的主要区别)

1 RFNoC基本模块的使用

在这里插入图片描述
digital downconverter 降采样(DDC,接收通道使用)
digital upconverter 升采样(DUC,发射通道使用)
TX radio 发射天线
Rx Radio 接收通道
RFNoC Graph 拖进来就行,只有一个usrp时不用管,多个usrp时有用

RFNoC4相对于RFNoC3的一大提升就是取消了FIFO模块,模块的缓存区在构建映像的时候就设定好了。因此
RX Radio - DDC-计算机 是一个完整的接收通道
计算机-DUC-TX-Radio是一个完整的发射通道

再拖入一个RFNoC Graph ,就可以与USRP source和USRP sink完全等价。

2 RFNoC自建模块

开发FPGA当然是为了能够实现自己想要的功能,这在RFNoC框架了也是通过自建模块来实现,看这一部分之前,请一定先搞清gr_modtool的使用方法,了解自建模块的流程。RFNoC的自建模块是一种特殊的自建模块,所以要先搞懂普通自建模块的方法。

gnuradio自建信号处理模块教程

在掌握了自建模块方法后,就可以开始使用rfnocmodtool 自建模块

使用以下和gr_modtool 相似的方法即可

rfnocmodtool newmod abc
cd rfnoc-abc
rfnocmodtool add tb1

接下来每一行按图片中输入n即可

rfnocadd
这里有个需要注意的小点,Block NoC ID 这个代表着usrp和gnuradio认识这个模块的身份证号,第一次开发不用管,直接回车随机生成就可以。
如果是在后续模块做完了,从一个电脑搬到另一个电脑的过程中,需要注意模块的很多文件中都包含这个,在复制代码时要保证这个和usrp内部镜像中的Block NoC ID是一致的。因为这个RFNoC模块,你要在电脑上有使用这个模块的部分(GNU Radio 拖动的模块),在此之前你还要把他烧录到USRP里面的FPGA上,这就要求GNURADIO 和FPGA的模块得互相认识,就要求这个ID是一致的。可能会出现的问题就是你有一个烧录自建模块的USRP,然后你再另一台电脑上重新构建了自建模块,程序代码是一样的,但是ID不一样,也用不了。

然后就是更改其中的程序文件,这部分我觉得相对于gr_modtool 自建的模块,RFNoC模块改起来是比较简单的,因为不需要再多个XX.h,XX_imph,XX_impl.cc,XX.yml中,每次都对应的修改。RFNoC模块也要修改,但是不需要修改那么多。

3 自建模块实现功能

以刚才建立的tb1模块为例,若想用其实现功能,需要更改
/rfnoc-abc/rfnoc/fpga/rfnoc_block_tb1/rfnoc_block_tb1.v
在其中实现功能时,主时钟为ce_clk和rfnoc_chdr_clk,这两个用哪个都可以,像我用的USRP-X310,这两个一个是200M一个是174M,我没有仔细研究。

s_out_payload_tdata是输出,m_in_payload_data是输入,可以操作你的信号了。我也只做过单输入单输出的。

另一个是输入参数的问题,就是在GNU Radio里面输入的参数,在这个verilog文件中是以下图这两个变量存在的
在这里插入图片描述

假设我们有一个要输入的参数,我们需要定义一个他的地址,这个地址我们可以理解为你在电脑输入参数以后,电脑根据这个地址,给你传输到fpga的相应位置,就是REG_USER_ADDR。然后我们可以在这个.v文件中定义一个寄存器reg_user 来读取这个量。 这里注意,我们需要自己额外定义输入参数时,就按照这个模板抄,例如我想定义一个叫freq的输入,就这么抄就行

在这个.v文件中,抄完输入的参数, 根据时钟,ce_clk,输出s_out_payload_tdata,输入m_in_payload_data定义完功能,这部分就完事了。

接下来就是公式套路化的定义接口,接口就是你的fpga文件,需要能通过rfnoc烧到usrp里去,然后再GNU Radio里面还得调用,
\rfnoc-abc\grc\abc_tb1.block.yml 这个是定义模块在gnuradio上的接口文件
这部分相对RFNoC3就方便的多了,RFNoC3还要改动FPGA上的接口xml文件,RFNoC4不需要。
这部分只需要把这涉及到这几个寄存器的地方再复制一遍就好。

在这里插入图片描述
按理说模块已经建立结束了。我们可以在rfnoc-abc 这个文件夹里面

mkdir build
cd build
cmake ../
make -j16
sudo make install
sudo ldconfig

在GNURadio中就可以看见这个模块,但是还用不了,需要将其生成fpga镜像文件,准确的说是生成一个镜像文件使其包含tb1的功能。

这是一个比较耗时的过程,为了防止结果错误,我们需要先进行仿真。

4 自建模块仿真

自建模块仿真的方法也很简单,就是在build 文件夹里

make noc_block_tb1_tb

但是我们需要先编写仿真文件\rfnoc-abc\rfnoc\fpga\rfnoc_block_tb1\rfnoc_block_tb1_tb.sv

首先把输入参数的部分给他复制一遍
在这里插入图片描述
然后在后面,定义给模块的输入序列,然后读取输出序列看结果
在这里插入图片描述
这部分我就不具体展开了,如果有verilog基础,看懂并不难,可以看出他是一直再发随机数,然后看接受的和发射的是否一致,原始模板中是直接将输入assign给了输出,更改后,模块功能也会变化。
这部分我建议大家不一定需要更改这个检测的部分`ASSERT_ERROR(),就让他错着,仿真时候会发现一大堆的输入和输出,然后手动观看就可以,除非你的功能特别复杂,这就根据各人的特殊情况了。

4 FPGA映像烧录

最后是生成FPGA的image然后烧录

RFNoC4 的另一个显著提升是让fpga映像的描述更加全面,是使用
\rfnoc-abc\rfnoc\icores\tb1_x310_rfnoc_image_core.yml
来描述的,这里我对每部分说明是什么意思,以及该怎么写
在这里插入图片描述
在这里插入图片描述
ep(endpoint)你可以理解为定义了一个模块的输入/输出接口可以自由连接的端点。如果你把一个模块的输入,输出都连接到了ep上。那你就可以在GNURadio里随便连这个模块。但如果你已经想好了这几个模块在FPGA里怎么连,那你可以只留出两个ep。因为每个ep可以接一个输入和一个输出,你就可以只留出rfnoc和计算机的接口。双发双收两个ep就可以搞定。
ep的buffsize就是取代了RFNoC3中还需要FIFO来定义缓存区的方式,在ep里定义真的方便多了。

noc_blocks 这部分顾名思义,就是你想往里塞的模块,一般来说RADIO, DDC,DUC是必须塞的,你别去动他默认的,想要加什么模块往里加就可以了。

connections 就是描述模块连接的,像我之前所说,你可以把每个模块全连到ep上,也可以预先连接好,我建议直接练好,这样可以节约fpga上的缓存区,而且这个ep的buffsize定义我现在也没找到科学的设置方法。

这个icore.yml文件写完后,直接用一条命令就可以生成,然后用另一条命令可以进行烧录

rfnoc_image_builder -F <repo>/fpga –I ~/rfnoc-demo/include/rfnoc -y \rfnoc-abc\rfnoc\icores\tb1_x310_rfnoc_image_core.yml 
%生成镜像
uhd_image_loader --args "type=x300,addr=192.168.10.2" --fpga-path ./build/usrp_x310_fpga_XG.bin
烧录镜像

这里repo/fpga是你的uhd里面的fpga文件夹,这里面有生成fpga的程序。烧录里面的–fpga-path是你要烧录的foga程序,在你的生成镜像步骤结束后,命令行会提示你刚生成的.bin文件在哪。

然后记得烧录结束后重启fpga,就可以用新镜像了。
到这里就可以使用GNU Radio里的RFNoC模块了,恭喜你完成了USRP片上的FPGA开发。

最后一点要注意的,烧录过程中别让USRP掉电了,不然需要用jtag线重新烧录FPGA镜像来挽救它,具体操作见
USRP修复

简单的说就是通过JTAG线把镜像烧进USRP。我建议是先用装好环境的电脑下载镜像

sudo uhd_images_downloader

然后打开vivado烧录就行了,也可以把镜像拷贝到别的电脑上,用别的电脑烧录都可以。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值