0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

以高速AD9361芯片为例进行数据接口逻辑代码的编写

FPGA之家 来源:时沿科技 作者:ShownSun 2021-06-07 14:34 次阅读

本文通过以高速AD9361芯片为例进行数据接口逻辑代码的编写,利用SelectIO IP快速高效完成芯片驱动的生成。

2 AD93612.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整体结构图所示。

43a3fe12-c69f-11eb-9e57-12bb97331649.png

图 1 AD9361整体结构图

• 集成12位DACADC的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 dB

o 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 详细配置。

在进行数据验证时,也可以使用测试模式,对收发数据进行验证以保证系统的正确性。另外,还可以对输入时钟进行延时调节或者通过SelectIO的delay、delayctrl功能对时钟信号进行微调,以满足时序要求。

芯片数据时钟与数据之间的时序可靠性也可以通过芯片内部的延时寄存器0x006、0x007进行条件,以此达到要求,具体的SPI配置寄存器时序如图 3 AD9361 寄存器配置接口SPI时序所示。此方面不是本文重点,不做展开,更多内容参考官方data sheet。

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

2.3 引脚

RX数据时序接口如下:

43f14bae-c69f-11eb-9e57-12bb97331649.png

43fc1e62-c69f-11eb-9e57-12bb97331649.png

443c27c8-c69f-11eb-9e57-12bb97331649.png

4466a57a-c69f-11eb-9e57-12bb97331649.png

TX数据时序接口如下:

447336be-c69f-11eb-9e57-12bb97331649.png

448b42a4-c69f-11eb-9e57-12bb97331649.png

44991082-c69f-11eb-9e57-12bb97331649.png

44a3d8c8-c69f-11eb-9e57-12bb97331649.png

2.4 接口时序

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

3 参考代码3.1 SelectIO配置

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

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

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

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) begin

if(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) begin

if(reset) begin

ad_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;

end

else if((ad_rx_frame_reg==0)&&(ad_rx_frame==1)) begin

ad_rx0_msb_i《=ad_rx_data[05:0];

ad_rx0_msb_q《=ad_rx_data[12:7];

end

else if((ad_rx_frame_reg==1)&&(ad_rx_frame==1)) begin

ad_rx0_lsb_i《=ad_rx_data[05:0];

ad_rx0_lsb_q《=ad_rx_data[12:7];

end

else if((ad_rx_frame_reg==1)&&(ad_rx_frame==0)) begin

ad_rx1_msb_i《=ad_rx_data[05:0];

ad_rx1_msb_q《=ad_rx_data[12:7];

end

else if((ad_rx_frame_reg==0)&&(ad_rx_frame==0)) begin

ad_rx1_lsb_i《=ad_rx_data[05:0];

ad_rx1_lsb_q《=ad_rx_data[12:7];

end

end

wire [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};

编辑:jq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 芯片
    +关注

    关注

    446

    文章

    47746

    浏览量

    409033
  • 发射器
    +关注

    关注

    6

    文章

    783

    浏览量

    52291

原文标题:FPGA实现AD9361数据接口逻辑

