Zynq异构多核的无线电信号采集终端系统设计

2018-04-11 09:14
单片机与嵌入式系统应用 2018年4期
关键词:线程寄存器程序

(1.西安电子科技大学 电子工程学院,西安 710071;2.电子信息控制重点实验室)

引 言

随着无线电通信行业的迅猛发展,相关的各类无线电通信业务应用日益广泛,无线电信号监测已成为了民用无线电管理的主要需求。目前市场的无线电信号监测设备大多是采用射频变频接收模块,将射频无线电信号放大变频至中频,在模数转换之后,以FPGA+DSP作为下位机、以PC机作为上位机实施信号分析,这样的结构不仅体积庞大,不便携带,而且功耗较高,无法适应灵活的应用环境。

本文研究并设计了一种以Zynq-7000系列SoC为核心,AD9361为采样前端的无线电信号采集监测系统,Zynq-7000系列是目前应用十分广泛的ARM+FPGA架构的SoC,以它为核心的设计难点在于软硬件协同开发。我们所设计的这套系统将信号变频接收、采集、处理、显示、存储、传输融为一体,并定制了嵌入式Linux操作系统,具有实时性强、便于携带、升级简单的优点。

1 系统组成

1.1 Zynq-7000结构

Zynq-7000是Xilinx公司推出的新一代全编程片上系统架构,其系列产品以ARM+FPGA为主要结构,使得ARM和FPGA之间可以优势互补。本设计采用的型号是XC7Z045,该产品是Zynq-7000系列中配置较为高端的一款片上系统。整个系统分为PS(Processing System)和PL(Programming Logic)两部分,如图1所示。

图1 Zynq-7000 XC7Z045结构

其中,PS含有ARM双核Cortex-A9处理器,每个核都配备了NEON和浮点运算单元,最高运行频率为1 GHz。每个单核都具有独立的L1缓存和MMU,是典型的异构多核处理器。PS中还拥有丰富的外设,包括各种外设接口。

PS拥有自己的时钟源和存储器接口,不需要借助PL配置即可启动运行。

图3 采集系统整体结构

PL部分属于Xilinx典型的FPGA结构,其性能和逻辑密度相当于Xilinx Kintex-7 FPGA器件,还具备了大量的Block RAM和DSP Slice,完全可以胜任复杂的逻辑设计。在非调试模式下,PL无法单独启动,系统总是优先启动PS并从存储器中导入Bitstream文件后才能配置PL。

PS和PL之间可通过多种方式进行通信,包括GP、HP、ACP、EMIO、IRQ、DMA等接口。

1.2 射频捷变收发器AD9361

本设计采用ADI公司推出的AD-FMComms3-EBZ评估板作为数据采集前端。该评估板是一款以AD9361为核心,高性能、高集成度的射频收发器。这套评估板具有两套独立的收发设备,即两个接收通道和两个发射通道,每个通道均可以工作在70 MHz~6 GHz的频段范围内,由于系统对模拟信号采取了零中频正交采样的方式,因此每个通道在基带又可分为I路子通道和Q路子通道,每个子通道都具有独立的12位ADC/DAC,其基带采样频率从200 kHz~56 MHz。其中接收通道的结构图2所示。

图2 AD9361内部接收电路结构图

1.3 系统整体设计

本设计的整体框图如图3所示,信号由监测天线进入AD9361,经过放大、下变频、正交采样后得到IQ两路数据,并传入PL中。数据由AD9361控制器IP接收并打包成64位数据后存入FIFO当中,通过PS中DMA将FIFO的数据传入内存中,PS中的程序通过访问内存获得了采样数据,并利用协处理器NEON和VFP引擎对其进行处理,最终进行数据可视化之后,通过HDMI输出显示内容,同时可以将有用的数据保存在SDHC卡中。

本设计开发可以分成三个阶段:第一阶段是硬件逻辑设计,包括对PL中的IP核进行逻辑设计和布局,开发环境为Vivado,最终生成hdf文件和Bitstream文件。第二阶段是嵌入式Linux软件环境定制,包括对Linux的定制和移植,以及驱动程序的编写调试,主要在Xilinx SDK和PetaLinux中完成。第三阶段是在Linux平台下编写无线电信号采集监测的软件应用程序,包括对利用协处理器对数据进行计算和数据可视化,在QT中实现。

