FPGA实现AD9361数据接口逻辑
作者: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整体结构图
• 集成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数据接口配置参数
在进行数据验证时,也可以使用测试模式,对收发数据进行验证以保证系统的正确性。另外,还可以对输入时钟进行延时调节或者通过SelectIO的delay、delayctrl功能对时钟信号进行微调,以满足时序要求。芯片数据时钟与数据之间的时序可靠性也可以通过芯片内部的延时寄存器0x006、0x007进行条件,以此达到要求,具体的SPI配置寄存器时序如图 3 AD9361 寄存器配置接口SPI时序所示。此方面不是本文重点,不做展开,更多内容参考官方data sheet。
图 3 AD9361 寄存器配置接口SPI时序
本小节使用的数据接口参数:LVDS、FDD、DDR,对应的时序逻辑也是根据该参数进行设计。
2.3 引脚
RX数据时序接口如下:
TX数据时序接口如下:
2.4 接口时序
以下使用的数据接口参数:LVDS、FDD、DDR,根据不同的通道数可以得到不同的数据时序,用户在解析数据时只要按照对应的结构进行拼接即可。
图 4 AD9361接收数据路径
图 5 AD9361发射接口路径
3 参考代码
3.1 SelectIO配置
根据以上对AD9361的了解,就可以轻松的配置SelectIO IP的GUI界面了。芯片既包括发射模块TX又包括接收模块RX,所以IO类型选择chip to chip。
图 6 SelectIO配置界面1
根据上述参数配置部分,自然就选择DDR。数据接口包括时钟CLK、Frame对齐信号与差分数据端Data[05:0],要同时对Frame与Data信号进行时序解析,所以端口宽度设置为7.
图 7 SelectIO配置界面2
由于芯片内部寄存器0x006、0x007可以确保时钟与数据满足时序要求,所以不需要延时模块,以节约FPGA逻辑资源。
图 8 SelectIO配置界面3
图 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
FPGA实现AD9361数据接口逻辑相关推荐
- dsp6455 + FPGA的EMIF数据接口
DSP通过EMIF接口与FPGA通信采集视频 背景 使用FPGA系统进行视频采集,DSP进行视频处理需要了解以下知识: 1. DSP-C6000系列的中断与GPIO系统 2. DSP-C6000系 ...
- (20)FPGA数据接口同步化
(20)FPGA数据接口同步化 1.1 目录 1)目录 2)FPGA简介 3)Verilog HDL简介 4)FPGA数据接口同步化 5)结语 1.2 FPGA简介 FPGA(Field Progra ...
- 基于labview的温湿度数据采集_【零偏原创】基于FPGA的多路SPI接口并行数据采集系统...
摘 要:本文简述了SPI协议,建立了基于FPGA的SPI接口电路模型,并说明其输入输出端口和数据发送和接收过程,仿真验证了在主状态机控制下10个SPI接口并行采集数据,并在FPGA开发板上进行验证. ...
- 一天上手Aurora 8B/10B IP核(2)----Aurora概述及数据接口(Framing接口、Streaming接口)
写在前面 系列汇总:一天上手Aurora 8B/10B IP核----汇总篇(直达链接) 1.Aurora 8B/10B 协议 Aurora 协议是一个用于在点对点串行链路间移动数据的可扩展轻量级链路 ...
- 可以运行vivado的云服务器,百度云服务器FPGA标准开发环境的逻辑开发与编译示例 - 全文...
镜像是云服务器实例运行环境的模板,包括操作系统和预装软件等配置.百度云为每个FPGA实例默认提供了专属公共镜像,用户可以按需选择适合的镜像类型. 概述 基于百度云自研的FPGA加速卡,提供了一套FPG ...
- python fpga chips_基于FPGA实现JESD204B高速接口设计
曹鹏飞 摘 要:JESD204B接口是高速ADC和DAC芯片采用的数据通信接口之一,具有传输速率高,抗干扰能力强,芯片间同步方便等优点.目前国内JESD204B 接口应用多由国外集成芯片提供,缺乏自主 ...
- 【FPGA】基于Avalon_MM接口的SDRAM读写
1.SDRAM 1.1 SDRAM简介 C4开发板上的SDRAM芯片是海力士生产,有256Mbits容量. SDRAM是同步动态随机存储器(存储阵列不断刷新). SDRAM寻址基本原理:行列寻址 SD ...
- matlab 传输速率,大量数据爆发,Xilinx FPGA怎么提高数据传输速率?
核心提示:大量数据爆发,Xilinx FPGA怎么提高数据传输速率?... 或许,你会认为DPDK(Data Plan Development Kit)是一个应用在网络应用层上的高速数据传输标准:或许 ...
- FPGA 实现1553总线接口
FPGA 实现1553总线接口 数字式时分制指令/响应性多路传输数据总线MIL-STD-1553B,总线为半双工传输方式,在总线上传输的数据码应是曼切斯特II型双电平码,逻辑1为双极编码信号1/0,逻 ...
最新文章
- Android实例-ImageList与Image的应用
- putty 远程linux桌面,Linux远程桌面工具Xming+Putty的搭建
- python字符串之join
- 剑英的区块链学习手记(一)
- JavaFX教程–基础
- 【dfs】Election of Evil
- PyTorch 1.0 中文文档:torch.autograd
- python离散变量_python – 当涉及离散变量时,pymc3与pymc2的困难
- linux db2升级,linux 下 db2 v97 升级到db2 v10.1 实战
- 一个对iBatis的总结写的不错(转载)
- Dom,JQuery
- 基于python进行小波分析,频率谱分析
- 数据库原理及应用-期末考试试题及答案
- SEGGER J-Flash烧写SN号(serial number)的两种方式
- C2:Unity3D制作智能家居设计软件——绘制户型(一)
- LabView替代软件,ATECLOUD云测试平台测评
- Ant design vue 表格合并 合并行 合并列
- windows10 wifi热点手机连接显示无网络连接问题解决
- 关于二分查找那些事儿~~~~看完至少节省你两个半月的时间!!!!!
- 实战开发支付SDK —— 处理微信支付异步回调以及订单状态查询(含源码)