FPGA实现AD9361数据接口逻辑

news/2025/1/15 12:44:45/

在这里插入图片描述


作者:ShownSun
工作室:时沿科技


文章目录

  • FPGA实现AD9361数据接口逻辑
    • 1 引言
    • 2 AD9361
      • 2.1 芯片简介
      • 2.2 参数配置
      • 2.3 引脚
      • 2.4 接口时序
    • 3 参考代码
      • 3.1 SelectIO配置
      • 3.2 数据解析

FPGA实现AD9361数据接口逻辑

1 引言

  本文通过以高速AD9361芯片为例进行数据接口逻辑代码的编写,利用SelectIO IP快速高效完成芯片驱动的生成。关于SelectIO IP的使用,可以参考Xilinx SelectIO IP使用说明(一)。

2 AD9361

2.1 芯片简介

  AD9361是一款面向3G和4G基站应用的高性能、高集成度的射频(RF)Agile Transceiver™捷变收发器。该器件的可编程性和宽带能力使其成为多种收发器应用的理想选择。该器件集RF前端与灵活的混合信号基带部分为一体,集成频率合成器,为处理器提供可配置数字接口,从而简化设计导入。AD9361接收器LO工作频率范围为70 MHz至6.0 GHz,发射器LO工作频率范围为47 MHz至6.0 GHz,涵盖大部分特许执照和免执照频段,支持的通道带宽范围为200 kHz以下至56 MHz,整体结构图如图 1 AD9361整体结构图所示。

图 1 AD9361整体结构图

图 1 AD9361整体结构图
•	集成12位DAC和ADC的RF 2 × 2收发器
•	TX频段:47 MHz至6.0 GHz
•	RX频段:70 MHz至6.0 GHz
•	支持TDD和FDD操作
•	可调谐通道带宽:<200 kHz至56 MHz
•	双通道接收器:6路差分或12路单端输入
•	出色的接收器灵敏度,噪声系数为2 dB (800 MHz LO)
•	RX增益控制o	实时监控和控制信号用于手动增益o	独立的自动增益控制
•	双发射器:4路差分输出
•	高线性度宽带发射器o	TX EVM:≤−40 dBo	TX噪声:≤−157 dBm/Hz本底噪声o	TX监控器:动态范围≥66 dB,精度=1 dB
•	集成式小数N分频频率合成器
•	2.4 Hz最大本振(LO)步长
•	多器件同步
•	CMOS/LVDS数字接口

2.2 参数配置

  用户可以根据自己的需求将数据接口通过SPI配置成LVDS或CMOS接口,也可以还可以选择FDD或TDD工作方式,以及数据速率可以选择SDR或DDR。只需要通过配置软件设置即可,如图 2 AD9361数据接口配置参数所示,详细的配置教程见AD936x Evaluation Software 详细配置。

图 2 AD9361数据接口配置参数

图 2 AD9361数据接口配置参数

  在进行数据验证时,也可以使用测试模式,对收发数据进行验证以保证系统的正确性。另外,还可以对输入时钟进行延时调节或者通过SelectIO的delay、delayctrl功能对时钟信号进行微调,以满足时序要求。芯片数据时钟与数据之间的时序可靠性也可以通过芯片内部的延时寄存器0x006、0x007进行条件,以此达到要求,具体的SPI配置寄存器时序如图 3 AD9361 寄存器配置接口SPI时序所示。此方面不是本文重点,不做展开,更多内容参考官方data sheet。

图 3 AD9361 寄存器配置接口SPI时序

图 3 AD9361 寄存器配置接口SPI时序

  本小节使用的数据接口参数:LVDS、FDD、DDR,对应的时序逻辑也是根据该参数进行设计。

2.3 引脚

RX数据时序接口如下:




TX数据时序接口如下:




2.4 接口时序

  以下使用的数据接口参数:LVDS、FDD、DDR,根据不同的通道数可以得到不同的数据时序,用户在解析数据时只要按照对应的结构进行拼接即可。

图 4 AD9361接收数据路径

图 4 AD9361接收数据路径

图 5 AD9361发射接口路径

图 5 AD9361发射接口路径

3 参考代码

3.1 SelectIO配置

  根据以上对AD9361的了解,就可以轻松的配置SelectIO IP的GUI界面了。芯片既包括发射模块TX又包括接收模块RX,所以IO类型选择chip to chip。

图 6 SelectIO配置界面1

图 6 SelectIO配置界面1

  根据上述参数配置部分,自然就选择DDR。数据接口包括时钟CLK、Frame对齐信号与差分数据端Data[05:0],要同时对Frame与Data信号进行时序解析,所以端口宽度设置为7.

