使用PXIe-5644R进行射频信号采集与回放

有朋友想分析一个SDR设备的协议,后来在讨论方法的时候,想到可以搞一下射频信号记录与回放,这样可以便于分析。于是乎,就搜了一下设备,发现都好贵的啊⋯⋯然后用英文搜了一下,发现了一个神器PXIe-5644R,就是这个链接:Disk Streaming Example for the NI PXIe-5644R – NI Community。这货支持80MHz分析频宽,IQ速率高达120 MS/s或480 MB/s,可以700 MB/s的速度与硬盘间记录和回放射频信号,最主要的是,咸鱼PXIe-5644R上才6k的价格,赶紧搞起来。

又深入研究了一下,PXIe-5644R支持Disk,DDR,P2P方式的射频信号记录与回放。示例使用的是Labview编程环境,貌似比直接写FPGA的Verilog还简单些。就是PXIe-5644R的环境搭建起来有点复杂,要搭配一个PXIe的主机箱,然后网上有使用NUC7连雷电的方式连接机箱,这个方案比直接买控制器还便宜不少,而且可以买新的机器。网上就是下面这套:

下面是NI官网的射频信号采集与回放说明:

貌似,PXIe-5644R用最新版本的RFmx WLAN还支持WiFi 11be信号的收发,可以用来测OpenWiFi了。

在Debian下搭建OpenWiFi开发环境

OpenWiFi是个不错的东西(除了许可选择比较激进外^@^),还是要十分感谢原作者开源这样一个项目让大家学习的。为了学习方便,我搞个最便宜的开发板AntSDR AD9363版本先测一下。本篇记录一下在Debian中的OpenWiFi开发环境搭建过程(作为CentOS的忠实用户,要全面转到Debian下了)。

本次用的服务器其实是我之前搭建TensorFlow的一个环境,使用的是debian-10.11.0版本。安装Debian10可以参考另一篇文章的配置Debian部分: Debian 10安装TensorFlow | OopsDump 。我看了下其他人的文章,有用Windows和Linux结合的,我感觉有点麻烦,就选择All in Linux了。反正Vivado和Matlab都有Linux版本,完全不影响使用。

安装必要的程序:

# apt-get install vim build-essential python3.7-dev python3-pip git
# apt-get install libncurses5-dev device-tree-compiler libssl-dev

在用户Home下创建一个工作目录:(以后工程都放在该目录下)

$ mkdir ~/workspace
$ cd ~/workspace

提示,命令中以#开始表示以root用户执行,以$开始表示以普通用户执行。

安装Vivado 2018.3

先安装个依赖:(不然安装会卡在结束位置)

# apt-get install libtinfo5

下载Xilinx Vivado 2018.3。然后解压文件:

$ tar zxvf Xilinx_Vivado_SDK_2018.3_1207_2324.tar.gz

然后,使用图形界面运行Vivado安装文件:

$ su -
# ./xsetup

如果图形界面无法显示,需要加入用户的x11认证到root:

# xauth add $(xauth -f ~<username>/.Xauthority list|tail -1)
# xauth list
# export DISPLAY=:<n为上面显示的最后一列的:后值>
# ./xsetup

在安装时,注意以下几个选项:
1. 在安装Edition选择时,HL Design和HL System都可以,因为涉及到WebPack License问题,所以我选了HL Design。
2. 支持芯片选能用到的就行,可以减少大小。
3. 安装位置,建议改为/opt/Xilinx。

安装之后,会弹出许可导入界面,我们使用XC7Z020用WebPack不需要许可,可以直接关闭。

然后试一下打开Vivado:

$ . /opt/Xilinx/SDK/2018.3/settings64.sh 
$ vivado

****** Vivado v2018.3 (64-bit)
  **** SW Build 2405991 on Thu Dec  6 23:36:41 MST 2018
  **** IP Build 2404404 on Fri Dec  7 01:43:56 MST 2018
    ** Copyright 1986-2018 Xilinx, Inc. All Rights Reserved.

start_gui

打开DocNAV会遇到libpng12找不到的问题,可以手动下载并安装这个:
https://blog.lazy-evaluation.net/data/libpng12-0_1.2.50-2+deb8u3dzu1_amd64.deb