2 硬件逻辑设计

2.1 AD9361接口

AD9361的通信接口可分为数据接口和控制接口。

数据接口主要负责采样数据的通信,有LVDS和CMOS两种接口形式,二者速率均可达122.88 MHz,本设计采用LVDS模式,时序如图4所示。

参照此时序,设计了AD9361接收模块IP,每个通道的采样位数是12位,根据半字(16位)对齐,将差分的时序信号转换并成32位的数据格式。

图4 AD9361数据接口时序

控制接口的通信方式是SPI总线,主要是负责访问AD9361内部寄存器。通过配置8位寄存器来实现对接收链路的控制和状态监测。其寄存器有统一的编址,如控制内部VCO以分频产生RF信号的寄存器RF PLL_Deviders,其地址是0x005。AD9361的初始化寄存器配置十分复杂,但在通常情况下,开发者不需要了解寄存器配置的信息,因为ADI公司已经为开发者提供了配置AD9361的板级支持包(BSP),开发者只需要调用特定的API函数,就可以完成AD9361相应的配置。

如使用ad9361_set_rx_sampling_freq()函数设置接收设备的采样频率。PS部分具备SPI控制器,无需在PL中实现IP核,但需要在对PS的逻辑设计中使能SPI控制器。

2.2 FIFO IP设计

本设计中的FIFO IP如图5所示。

图5 FIFO逻辑IP核

FIFO是信号采集系统中一个重要的设计。在高速信号采集中,采集速度往往超过数据处理速度,因此通常采取的策略是利用FIFO存储足够长时间的数据,再送到处理单元处理,因此FIFO的大小决定了数据采集系统的最大采样深度和最大采样宽度。本设计的前端采样速率最大为50 MHz,而通常无线通信信号的码片长度不会超过100 ms,因此本设计中将FIFO的深度设置为8 MB,单路数据宽度为16位,这样在系统以最高采样速率运行时FIFO仍可以记录160 ms以上的数据。

2.3 PS-PL接口配置

Vivado提供了逻辑IP核Processing System 7作为PL连接PS的接口,如图6所示。在本设计中,PS部分需要通过自身的DMAC将PL部分FIFO中的数据读入内存,并接收来自PL的中断。同时,PL中还例化了VDMA和HDMI接口逻辑IP核,作为视频输出控制器,VDMA则通过AXI Stream总线与PS连接。由于AD9361的SPI总线连接的是XC7Z045的PL引脚,因此需要将PS部分SPI控制器的引脚通过内部互联总线映射到对应的PL引脚上。

图6 Processing System 7逻辑IP核(局部)

完成硬件逻辑设计之后,通过Vivado的验证、分析和综合,最终得到硬件描述文件system.hdf和FPGA配置文件Bitstream。

3 软件环境搭建

由于整个系统要实现采集、处理、存储及显示等多种任务,采用裸机运行显然无法胜任,因此本设计为Zynq-7000移植了操作系统。

3.1 Zynq-7000 PS启动原理

Zynq-7000 PS软件程序启动分为三个阶段。

系统上电之后,最先执行的是内部BootROM存储的固件代码,这部分代码用户无法修改,其功能是初始化ARM内核和与启动模式相关的外设,并读取MIO config引脚的状态,根据引脚的状态决定下一阶段的启动模式(如SD卡启动、Flash启动等)。在该段程序结束时,系统将把下一阶段的代码从相应的存储设备里载入到OCM(on-chip memory,片上存储器)。

第二阶段所执行的代码称为FSBL(the First Stage Boot Loader),这部分代码由用户自行烧写到存储设备中,其作用通常是初始化整个PS所需的外设,加载中断向量表,如果检测到FPGA配置文件,则还会将配置文件烧入PL中。但由于OCM存储容量有限,一个FSBL代码的长度为192 KB,无法运行较为复杂的程序,所以FSBL在结束时会调用函数FsblHandoff(),将处理器的程序流程定位到用户自定义的程序入口中,从而进入第三阶段。对于裸机系统而言,第三阶段程序入口就是用户程序中的主函数main(),对于Linux操作系统而言则是u-boot。