图 7 SelectIO配置界面2

图 7 SelectIO配置界面2

  由于芯片内部寄存器0x006、0x007可以确保时钟与数据满足时序要求,所以不需要延时模块,以节约FPGA逻辑资源。

图 8 SelectIO配置界面3

图 8 SelectIO配置界面3

图 9 SelectIO配置界面4

图 9 SelectIO配置界面4

3.2 数据解析

//-------------------------------------------------------------------
// 用于将接收时钟与数据进行单端与差分的变换
//-------------------------------------------------------------------selectio_ip u_selectio_ip (// From the system into the device.DATA_IN_FROM_PINS_P	(ad_rx_data_in_p), 	//从AD接收端接收到的单端数据与标志.DATA_IN_FROM_PINS_N	(ad_rx_data_in_n), 	//从AD接收端接收到的单端数据与标志.DATA_IN_TO_DEVICE		(ad_rx_data), 	//将AD接收端接收到的数据与标志转换为单端数据// From the device out to the system.DATA_OUT_FROM_DEVICE	(ad_tx_data), 	//将要发送的DA数据与标志转换为单端数据.DATA_OUT_TO_PINS_P		(ad_tx_data_out_p), 	//发送端的单端DA数据与标志.DATA_OUT_TO_PINS_N		(ad_tx_data_out_n),	//发送端的单端DA数据与标志.CLK_TO_PINS_P			(ad_fb_clk_p), 			//将AD接收端的输入时钟用于发射时钟.CLK_TO_PINS_N			(ad_fb_clk_n), 			//将AD接收端的输入时钟用于发射时钟.CLK_IN_P					(ad_data_clk_p),      //AD接收端的单端输入时钟.CLK_IN_N					(ad_data_clk_n),      //AD接收端的单端输入时钟.CLK_OUT					(ad9361_data_clk),        //将AD接收端的差分输入时钟转变为单端时钟.CLK_RESET					(reset), 				 //用于AD输入时钟的复位,高有效.IO_RESET					(reset)  				//用于单端、差分变换的复位,高有效);//-------------------------------------------------------------------
//发送数据的生成
//-------------------------------------------------------------------assign ad_tx0_msb_q=ad_tx0_data[23:18];assign ad_tx0_lsb_q=ad_tx0_data[17:12];assign ad_tx0_msb_i=ad_tx0_data[11:06];assign ad_tx0_lsb_i=ad_tx0_data[05:00];assign ad_tx1_msb_q=ad_tx1_data[23:18];assign ad_tx1_lsb_q=ad_tx1_data[17:12];assign ad_tx1_msb_i=ad_tx1_data[11:06];assign ad_tx1_lsb_i=ad_tx1_data[05:00];reg [13:0] ad_tx_data;//-------------------------------------------------------------------
//选择要发送的I与Q数据
//-------------------------------------------------------------------always @(posedge ad9361_data_clk or posedge reset) beginif(reset)ad_tx_data<=0;else if((ad_tx_frame_reg==0)&&(ad_tx_frame==1))ad_tx_data<={ad_tx_frame,ad_tx0_msb_q,ad_tx_frame,ad_tx0_msb_i};else if((ad_tx_frame_reg==1)&&(ad_tx_frame==1))ad_tx_data<={ad_tx_frame,ad_tx0_lsb_q,ad_tx_frame,ad_tx0_lsb_i};else if((ad_tx_frame_reg==1)&&(ad_tx_frame==0))ad_tx_data<={ad_tx_frame,ad_tx1_msb_q,ad_tx_frame,ad_tx1_msb_i};else if((ad_tx_frame_reg==0)&&(ad_tx_frame==0))ad_tx_data<={ad_tx_frame,ad_tx1_lsb_q,ad_tx_frame,ad_tx1_lsb_i};		end	//-------------------------------------------------------------------
//选择接收的I与Q数据
//-------------------------------------------------------------------always @(posedge ad9361_data_clk or posedge reset) beginif(reset) beginad_rx0_msb_i<=0;ad_rx0_msb_q<=0;ad_rx0_lsb_i<=0;ad_rx0_lsb_q<=0;ad_rx1_msb_i<=0;ad_rx1_msb_q<=0;ad_rx1_lsb_i<=0;ad_rx1_lsb_q<=0;			endelse if((ad_rx_frame_reg==0)&&(ad_rx_frame==1)) beginad_rx0_msb_i<=ad_rx_data[05:0];ad_rx0_msb_q<=ad_rx_data[12:7];endelse if((ad_rx_frame_reg==1)&&(ad_rx_frame==1)) beginad_rx0_lsb_i<=ad_rx_data[05:0];ad_rx0_lsb_q<=ad_rx_data[12:7];endelse if((ad_rx_frame_reg==1)&&(ad_rx_frame==0)) beginad_rx1_msb_i<=ad_rx_data[05:0];ad_rx1_msb_q<=ad_rx_data[12:7];endelse if((ad_rx_frame_reg==0)&&(ad_rx_frame==0)) beginad_rx1_lsb_i<=ad_rx_data[05:0];ad_rx1_lsb_q<=ad_rx_data[12:7];end	endwire [23:0]	 ad_rx0_fifo_data;wire [23:0]	 ad_rx1_fifo_data;assign ad_rx0_fifo_data={ad_rx0_msb_q,ad_rx0_lsb_q,ad_rx0_msb_i,ad_rx0_lsb_i};assign ad_rx1_fifo_data={ad_rx1_msb_q,ad_rx1_lsb_q,ad_rx1_msb_i,ad_rx1_lsb_i};

  代码资源获取地址:https://download.csdn.net/download/u014447324/18394119