# dpkg -i libpng12-0_1.2.50-2+deb8u3dzu1_amd64.deb
# apt-get install libcanberra-gtk-module

将默认文本编辑器改为VSCode(关于VSCode的安装,参考上一篇Debian中安装环境的文章)。进入Vivado后,通过菜单Tools->Settings打开配置。在配置中,他选择“Text Editor”页面,在Current Editor中选择最后的“Custom Editor”,配置参数为:

code -g [file name]:[line number]

安装Jtag驱动程序:

# cd /opt/Xilinx/Vivado/2018.3/data/xicom/cable_drivers/lin64/install_script/install_drivers
# ./install_drivers

安装其他环境

提示:本章中的内容为非必要操作,可以选择有用的安装。

普通用户权限可使用USB串口

串口设备默认需要Root权限打开,为了方便使用USB转串口,更改默认权限:

# vi /etc/udev/rules.d/70-ttyusb.rules
(加入下面信息)
KERNEL=="ttyUSB[0-9]*", MODE="0666"

安装免费版本的ModelSim 10.6d

免费版ModelSim for Intel FPGA Starter Edition可以10000行的Verilog,验证一些小的模块够用了。由于ModelSim 10.6d为32位程序,需要安装一下必要的环境:(为了安装速度快,也可以下载32位的iso系统,并加入源列表)

# dpkg --add-architecture i386
# apt-get update
# apt-get install lib32z1 libx11-6:i386 libxext6:i386 libxft2:i386

在Intel FPGA的网站下载18.1版本的ModelSim(对应10.6d版本): Intel FPGAs 下载中心

Intel ModelSim 18.1(10.6d)下载

使用Root用户安装时,选择Starter版本,建议安装到/opt目录。(注意:Root用户安装前要先修改DISPLAY环境变量,参考之前Vivado安装)

安装完成后,进入modelsim安装目录下的 /opt/intelFPGA_pro/18.1/modelsim_ase/bin 运行./vsim 出现  Error: Cannot find ”./../linux_rh60/vsim”。需要修改 /opt/intelFPGA_pro/18.1/modelsim_ase/vco文件:

 case $utype in
   2.4.[7-9]*)      vco="linux" ;;
   2.4.[1-9][0-9]*) vco="linux" ;;
   2.[5-9]*)        vco="linux" ;;
   2.[1-9][0-9]*)   vco="linux" ;;
   3.[0-9]*)        vco="linux" ;;
   *)               vco="linux_rh60" ;;
中linux_rh60改为linux。

在一些应用调用时会出现错误,需要再创建一个软链:

# cd /opt/intelFPGA_pro/18.1/modelsim_ase
# ln -s linuxaloem/ linuxpe

联合仿真库编译:

以Root权限打开Vivado,菜单中选择Tools -> Compile Simulation Libraries…。按下面图片填入后,点Compile。

使用ModelSim 10.6d创建Vivado的仿真库

编译完成后,确认errors为0即可。

检查Vivado的ModelSim用库编译结果

在菜单中选择Tools -> Settings…,再选择3rd Party Simulators页,填入下面信息:

配置Vivado的仿真设置

对于工程,需要配置使用的仿真工具:

安装IVerilog

这里再安装一下Verilog开源工具环境:

# apt-get install iverilog gtkwave

获取代码

由于众所周知的原因,使用Git clone GitHUB的代码比较慢,可以搭个梯子,并配置socks5的代理:(改为你实际的代理端口,也可以手动更改~/.gitconfig文件)

$ git config --global http.proxy 'scoks5://127.0.0.1:1080'
$ git config --global https.proxy 'scoks5://127.0.0.1:1080'

创建目录~/workspace/openwifi,将openwifi的代码都放在此目录中。

$ mkdir ~/workspace/openwifi

使用Git clone出最新SW工程:git clone https://github.com/open-sdr/openwifi.git。
Clone完后, 进入目录再更新Linux的submodule:git submodule update –init –recursive。

再使用Git clone出最新HW工程:git clone https://github.com/open-sdr/openwifi-hw.git。
Clone完后,进入目录再更新ADI HDL和OpenOFDM的submodule:git submodule update –init –recursive。