3.2 FSBL定制

通常,FSBL的制作是在Xilinx的软件开发环境XSDK中完成。对于Zynq-7000器件,XSDK提供了模板工程,开发者可以在此工程的基础上定制FSBL。FSBL程序流程如图7所示。本设计采用SD启动模式,将所有的程序下载至SD卡中。在XSDK中创建FSBL模板工程,编写相应程序,由XSDK编译生成可执行文件fsbl.elf。

图7 FSBL程序流程

3.3 制作Linux镜像

一个完整的Linux系统由bootloader、设备树、内核以及文件系统组成。相关介绍如表1所列。

表1 Linux组成部分

上述目标文件生成后,利用PetaLinux进行打包。PetaLinux是Xilinx公司推出的专门为含Xilinx FPGA器件的嵌入式系统定制Linux操作系统的开发工具。其人机交互主要以命令行的方式,能够快速地帮助开发者构建Linux镜像。在Ubuntu 16.04中安装PetaLinux组件后,可以直接通过petalinux-package- -boot命令实现打包生成镜像。该命令的主要参数如下:

- -fsbl FSBL:指定FSBL文件

- -fpga BITSTREAM:指定Bitstream文件

- -u-bootUBOOT-IMG:指定u-boot镜像文件

- -kernel KERNEL-IMG:指定Linux内核镜像文件

- -output OUTPUTFILE:指定输出文件

图8 SDHC卡分区

因而本设计使用如下指令生成镜像:

petalinux-package - -boot - -fsbl fsbl.elf - -fpga design_1.hdf - -u-boot u-boot.elf - -kernel image.ub - -output.

将生成的镜像文件烧写入SD卡,最终在SD卡上会形成图8所示分区。

将SD卡插入zc706开发板中,将启动模式配置为SD启动,上电后开发板将自动进入Linux系统。

4 软件设计

4.1 软件总体设计

为了发挥ARM Cortex-A处理器的性能,本设计在软件上采取了多线程设计,将数据按流式处理方式分成了获取、处理和可视化显示三个阶段,每个阶段设计了单独的线程,使得这三个阶段的任务可以在软件中并发执行,缩短了时延,提高了效率。三个线程的任务分配如表2所列。

表2 线程任务分配

线程之间通过带有读写锁的共享缓存传递数据,使得各线程在读写数据时不产生冲突。通过Qt的信号/槽机制传递控制参数。图9表明了软件中各线程在程序处理流程中的位置和作用。

图9 软件流程

数据处理阶段的主要处理算法是FFT,同时还会计算信号的平均功率、方差、估算噪底、搜索极值、将时、频域的数据写入disp_buffer之后,由main_thread线程将数据展现给用户。

4.2 使用NEON和VFP优化数据处理

ARM硬件加速的基础是ARMv7架构中的两大应用扩展——NEON和VFP(Vector Floating-Point)。NEON是ARMv7中一个重要的协处理器,它允许开发者使用SIMD(Single Instruction,Multiple Data)操作,即多组数据并行操作。NEON拥有16个128位寄存器(又可视为32个64位寄存器),并有专门的指令集,可以对大量的操作数进行向量化的操作,如果向量加法。VFP是与NEON紧密相连的又一重要的协处理器,它是传统FPU(浮点运算单元)的提升,它除了提供浮点数的基本运算(加、减、乘、除、开方、比较、取反)之外,还具有向量化的功能,即同时支持8组单精度和4组双精度的浮点数运算。为了能在算法程序中使用NEON和VFP,必须在编写算法程序的基础上完成两方面的工作。

(1)使用ARMC语言扩展类型

在程序中添加头文件,该头文件将NEON中的寄存器映射成了数据类型,如int8x8_t、int16x4_t、float32x2_t等类型对应了64位寄存器,int8x16_t、float16x8_t、float32x4_t等类型对应了128位寄存器。同时还定义了很多复合类型和访问NEON引擎的操作,在算法程序编写中应该尽可能地将数据对应到相应类型中。

