字警告,建议收藏后食用。
目录
一、AD9361概述
1.1 AD9361芯片结构
1.2 ad 9361的性能特性
1.3 AD-FMCOMMS2-EBZ性能特征
二、Zynq-7000概述
2.1 zynq的芯片结构
2.2 ZC 702的介绍和结构
Iii .AD9361和ZC702之间的数据路径
四.AD9361参考设计描述
4.1知识产权核心的概念
4.2硬件设计
动词 AD9361参考设计描述
5.1 ad 9361无操作系统软件概述
5.2 ad 9361无操作系统软件顶层目录描述
主. c文件
5.4 dac_init功能
5.5 adc _捕获功能
一、AD9361概述
1.1 AD9361芯片结构
AD9361是一款高性能、高度集成的敏捷收发器,适用于3G和4G基站应用。该芯片采用零中频架构,将整个射频和中频信号电路集成到一个芯片中,包括射频放大器的射频2x2收发器、模拟滤波器、混频器、解调器、12位模数转换器和数模转换器,还集成了收发器通道的频率合成器,并为每个接收子系统集成了独立的自动增益控制、DC偏移校正、正交校正和数字滤波电路。消除了在数字基带中提供这些功能的必要性。每个通道配有两个高动态范围ADC。首先,接收的输入和输出信号被数字化,然后传输到可配置的抽取滤波器和抽头有限脉冲响应滤波器,以相应的采样率产生12个输出信号。
图3 Zynq简单结构模型
Zynq最简单的结构模型只有PS和PL两部分,通过AXI接口相互通信。这样,ZynqSOC不仅可以单独使用ARM设计嵌入式系统,还可以使用FPGA设计各种时序和逻辑。最重要的是利用这两者来设计更灵活的系统。微信官方账号:OpenFPGA
值得注意的是,Zynq的处理系统不仅包含ARM处理器,还包含应用处理单元和外设接口、缓冲区、内存接口和时钟电路;Zynq可以单独使用PS部分,但不能单独使用PL部分。如果要使用PL部分,必须从PS端开始,通过PS配置PL。
图4是Zynq更详细的结构图,上部为PS侧结构,其中绿色部分为APU;下半部分为PL侧结构。
图4 Zynq结构模型
2.2 ZC 702的介绍和结构
Xilinx ZC702是一款评估板,为Zynq SoC的开发和评估提供了硬件环境。ZC702和一些嵌入式处理系统有共同的特点,包括DDR3内存、三模以太网、通用I/O和两个URAT接口。此外,ZC702还支持FMC。以ZC702为平台连接AD-FMCOMMS2-EBZ板,可产生待发送信号,并对采集的信号进行处理。图5示出了ZC702的外观结构,图6示出了ZC702的简化帧结构
图5 ZC 702的外观结构
图6 ZC 702结构框图
Iii .AD9361和ZC702之间的数据路径
ADI公司提供基于ZC702的软硬件设计,作为AD9361与Zynq连接使用的基础。根据其提供的硬件设计,AD9361和ZC702之间的数据路径如下所示:
图ad9361和ZC702之间的数据路径
右边是AD9361部分,左边是ZC702部分;它们通过FMC接口传输数据。ZC702中的蓝色区域是zynq的PL部分,命名为AD9361Core;上部为ARM部分,其余为接口部分,在PS和PL以及AD9361之间建立数据通道。
ADI还提供了配置AD9361参数的代码和一些数据传输和接收的API。
用DDR传输数据的传输方式是DMA传输方式:在DMAC的操作下,数据直接从源地址传输到目的地址,不需要CPU的介入,可以大大提高CPU的效率。
注意:如果用PL端生成用户数据,而用PS端直接生成和发送数据,那么用户数据应该用DMA传输和DDR。
在PFGA,无论是DDS产生的信号数据,还是从AD9361接收的信号数据,都需要经过IQ调制解调,再通过DMA传输到DDR进行存储,方便ARM读取和处理数据。
以上数据路径是通过硬件设计实现的。如果您真的想配置和使用AD9361,您需要使用运行在ARM上的软件。
四.AD9361参考设计描述
4.1知识产权核心的概念
IP内核模块是预先设计甚至验证的具有一定功能的集成电路、器件或组件。它有几种不同的形式。IP内核模块有行为、结构、物理三个层次的设计,对应三个层次:“软IP内核”主要描述功能行为,“固定IP内核”完成结构描述,“硬IP内核”基于物理描述,经过流程验证。这相当于集成电路的毛坯、半成品、成品的设计技术。
软核是用VHDL等硬件描述语言描述的功能块,但不涉及任何具体的电路元件来实现这些功能。软IP通常出现在硬件描述语言HDL源文件的情况下,应用开发过程与普通HDL设计非常相似,但所需的软硬件开发环境相对昂贵。软IP设计周期短,设计投入少。因为不涉及物理实现,后续设计空的空间很大,增加了IP的灵活性和适应性。其主要缺点是后续工艺在一定程度上无法适应整体设计,需要一定程度的软IP修正,在性能上无法获得全面优化。
因此,AD9361参考设计中给出的IP核都是软IP核
4.2硬件设计
打开Vivado,在… HDL-HDL _ 2014 _ R2 project fmcomms 2 ZC 702的路径中打开AD9361的Vivado工程文件fmcomms2_zc702.xpr。
单击右侧导航栏中的IPIntegrator打开块设计
打开ADI公司给出的AD9361参考设计IP核框图,每个蓝色方块都是硬件部分的IP核,如图8所示,是AD9361Core和DMA控制器部分。
每个IP核的源Verilog HDL代码都在HDL-HDL _ 2014 _ R2 库中,这些设计就是图7左半部分的设计
图8 ad 9361参考设计的IP内核框图
动词 AD9361参考设计描述
5.1 ad 9361无操作系统软件概述
AD9361无操作系统软件是ADI公司提供的AD9361的软件部分,运行在CPU中。这个程序是一个裸机程序,可以配置AD9361的各种参数,读写PL中的一些寄存器,控制发送数据源,控制DMAC传输发送和接收的数据,从而实现AD9361的基本功能:接收、处理和发送数据。整个程序使用C语言完成。
5.2 ad 9361无操作系统软件顶层目录描述
no-OS-Software的源代码可以从ADI官网下载,下载的源代码中包含了很多ADI收发器。表1列出了AD9361非操作系统软件中文件和文件夹的目录结构
表1 1ad 9361无操作系统软件源代码的目录结构
主. c文件
main.c文件是主函数所在的文件,是整个程序的入口。
main.c文件以需要条件编译的头文件和宏定义开始。
/*****************************************************************************
包括文件* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 9
#包括“config.h”
#包括“ad9361_api.h”
#包括“参数. h”
#包括“platform.h”
#ifdefCONSOLE_COMMANDS
#包括“command.h”
#包括“console.h”
#endif
#ifdefXILINX_PLATFORM
# includexil _ cache.h >
#endif
# ifdefined Xilinx _ PLATFORM | | defined linx _ PLATFORM
#包括“adc_core.h”
#包括“dac_core.h”
#包括“adc_interrupt.h”
#包含“SD_card.h”
#endif
因此,有些参数需要在程序开始时根据情况进行宏定义,
要使用ZC702,您需要添加语句:
#定义XILINX_PLATFORM
要使用命令行控制AD9361,您需要添加一条语句:
#定义CONSOLE_COMMANDS
要使用ADC的数据捕捉功能,需要添加一条语句:
#defineCAPTURE_SCRIPT
然后,给出了命令行函数使用的一些变量的定义,AD9361初始化所需参数的变量定义,以及AD9361接收机和发射机滤波器的定义。
AD9361_InitParam默认_ init _ param = {
/*识别号*/
,//id _ no;
/*参考时钟*/
/*基本配置*/
,//two _ rx _ two _ tx _ mode _ enable * * * ADI,2rx-2tx-mode-enable
1,//one _ rx _ one _ tx _ mode _ use _ rx _ num * * * ADI,1rx-1tx-mode-use-rx-num
1,//one _ rx _ one _ tx _ mode _ use _ tx _ num * * * ADI,1rx-1tx-mode-use-tx-num
1,//频分双工模式使能*** adi公司,频分双工模式使能
,//频分双工独立模式使能*** adi公司,频分双工独立模式使能
,//TDD _ use _ dual _ synth _ mode _ enable * * * ADI,tdd-use-dual-synth-mode-enable
,//TDD _ skip _ VCO _ cal _ enable * * * ADI,tdd-skip-vco-cal-enable
,//tx_fastlock_delay_ns *** adi,tx-fastlock-delay-ns
,//rx_fastlock_delay_ns *** adi,rx-fastlock-delay-ns
,//rx _ fast lock _ pincontrol _ enable * * * ADI,rx-fastlock-pincontrol-enable
,//tx _ fast lock _ pincontrol _ enable * * * ADI,tx-fastlock-pincontrol-enable
,//外部_ rx _ lo _使能*** adi公司,外部-rx-lo-使能
,//外部tx lo使能*** adi公司,外部tx lo使能
5,//DC _ offset _ tracking _ update _ event _ mask * * * ADI,DC-offset-tracking-update-event-mask
6,//直流偏移衰减高量程*** adi公司,直流偏移衰减高量程
以下部分是整个软件部分的主要功能,主要功能的程序流程图如图6所示:
图9最小功能流程图
用于初始化数模转换器模块的函数是数模转换器初始化函数
用于ADC数据捕捉的功能是adc_capture功能
这两个功能是控制数据传输的主要功能,这将在后面的章节中详细描述。
5.4 dac_init功能
Dac_init是Dac模块的初始化功能,也负责DMA传输,将DDR中的数据发送给AD9361。
dac_init函数的函数声明为:
第一个参数结构AD9361_rf_phy *phy是一个指向AD9361的射频设备结构的指针。
第二个参数uint8_t data_sel是要发送的数据源的选择:
enumdds_data_select
{
数据选择,
数据选择系统,
数据选择码分多址,
DATA_SEL_ZERO,/* OUTPUT 0 */
数据_选择_PN7,
数据_选择_PN15,
数据_选择_PN23,
数据_选择_PN31,
DATA_SEL_LB,/*环回数据*/
DATA_SEL_PNXX,/* */
用户数据,
};
0表示发送DDS产生的信号;
2表示通过DMA在DDR中发送信号数据,定义在dac_core.c开头;
3表示发送所有0信号;
4-7表示发送随机数信号;
8表示发送从模数转换器接收的数据信号;
9表示发送所选设备的信号;
10是用户数据
第三个参数是DMA设置的标准位,0表示设置;1表示没有设置。
DMA传输支持二维传输,但目前只需要一维传输,所以在源代码中写入AXI_DMAC_REG_SRC_ADDRESS和AXI_DMAC_REG_Y_LENGTH就意味着只使用一维传输。
传输用户数据时,调制用户数据后,参考上述代码,通过DMA发送数据
5.5 adc _捕获功能
adc_capture函数是一个数据捕获函数,也负责数据到DDR的DMA传输
adc_init函数的函数声明为:
第一个参数大小是要捕获的数据量;
第二个参数是start _ adress,用于存储捕获数据的目的地址。
图9是dac_init函数的流程图:
图12 adc_captur功能流程图
源代码如下:
int32_t adc_capture
{
uint32 _ t reg _ val
如果
{
长度=;
}
其他
{
长度=;
}
上图中的源代码是adc_capture函数的第一部分——数据单元转换部分。adc_capture函数的第一个参数大小是用户想要捕获的数据量,单位是“片”。但是在DMAC的很多寄存器中,比如AXI_DMAC_REG_X_LENGTH寄存器,值是传输数据的总字节数,单位是“字节”,所以需要设置,如果双通道开启,捕获的数据会占用两倍的存储空。
adc _ dma _ write//初始化DMA通道
adc _ dma _ write//DMA通道已启用
adc _ dma _ write//取消屏蔽。
//ADC _ DMA _ read;//读取下一次传输的身份证号
adc _ dma _ read/*读取中断状态:传输完成后,END_OF_TRANSFER设置为1。
当传输加入队列时,START_OF_TRANSFER设置为1 */
adc _ dma _ write//写入中断状态寄存器以初始化中断寄存器
adc _ dma _ write//设置目标地址中一行开始和下一行之间的字节数
adc _ dma _ write//传输的字节数
adc _ dma _ write//传输的行数
adc _ dma _ write//设置传输的目的地址
adc _ dma _ write//加入传输队列
上图显示了——DMA配置部分,即adc_capture功能的第二部分,其中与adc模块相比的不同寄存器有:
AXI_DMAC_REG_IRQ_MASK:中断屏蔽寄存器,位EOTIRQ,位SOT IRQ,该位置1,表示该位的中断请求被屏蔽;
AXI_DMAC_REG_IRQ_PENDING:读中断状态:传输完成后,END_OF_TRANSFER设置为1,传输加入队列后,START_OF_TRANSFER设置为1 *。
AXI:这个寄存器的值是下一次传输的标识号。
//等到新传输排队。
做
{
adc _ dma _ read
}
一边;*/
//等到当前传输完成。
做
{
adc _ dma _ read
}
一边;//reg_val!=0011b*/
//等到ID为transfer_id的转账完成。
做
{
adc _ dma _ read//读取传输完成的ID号
}
while((reg_val&(1
上图为adc_capture功能的第三部分——判断和等待
1.等待直到新的传输加入传输队列
读取AXI寄存器的值。如果值为1,它将循环,如果值为0,它将跳出循环。
1之前已被写入AXI_DMAC_REG_START_TRANSFER。此时,判断AXI_DMAC_REG_START_TRANSFER的值。如果为1,则表示新的传输仍在排队;如果为0,则表示新的传输已经开始。
2.等到当前传输完成。
读取AXI的值。传输进行时,AXI_DMAC_REG_IRQ_PENDING的位SOT始终为1。传输完成后,EOT位从0设置为1,然后这两个位都清零。因此,当AXI_DMAC_REG_IRQ_PENDING的值为3时,表示传输完成。
3.等待,直到ID为transfer_id的传输完成
这一步是为了验证之前设置的传输是否已经完成。
版权属于作者