下载ADI提供的镜像(后续OpenWiFi版本可能有变化,以OpenWiFi最新的Readme.md为准):https://swdownloads.analog.com/cse/2019_R1-2020_02_04.img.xz

$ cd ~/workspace/openwifi
$ git clone --recursive https://github.com/open-sdr/openwifi.git
$ git clone --recursive https://github.com/open-sdr/openwifi-hw.git
$ wget https://swdownloads.analog.com/cse/2019_R1-2020_02_04.img.xz
$ xz -d 2019_R1-2020_02_04.img.xz
$ cd openwifi/adi-linux
$ git pull origin 2019_R1:2019_R1
$ cd ../adi-linux-64
$ git pull origin 2019_R1:2019_R1

编译系统

先介绍一下Vivado安装后,和编译程序相关的环境。这里的环境没有使用PetaLinux,而是使用了原始的方式。

环境中,需要包含进必要的环境变量,可以使用:

$ source /opt/Xilinx/Vivado/2018.3/settings64.sh

使用OpenWiFi官方的方法更新系统

先准备一个不小于8G的SDCard,这里AntSDR用的是TF卡。

直接写入SDCard

先要卸载自动挂载的SDCard设备,这里使用的是(/dev/mmcblk0p1),可能与你的不同,替换为你系统中的设备(如果SDCard存在多个分区,需要分别)。然后,使用dd命令将img文件写入SDCard中。最后,使用sync命令进行同步后,方可拔出设备。

$ su -
# umount /dev/mmcblk0p1
# dd if=2019_R1-2020_02_04.img of=/dev/mmcblk0 bs=4194304
# sync

挂载img到系统

也可以将img文件直接挂载到系统中。先使用fdisk查看一下img的分区信息。

# fdisk -lu 2019_R1-2020_02_04.img
Disk 2019_R1-2020_02_04.img: 7.4 GiB, 7948206080 bytes, 15523840 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x00096174

Device                  Boot   Start      End  Sectors  Size Id Type
2019_R1-2020_02_04.img1         8192  2105343  2097152    1G  b W95 FAT32
2019_R1-2020_02_04.img2      2105344 15501311 13395968  6.4G 83 Linux
2019_R1-2020_02_04.img3         4096     6143     2048    1M a2 unknown

Partition table entries are not in disk order.

为了同时编辑不同分区文件,这里使用losetup将img分割为不同的loop文件。

# losetup -P -f --show 2019_R1-2020_02_04.img
# losetup -l
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE                                                DIO LOG-SEC
/dev/loop1         0      0         1  0 /opt/debian_dvd/firmware-10.11.0-amd64-DVD-1.iso           0     512
/dev/loop4         0      0         0  0 /home/oopsdump/workspace/openwifi/2019_R1-2020_02_04.img   0     512
/dev/loop2         0      0         1  0 /opt/debian_dvd/debian-10.11.0-amd64-DVD-3.iso             0     512
/dev/loop0         0      0         1  0 /opt/debian_dvd/debian-10.11.0-amd64-DVD-2.iso             0     512
/dev/loop3         0      0         1  0 /opt/debian_dvd/debian-10.11.0-amd64-DVD-1.iso             0     512
# ls /dev/loop4*
/dev/loop4  /dev/loop4p1  /dev/loop4p2	/dev/loop4p3

将需要的分区进行挂载:

# mkdir -p /mnt/adimg/BOOT /mnt/adimg/rootfs
# mount /dev/loop4p1 /mnt/adimg/BOOT
# mount /dev/loop4p2 /mnt/adimg/rootfs

显示目录:

