首页 > 编程知识 正文

fpga基本逻辑单元,fpga逻辑单元

时间:2023-05-05 23:47:48 阅读:52672 作者:4685

作者: ShownSun

工作室:时沿科技

文章目录用FPGA实现AD9361数据接口逻辑1引言2 AD93612.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基站APP应用的高性能、高集成度射频(RF ) Agile Transceiver高速收发器。 该器件的可编程性和宽带能力已成为多种收发器APP应用的理想选择。 此装置组RF前端与灵活的混合信号基带部分集成频率合成器,为处理器提供可配置的数字接口以简化设计部署。 AD9361接收机LO的工作频率范围从70 MHz到6.0 GHz,发射机LO的工作频率范围从47 MHz到6.0 GHz,复盖了大多数许可和免许可带宽,支持的信道带宽范围从200 kHz以下到56 MHz

图1 AD9361的整体结构图, 12位DAC和ADC RF 22收发器tx频带: 47MHz~6.0GHzrx频带: 70MHz~6.0GHzTDD和软驱的可操作调谐信道带宽: 200khz~56MHz双通道接收器: 6路噪声系数为2db(800mhzlo ) rx增益控制o实时监测和控制信号用于手动增益o独立的自动增益控制双发射机(4路差分输出高线性宽带发射机otxevm(40dbotx噪声(<157 dBm/Hz背景噪声oTX监视器)动态范围)66 dB,精度=1 dB•集成小数n分频频率合成器•2.4 Hz最大本地振荡(LO )步进多器件同步•CMOS/LVDS数字接口2.2参数根据需要,数据接口可以通过SPI被配置为LVDS或CMOS接口,以及选择FDD或TDD的操作方式和数据速率。 只需要配置软件设置。 详细的配置教程将参考AD936x Evaluation Software的详细配置,如图2的2 AD9361数据接口配置参数所示。

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

图3 AD9361寄存器配置接口SPI序列本节使用的数据接口参数: LVDS、FDD、DDR,相应的时序逻辑也根据该参数设计。

2.3针RX数据定时接口如下。

TX数据定时接口如下:

2.4接口序列以下使用的数据接口参数: LVDS、FDD、DDR可以根据信道的数量获得不同的数据序列,并且用户可以在分析数据时按照相应的结构接合在一起。

图4 AD9361接收数据路径

图5 AD9361发送接口路径3参考代码3.1选择io配置根据上述AD9361的知识,可以简单地配置选择io IP的GUI接口。 由于芯片包括发送模块TX和接收模块RX,所以IO类型选择chip to chip。

图6选择io配置接口1根据上述参数配置部分,自然选择DDR。 数据接口包括时钟CLK、Frame对准信号和差分数据端子Data[05:0],为了同时定时分析Frame和Data信号,端口宽度被设定为7 .

图7选择io配置接口2不需要延迟模块来节省FPGA逻辑资源,因为芯片内部寄存器0x006、0x007可以确保时钟和数据满足时序要求。

图8选择io配置接口3

图9 SelectIO配置画面4------------ -数据分析------------------- -请参阅

o_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];endendwire [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

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。