http://www.ppmy.cn/news/186641.html

相关文章

Xilinx XC7Z020双核ARM+FPGA开发板试用合集——自定义硬件工程

本期测试板卡是一款基于Xilinx Zynq-7000系列XC7Z010/XC7Z020高性能低功耗处理器设计的异构多核SoC工业级核心板,处理器集成PS端双核ARM Cortex-A9 + PL端Artix-7架构28nm可编程逻辑资源。 下面是测试内容,欢迎查阅。 SD卡启动设置 根据《TLZ7x-EasyEVM-S评估板硬件说明书》…

STM32中CAN1_RX0_IRQn和CAN1_RX1_IRQn的使用

“如果你用的CAN引脚是PA11和PA12&#xff0c;接收中断用CAN1_RX0_IRQn。如果CAN引脚用的是PB8和PB9&#xff0c;也就是用重定义的引脚&#xff0c;接收中断用CAN1_RX1_IRQn。由于PA11和PA12也是USB的引脚&#xff0c;所以非互联型且带CAN控制器的微控制器的库文件在起名字时用…

详解机器人标定

相机固定不动, 上往下看引导机器人移动 机器人与视觉标定理论详解 相机固定不动, 上往下看引导机器人移动 1.相机非线性校正 使用标定板做非线性校正 2.相机与机器人做9点标定 可以使用机器人扎9个点&#xff0c;或者机器人抓住工件摆放9个位置&#xff0c;得到9个机械坐标…

GD32F303基于USBD库的usb custom hid 双向通讯实现

默认已经建立好需要移植的GD32F303空白工程 环境&#xff1a;keil GD库版本&#xff1a;V2.1.4 通讯工具&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1Ukuy0u52C9ufPGz9QcHONA 提取码&#xff1a;d9rf 正文开始 USBD库植步骤&#xff1a; 找到GD官网的软件…

1.ReactiveX - 什么是Rx,Rx的理念和优势

ReactiveX http://reactivex.io/intro.html Rx介绍 ReactiveX的历史 ReactiveX是Reactive Extensions的缩写&#xff0c;一般简写为Rx&#xff0c;最初是LINQ的一个扩展&#xff0c;由微软的架构师Erik Meijer领导的团队开发&#xff0c;在2012年11月开源&#xff0c;Rx是一个编…

GD32F4xx系列CAN通信收发配置

GD32F4xx系列CAN通信收发基础配置&#xff1a; 主要注意2点&#xff1a; 1、波特率的配置&#xff1a; 查找GD32F4xx的用户手册找到CAN外设对应的时钟&#xff1a; 这里可以看到GD32F4xx的时钟在APB1总线上 在GD32F4xx的时钟树上找到APB1外设的时钟频率&#xff1a; 根据GD32F4…

Rx介绍

ReactiveX的历史 ReactiveX是Reactive Extensions的缩写&#xff0c;一般简写为Rx&#xff0c;最初是LINQ的一个扩展&#xff0c;由微软的架构师Erik Meijer领导的团队开发&#xff0c;在2012年11月开源&#xff0c;Rx是一个编程模型&#xff0c;目标是提供一致的编程接口&…

Rx简介

目录 (一)&#xff1a;Rx简介 (二)&#xff1a;Rxjava基础知识 (三)&#xff1a;Rxjava创建操作符 (四)&#xff1a;Rxjava的线程操作 Rxjava简介 Rxjava由来 Rxjava是Rective Extensions的Java实现&#xff0c;用于通过使用Observable/Flowable序列来构建异步和基于事件…