# ls /mnt/adimg/BOOT
README.txt				       zynq-zc702-adv7511-ad9361-fmcomms2-3
socfpga_arria10_socdk_ad9172_fmc	       zynq-zc702-adv7511-ad9361-fmcomms5
socfpga_arria10_socdk_adrv9009		       zynq-zc702-adv7511-ad9364-fmcomms4
socfpga_arria10_socdk_adrv9371		       zynq-zc706-adv7511
socfpga_arria10_socdk_daq2		       zynq-zc706-adv7511-ad6676-fmc
socfpga_arria10_socdk_fmclidar1		       zynq-zc706-adv7511-ad9172-fmc-ebz
socfpga_cyclone5_sockit_arradio		       zynq-zc706-adv7511-ad9265-fmc-125ebz
uEnv.txt				       zynq-zc706-adv7511-ad9361-fmcomms2-3
VERSION					       zynq-zc706-adv7511-ad9361-fmcomms5
zynq-adrv9361-z7035-bob			       zynq-zc706-adv7511-ad9361-fmcomms5-ext-lo-adf5355
zynq-adrv9361-z7035-bob-cmos		       zynq-zc706-adv7511-ad9364-fmcomms4
zynq-adrv9361-z7035-fmc			       zynq-zc706-adv7511-ad9434-fmc-500ebz
zynq-adrv9361-z7035-packrf		       zynq-zc706-adv7511-ad9625-fmcadc2
zynq-adrv9364-z7020-bob			       zynq-zc706-adv7511-ad9625-fmcadc3
zynq-adrv9364-z7020-bob-cmos		       zynq-zc706-adv7511-ad9739a-fmc
zynq-adrv9364-z7020-packrf		       zynq-zc706-adv7511-adrv9008-1
zynq-common				       zynq-zc706-adv7511-adrv9008-2
zynqmp-adrv9009-zu11eg-revb-adrv2crr-fmc-revb  zynq-zc706-adv7511-adrv9009
zynqmp-common				       zynq-zc706-adv7511-adrv9371
zynqmp-zcu102-rev10-ad9172-fmc-ebz-mode4       zynq-zc706-adv7511-adrv9375
zynqmp-zcu102-rev10-ad9361-fmcomms2-3	       zynq-zc706-adv7511-fmcdaq2
zynqmp-zcu102-rev10-ad9361-fmcomms5	       zynq-zc706-adv7511-fmcdaq3-revC
zynqmp-zcu102-rev10-ad9364-fmcomms4	       zynq-zc706-adv7511-fmcjesdadc1
zynqmp-zcu102-rev10-adrv9008-1		       zynq-zc706-adv7511-fmclidar1
zynqmp-zcu102-rev10-adrv9008-2		       zynq-zc706-adv7511-fmcomms11
zynqmp-zcu102-rev10-adrv9009		       zynq-zed-adv7511
zynqmp-zcu102-rev10-adrv9371		       zynq-zed-adv7511-ad9361-fmcomms2-3
zynqmp-zcu102-rev10-adrv9375		       zynq-zed-adv7511-ad9364-fmcomms4
zynqmp-zcu102-rev10-fmcdaq2		       zynq-zed-adv7511-ad9467-fmc-250ebz
zynqmp-zcu102-rev10-fmcdaq3		       zynq-zed-adv7511-cn0363
zynqmp-zcu102-rev10-fmclidar1		       zynq-zed-imageon
zynq-zc702-adv7511

# ls /mnt/adimg/rootfs
bin  boot  dev	etc  home  lib	lost+found  media  mnt	opt  proc  root  run  sbin  share  srv	sys  tmp  usr  var

编译OpenWiFi文件

对于挂载SDCard的方式,改为实际目录。

使用OpenWiFi的Readme中提供的方法编译:

$ export SDCARD_DIR=/mnt/adimg/
$ export XILINX_DIR=/opt/Xilinx/
$ export OPENWIFI_HW_DIR=/home/oopsdump/workspace/openwifi/openwifi-hw/
$ export BOARD_NAME=antsdr
$ cd openwifi/user_space
$ ./update_sdcard.sh $OPENWIFI_HW_DIR $XILINX_DIR $BOARD_NAME $SDCARD_DIR

更新的文件主要在:rootfs/lib/modules/,rootfs/root/openwifi/,BOOT/BOOT.BIN,BOOT/devicetree.dtb,BOOT/openwifi/

生成FPGA的bit

配置Vivado工程

【TODO】

获取Xilinx的IP评估使用许可

获取Xilinx Viterbi Decoder的Evaluation License:

【TODO】

本文参考了:

https://blog.lazy-evaluation.net/posts/linux/vivado-2018-3-buster.html
https://blog.csdn.net/long_fly/article/details/78643258