AD9361芯片进行数据接口逻辑代码的编写

网友投稿 526 2022-10-29

AD9361芯片进行数据接口逻辑代码的编写

1 引言

2 AD9361

2.1 芯片简介

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.

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

3.2 数据解析

//-------------------------------------------------------------------//用于将接收时钟与数据进行单端与差分的变换//-------------------------------------------------------------------selectio_ipu_selectio_ip(//Fromthesystemintothedevice.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接收端接收到的数据与标志转换为单端数据//Fromthedeviceouttothesystem.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)//用于单端、差分变换的复位,高有效);//-------------------------------------------------------------------//发送数据的生成//-------------------------------------------------------------------assignad_tx0_msb_q=ad_tx0_data[23:18];assignad_tx0_lsb_q=ad_tx0_data[17:12];assignad_tx0_msb_i=ad_tx0_data[11:06];assignad_tx0_lsb_i=ad_tx0_data[05:00];assignad_tx1_msb_q=ad_tx1_data[23:18];assignad_tx1_lsb_q=ad_tx1_data[17:12];assignad_tx1_msb_i=ad_tx1_data[11:06];assignad_tx1_lsb_i=ad_tx1_data[05:00];reg[13:0]ad_tx_data;//-------------------------------------------------------------------//选择要发送的I与Q数据//-------------------------------------------------------------------always@(posedgead9361_data_clkorposedgereset)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) 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};

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

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

上一篇:九析带你轻松完爆 istio 服务网格系列教程
下一篇:第二章 九析带你轻松完爆服务网格 - istio 初探
相关文章

 发表评论

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