孙国萃 杜军 冯祥虎 肖世伟 杨美娜
摘 要:针对传统平台传输信号慢、开发过程复杂的特点,对信号的传输采集系统做了相关研究,设计了一种基于ZYNQ-7000和AD(AD9226)架构的嵌入式数据采集的实现方案,以ZYNQ-7000为数字信号处理平台,搭配AD转换芯片,在Linux操作系统下利用AXI-DMA方式实现信号的高速采集。该设计数据传输速率快,开发前景好,且具有小型化、高集成度的特点,为后续进一步的数据处理提供了前提。
关键词:ZYNQ-7000;Linux操作系统;AD转换;AXI-DMA传输
中图分类号:TN919.5 文献标识码:A文章编号:2096-4706(2022)04-0085-04
Design and Implementation of Data Acquisition System Based on ZYNQ7000 Linux
SUN Guocui, DU Jun, FENG Xianghu, XIAO Shiwei, YANG Meina
(School of Computer Science and Information Engineering, Harbin Normal University, Harbin 150025, China)
Abstract: In view of the characteristics of slow signal transmission and complex development process of traditional platform, the signal transmission and acquisition system is studied, and an implementation scheme of embedded data acquisition based on ZYNQ-7000 and AD (AD9226) architecture is designed. Taking ZYNQ-7000 as the digital signal processing platform, combined with AD conversion chip, the high-speed signal acquisition is realized in AXI-DMA ways under Linux operating system. The design has the characteristics of fast data transmission rate, good development prospect, miniaturization and high integration, which provides a premise for further data processing.
Keywords: ZYNQ-7000; Linux operating system; AD conversion; AXI-DMA transmission
0 引 言
数据的发射采集和处理在通信工程领域中起到至关重要的作用,随著科学技术的发展,传统的硬件平台已经无法适应多频段、多模式的信号处理。软件无线电技术的出现使对信号的灵活处理成为现实,软件无线电技术是一种基于软件定义的无线电广播通信技术,除了最基本的射频收发器、放大器和频器以外,信号的处理部分基本都由软件进行实现。这样,不仅提高了系统的灵活性,还节约了时间成本。而Linux操作系统具有超强的灵活性,用户可以根据自己的需求去剪裁定制系统。Linux能有效利用系统资源,可在特定的硬件要求下进行安装,安装过程灵活,能够更充分的利用硬件资源。
该设计采用ZYNQ-7000系列ZYBO板作为载波板,搭配AD9226芯片,结合Linux操作系统设计并实现一种高速AD数据采集系统。
1 硬件模块设计方案
1.1 ZYNQ-7000芯片
ZYNQ-7000芯片包含一个基于双核ARM Cortex-A9的处理子系统(PS)和可编程逻辑(PL)[1]。设计思路采用以ARM处理器为核心,以可编程逻辑电路作为扩展。用户可在ARM核中移植操作系统并开发相应的应用程序,并通过控制程序对硬件资源进行控制。PS除了核心外还包括片上存储器、外部存储器接口以及大量外设连接接口。ARM与FPGA之间的数据交互使用AXI总线,满足实时控制和高速数据交互的需求。该设计应用的开发板是由Digilent开发的低成本ZYNQ开发板ZYBO,硬件资源包括一个Xilinx XC7Z010-CLG400芯片,两片Micron的512 MB bytes的MT41J128M16JT-125 DDR3内存,10/100/1 000M自适应以太网、USBOTG、USB转ART调试串口、micro SD卡和用以开发板扩展的Digilent Pmod接口连接器[2]。
总硬件设计如图1所示。
1.2 模数转换芯片AD9226
AD9226是一款12位、单芯片、单电源供电、65MSPS模数转换器,且具有475 MW功耗和70 dB的信躁比[3]。AD9226通过AXI总线与ARM板处理器进行数据通信,采用AXI-DMA方式对收集到的数字信号传输给内存,处理器再将内存中的数据读取并显示出来。
1.3 AXI4总线介绍
ZYNQ7000的性能不仅依赖于PS和PL两大部分,系统的整体性非常重要,AXI总线负责维系PS与PL两端之间的通信。AXI是一种总线协议,是面向高性能、高带宽、低延迟的片内总线。AXI4总线有AXI4、AXI4-Lite、AXI-Stream三种总线类型[4],本次主要用到的是AXI-Stream总线,它支持面向高速数据流的传输,去掉了地址项,允许无限制的数据突发传输规模,减少了延时。
比较重要的信号线有:(1)Aclk为时钟线,所有信号都在Aclk上升沿被采集。(2)ARESETn为复位线,低电平有效。(3)TVALID为主机数据同步线,为高表示主机准备好发送数据;TREADY为从机数据同步线,为高表示从机准备好接收数据。这两根线完成了主机与从机的握手信号,一旦二者都变高有效,数据传输开始。(4)TDATA为数据线,主机发送,从机接收。(5)TKEEP为主机数据有效指示,为高代表对应的字节为有效字节,否则表示发送的为空字节。(6)TLAST为主机最后一个字指示,下一clk数据将无效,TVALID将变低。
AXI-Stream只能在PL中实现,不能直接和PS相连,必须通过AXI-Lite或AXI4转接。AXI-DMA由Xilinx公司提供,负责从AXI到AXI-Stream的转换。
1.4 AXI-DMA介绍
AXI DMA IP核相比于AXI内存映射,它提供了更高带宽的直接内存访问通道。该IP核在PL中使用,在PL中添加AXI DMA IP core,并利用AXI_HP接口完成高速的数据传输,当PL的外设和存储器之间需要高速传输时,就可以选择AXI DMA这种简单DMA模式。在简单DMA模式下,通过配置相应的DMA控制寄存器进行数据传输,如果数据传输完成,DMA控制器发出中断信号。这种简单的DMA数据传输方式,占用了较少的FPGA资源,节省硬件的开销。DMA工作流程如图2所示。
1.5 硬件工程模块设计
在Vivado工程中主要添加了ZYNQ-7000的IP核、AXI-DMA IP核和AD9226采集IP核,AXI-DMA IP核负责通过AXI接口从AD9226采集IP核中搬运数据,然后将数据流到内存映射(S2MM)从机到AXI4写主机,S2MM通道提供了一个AXI Status流,用于从目标IP接收用户应用程序数据。其中adc_data[11:0]用于接收AD芯片转换来的12位数字信号。
AXI-DMA IP核与数据采集IP核如图3、图4所示。
2 系统软件方案
2.1嵌入式Linux移植和开发
嵌入式Linux系统移植主要由四大部分组成:
(1)搭建交叉开发环境。
(2)Bootloader的选择和移植。
(3)Kernel的配置、编译、和移植。
(4)根文件的制作。
首先需要在Vivado中完成PS的相关配置和针对特定应用的PL开发,经过Vivado的编译、综合与实现、分配引脚,最后生成比特流,将比特流文件导入到SDK软件中,SDK利用硬件配置文件实现FSBL文件的创建,生成FSBL.elf文件,然后编译U-boot、Linux内核并生成u-boot.elf和uImage文件,将FSBL.elf、比特流文件、u-boot.elf文件结合生成Boot.bin文件。利用SDK生成设备树文件,再将设备树放在Linux环境下编译生成二进制文件。最后将Boot.bin、设备树、内核镜像、根文件一起放入SD卡FAT分区,最后将SD卡放入开发板的卡槽中启动开发板。
系统上电后自动执行片内Boot ROM中的代码,BootRom会初始化CPU和一些外设,并根据外部启动MIO引脚配置,在Bin文件中找到FSBL的位置,找到后拷贝到内存中。FSBL根据硬件配置bit文件初始化PS部分,配置PL逻辑部分,并加载U-boot作为Linux内核的Bootloader程序,初始化CPU及外设,拷贝Linux内核映像到RAM中,再通过设备树文件将硬件相关信息传递给Linux内核,最后由Linux系统加载文件完成启动,根据特定需求运行相关驱动及应用程序。
2.2 驱动程序和应用程序的开发
驱动程序是一种让计算机和设备通信的特殊程序,相当于硬件的接口,操作系统只有通过这个接口,才能控制硬件设备的工作。Linux中有三大类驱动:字符设备驱动、块设备驱动和网络设备驱动[5]。本次用到的AD9226属于字符驅动。Linux驱动有两种运行方式,第一种就是将驱动编译进Linux内核中,这样当Linux内核启动的时候就会自动运行驱动程序。第二种就是将驱动编译成模块,在Linux内核启动以后使“insmod”命令加载驱动模块在调试驱动的时候一般都选择将其编译为模块,这样修改驱动以后只需要编译一下驱动代码即可,不需要编译整个Linux代码。
2.2.1 AD转换驱动程序的部分函数
初始化DMA
memset(axi_adc_dev[dev_index], 0, sizeof(struct axi_adc_dev));//给设备的内存空间全部设置为0。
axi_adc_dev[dev_index]->rx_chan = dma_request_slave_channel(&pdev->dev, “axidma1”);//申请DMA通道。
axi_adc_dev[dev_index]->adc_virtaddr = of_iomap(node, 0);通过设备树的设备结点直接进行设备内存区间的 映射
DMA传输
dma_async_issue_pending(axi_adc_dev[minor]->rx_chan);//开始DMA传输
writel(axi_adc_dev[minor]->adc_sample_num,axi_adc_dev[minor]->adc_virtaddr+4);//对 IP核的寄存器基址向后偏移4的位置写入了需要采集的ADC数据个数。
writel(1,axi_adc_dev[minor]->adc_virtaddr);//对寄存器基地址写1,开始数据传输
DMA传输结束
iounmap(axi_adc_dev[dev_index]->adc_virtaddr);//取消映射的虚拟地址空间首地址
dma_release_channel(axi_adc_dev[dev_index]->rx_chan);//释放dma通道
kfree(axi_adc_dev[dev_index]);//释放内存
2.2.2 应用程序的部分函数
初始化axidma设备
DEV = axidma_init();
AN926RegBase=mmap(NULL,4096,PROT_READ|PROT_WRITE,MAP_SHARED,AN926FileDev,AN926_REGBASE);//将AD9226采集IP核寄存器基地址映射到内存上。
数据传输
axidma_oneway_transfer(Dev,g_apRxChannels->data[0],AN926DataBuf,AN926_SAMPLENUM*2,false);//將数据传递给Buf
printf(“%x “,*((unsigned short*)(an926DataBuf)+i));//将Buf中的每个数据进行打印
结束传输并关闭设备
axidma_stop_transfer(Dev,RxChannels->data[0]);//结束传输
close(AN926FileDev);//关闭文件
驱动的加载和文件的运行
将AD9226的驱动模块进行加载,在终端输入insmod axi_adc_dma.ko,输入mknod/dev axi_adc_dma c 200 0即可创建字符设备的节点。加载完驱动后的终端输出结果,如图5所示。
然后执行命令./axi_app/dev/axi_adc_dma即可。
实验结果如图6所示。
3 结 论
带有axi_dma驱动的AD数据采集系统能传输高速数据流,相较于传统数据采集系统来讲,传输效率更高,占用资源更少。移植过Linux操作系统的arm嵌入式开发板更为后续的相关应用开发提供了可能,对硬件的操作方式也更加的方便和灵活。可广泛应用于实现数据采集功能的掌上设备及其他嵌入式的系统,如医疗仪器、通信设备等领域。
参考文献:
[1] 赵莉,李司.基于ZYNQ和AD9361的软件无线电平台设计与实现 [J].移动通信,2018,42(12):63-67+73.
[2] 高寒.基于ZYBO开发平台的智慧环保监测及数据采集系统设计 [J].电子设计工程,2018,26(5):174-178+183.
[3] 张晨亮,苏学军,王成刚,等.基于AD9226的数据采集板设计与实现 [J].实验技术与管理,2017,34(S1):63-65+69.
[4] 庄琼.基于AXI总线的DMA高速通道及驱动的设计与实现 [D].成都,电子科技大学,2020.
[5]段月骁,郭斌,胡晓峰,等.嵌入式Linux下ADS1256驱动程序的设计与实现 [J].化工自动化及仪表,2015,42(12):1381-1385.
作者简介:孙国萃(1997—),女,汉族,山东德州人,研究生在读,研究方向:嵌入式技术。