(2)设置GCC编译选项

在编译使用了NEON和VFP的源文件时,应当添加如表3所列的编译选项,以产生NEON和VFP指令。

表3 GCC生成NEON指令的配置选项

本文以一个4 096点的基2-FFT程序作为硬件加速的测试。测试结果如表4所列。

表4 硬件加速测试

可见使用了NEON和VFP,数据处理的时间得以大幅缩短。

4.3 数据可视化

为了便于使用者观察数据,本文基于Qt扩展组件Qwt设计了用户界面,如图12所示。main_thread线程设置每个0.2 s读取一次缓存中的数据,故两个坐标图的刷新速率是5 Hz。用户通过图形界面将设定的参数传入main_thread线程,main_thread将用户配置参数打包成信号发射到processing_thread线程的接收槽中,然后processing_thread线程根据参数调整数据处理过程,并通过调用AD9361 API,完成配置。

5 测 试

完成硬件设计后,Vivado将会生成FPGA资源使用情况报告,如图10所示。可见Zynq-7000完成可以胜任无线电信号采集监测系统的设计。

图10 FPGA使用情况报告

测试平台采用Xilinx zc706评估板,采集前为ADI FMCOMMS3无线收发板卡,如图11所示,测试分为单一频段测试和全频段扫频测试。

图11 采集系统板卡

5.1 单一频点测试

测试方法:由射频信号发生器在该系统附近发送2 880 MHz单频信号,在控制面板的“频道”下拉框中选择2.90 GHz,“显示”下拉框选择“功率谱”,单位为“dB”。则系统将会监测2.85~2.95 GHz范围内的时频数据。显示结果如图12所示。可以观察到频谱中显示了两个峰值,分别处于2 880 MHz和2 920 MHz,其中2 920 MHz信号是镜频泄漏。

图12 用户界面

5.2 扫频测试

测试方法:在控制面板上设置“起始频率”为500 MHz,终止频率为3 000 MHz,则系统将以每次50 MHz带宽的速度扫描指定频率范围。最终生成如图13所示的频谱,其RBW为200 kHz。从频谱中可以观察到通信频段1 900 M的状态,证明了系统的可行性。

结 语

图13 扫频结果

[1] 高亚栋,范梦兰,谭晓波,等.基于虚拟仪器技术的频谱监测与分析系统的实现[J].无线通信技术,2014,23(1):14-18,23.

[2] 董渊,王生原,陈嘉,等.嵌入式CPU软硬件协同开发中的操作系统设计[J].清华大学学报:自然科学版,2005(7):973-976.

[3] 郭星煌.基于AD9361的便携式无线电信号监测采集系统设计[J].科技创新与应用,2016(11):7-8.

[4] 冯莉.一款基于嵌入式的频谱监测软件设计及实现[J].数字通信世界,2017(7):5,18.

[5] 周鸿顺.我国无线电监测工作的现状与发展[J].邮电设计技术,2002(8):9-15.

[6] Implementation of baseband transmitter design based on QPSK modulation on Zynq-7000 all-programmable System-on-Chip[C]//2017 International Symposium on Electronics and Smart Devices (ISESD), Yogyakarta, Indonesia, 2017:138-143.

[7] Tongxiang Shi, Wenbin Guo, Lishan Yang ,et al.Remote wideband data acquiring system based on ZC706 and AD9361[C]//2015 IEEE International Wireless Symposium (IWS 2015), Shenzhen, 2015: 1-4.

徐剑韬(硕士研究生),主要研究方向为电子对抗;石荣(研究员),主要研究方向为电子对抗。

猜你喜欢
线程寄存器程序
Lite寄存器模型的设计与实现
基于国产化环境的线程池模型研究与实现
试论我国未决羁押程序的立法完善
“程序猿”的生活什么样
分簇结构向量寄存器分配策略研究*
英国与欧盟正式启动“离婚”程序程序
浅谈linux多线程协作
创卫暗访程序有待改进
线程池技术在B/S网络管理软件架构中的应用
高速数模转换器AD9779/AD9788的应用