文章出处:【微信号:zhuyandz,微信公众号:FPGA之家】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    AD9361和AD9371里接收机的性能有哪些不同呢?

    话说,如果使用CMOS工艺的话,零中频的闪烁噪声会比较大,如果使用SiGe和BiCMOS工艺的话,闪烁噪声就会小很多[1]。所以,我就打算看看AD9361和AD9371这两个芯片的工艺。
    的头像 发表于 04-17 11:22 197次阅读
    <b class='flag-5'>AD9361</b>和AD9371里接收机的性能有哪些不同呢?

    AD9361 BBPLL锁相环失锁(Z706)

    各位好! 我在尝试用FPGA直接配置AD9361,但是BBPLL一直失锁,具体问题如下: 这是9361配置表,在9361初始化时,index一直卡在24,说明BBPLL失锁,观察spi读写 可以看到sdi值一直
    发表于 03-25 16:14

    ad9361 ADC采样率设置范围

    AD9361是一款高性能的射频前端芯片,广泛应用于无线通信系统中。其中一个重要特性是其具有灵活可调的ADC采样率。本文将详细介绍AD9361的ADC采样率设置范围,包括其相关特性、设置方法以及在实际
    的头像 发表于 01-04 09:37 1551次阅读

    ad9361接收电平范围

    AD9361是一种宽频带软件可定义收发器芯片,由ADI(Analog Devices Inc.)公司研发,可用于各种射频(RF)应用。它是一种全集成的射频收发器,实现了收发器功能。在这篇文章中,我们
    的头像 发表于 12-26 15:49 1121次阅读

    求助,关于多片AD9361参考时钟和External LO的问题

    当试图另两片AD9361的LO和BB时钟相位固定时,手册上提供了两种办法,一个是两片AD9361的XTALN共源(低频30Mhz-80Mhz),然后片内的TxRFPLL/RxRFPLL/BBPLL
    发表于 12-13 07:51

    AD9361时延响应特性不固定如何优化?

    利用AD9361进行扩频信号的收发自闭环实验,测试发现,AD9361工作在AGC模式下,接收链路时延随接收信号功率变化(时延变化量超过0.1ns)。后调成MGC模式,手动控制接收链路
    发表于 12-12 07:36

    ad9361自发自首,接受波形正常,自发他收波形失真的原因?

    目前有2块板子,都是zynq + ad9361。2块板配置发送接收 采样率:60MHz,本振频率2.4GHz,带宽50MHz,模式FDD 2R2T。 板卡1自发自首,
    发表于 12-07 07:59

    多片AD9361同步后相位随机翻转是哪里的问题?

    调试过程中发现:多片AD9361同步后,一段时间内相位恒定,散热风扇撤掉或者一二十分钟后会有片子相位翻转180°,片子位号随机,请问一下这个是片子本身特性还是散热影响(若散热影响,麻烦告知影响机理),又或者代码哪里未设置对?期待您的回答
    发表于 12-07 07:36

    AD9361正弦波回环错误的原因?

    我使用AD9361器件,在数字输入接口自回环,发现自增数回环正常,正弦波回环错误。不明白问题原因!
    发表于 12-04 06:22

    AD9361 TX衰减有90db的范围在芯片哪个部分实现?

    AD9361 TX 衰减有90db的范围 在芯片哪个部分实现? TX 通路 DAC+LP+混频+LNA
    发表于 11-16 07:56

    ad9361输出信号异常

    各位大佬好,我最近在调试ad9361,试了一下输出一个480k的频率,载波频率是2250.5M,上变频后频率应该是2250.5M+-480k,但是在频谱仪上看到他的载波频率还是很高,按照
    发表于 11-01 14:29

    AD9361的上变频怎么设置?怎么确定频率变成多少?

    AD9361的上变频怎么设置,怎么确定频率变成多少?
    发表于 10-18 07:17

    关于AD9361的抗阻塞能力的实测

    在窄带应用中,零中频软件无线电芯片已经非常流行,其代表是ADI公司的AD9361
    的头像 发表于 05-26 10:17 1734次阅读

    用于3G和4G基站应用的AD9361频率(RF)捷变收发器

    AD9361接收机LO的工作频率范围为70 MHz至6.0 GHz,发射机LO工作频率范围为47 MHz至6.0 GHz范围,涵盖大多数授权和未授权频段。频道支持小于200 kHz至56 MHz的带宽。
    发表于 05-16 14:28 633次阅读

    AD9361数据路径在低电压差分信号(LVDS)模式下运行

    接下来将介绍AD9361数据路径在低电压差分信号(LVDS)模式下运行。AD9361数据接口使用并行总线(P0和P1)在
    的头像 发表于 04-25 15:51 4243次阅读
    <b class='flag-5'>AD9361</b><b class='flag-5'>数据</b>路径在低电压差分信号(LVDS)模式下运行