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

网友投稿 377 2022-11-06

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

2 AD93612.1 芯片简介

AD9361接收器LO工作频率范围为70 MHz至6.0 GHz,发射器LO工作频率范围为47 MHz至6.0 GHz,涵盖大部分特许执照和免执照频段,支持的通道带宽范围为200 kHz以下至56 MHz,整体结构图如图 1 AD9361整体结构图所示。

图 1 AD9361整体结构图

• 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 参数配置

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

2.3 引脚

RX数据时序接口如下:

TX数据时序接口如下:

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.

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

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:容器持久化存储训练营”启动倒计时!3天攻破K8s难点
下一篇:如何高效学习 Kubernetes 知识图谱?
相关文章

 发表评论

暂时没有评论,来抢沙发吧~