纯逻辑控制AD936x/AD9361配置寄存器/AD9361纯硬件设计/AD9361配置流程/zynq配置ad9361/AD9361手把手教程/AD936x教程/——纯Verilog配置AD9361

因最近公司需要,借此机会和大家一起学习AD9361

制作不易,记得三连哦,给我动力,持续更新!

工程文件下载:纯硬件SPI配置AD9361   提取码:g9jy 

----------------------------------------------------------------------------------------

因为ADI官方,只提供了利用软件(SDK)和硬件平台(vivado)去配置AD936x,但是在一些工程中,这种方法很难去应用到实际的项目中,所以给大家介绍一个纯硬件配置AD936x的一个详细教程。因为是手把手教程,所以有些大佬不要嫌麻烦。同时后期会更新工程上的项目设计。废话不多说了,直接进入主题!和我一起学习神秘而又神奇AD936x吧!少年!

我用的是zedboard+ad9361,和我的硬件一样的伙伴,可以完全按照我的步骤进行,FPGA芯片为zynq7020的应该也可以。其余的根据自身芯片要求略微修改即可

根据前两章的讲解,相信大家已经完成了AD936x的脚本准备工作,这节将给大家讲解如果通过SPI把上一节生成的脚本文件,配置到AD9361上。

一、新建一个vivado工程

新建vivado硬件工程,然后分别把图中这几个文件代码导入工程中,

二、AD9361配置脚本文件

此文件就是上一节,通过AD936X Evaluation Software软件配置好的,脚本文件转化成Verilog的脚本文件,里面包含了所有的ad9361的寄存器配置信息。

 三、ad9361接口文件

ad9361接口文件,此模块设计了采用LVDS传输模式的接口,接口设计清晰,可以嫁接到任何ad9361和其他FPGA开发板的接口连接,并且接口均为ad9361的接口,并没有其余无用的端口,移植起来非常方便。

通过设置adc_r1_modedac_r1_mode来选择单通道或双通道读写功能。这些配置选项允许您在单通道模式下只使用一个通道进行数据读写,或者在双通道模式下同时使用两个通道进行数据读写。

通过设置adc_r1_modedac_r1_mode,您可以根据系统需求选择合适的模式。在单通道模式下,您只需使用一个通道进行数据读取或写入,这可能在某些应用中更为简单和高效。而在双通道模式下,您可以同时使用两个通道进行数据读取和写入,这可能在一些需要同时处理多个信号的应用中更为有用。

代码:

module axi_ad9361_dev_if (
// 物理接口(接收)
    input rx_clk_in_p,
    input rx_clk_in_n,
    input rx_frame_in_p,    //每个数据包起始位置(n:下降  p:上升)
    input rx_frame_in_n,
    input [5:0] rx_data_in_p,
    input [5:0] rx_data_in_n,
// 物理接口(发送)
    output tx_clk_out_p,
    output tx_clk_out_n,
    output tx_frame_out_p,
    output tx_frame_out_n,
    output [5:0] tx_data_out_p,
    output [5:0] tx_data_out_n,
// 数据时钟
    output data_clk,
// 接收数据路径接口
    output reg adc_valid,
    output reg [11:0] adc_data_i1,
    output reg [11:0] adc_data_q1,
    output reg [11:0] adc_data_i2,
    output reg [11:0] adc_data_q2,
    output reg adc_status,
    input adc_r1_mode,
// 发送数据路径接口
    input dac_valid,
    input [11:0] dac_data_i1,
    input [11:0] dac_data_q1,
    input [11:0] dac_data_i2,
    input [11:0] dac_data_q2,
    input dac_r1_mode
);


字
数
太
多
省
略
一
部
分

// 发送帧接口, oddr -> obuf
    ODDR #(
    .DDR_CLK_EDGE   ("SAME_EDGE"            ))
    i_tx_frame_oddr (
    .CE             (1'b1                   ),
    .R              (1'b0                   ),
    .S              (1'b0                   ),
    .C              (data_clk               ),
    .D1             (tx_frame               ),
    .D2             (tx_frame               ),
    .Q              (tx_frame_oddr_s        ));
    OBUFDS i_tx_frame_obuf (
        .I(tx_frame_oddr_s),
        .O(tx_frame_out_p),
        .OB(tx_frame_out_n)
    );
// 发送时钟接口, oddr -> obuf (需要和data_clk,相同频率和占空比)
    ODDR #(
    .DDR_CLK_EDGE   ("SAME_EDGE"            ))
    i_tx_clk_oddr   (
    .CE             (1'b1                   ),
    .R              (1'b0                   ),
    .S              (1'b0                   ),
    .C              (data_clk               ),
    .D1             (1'b0                   ),
    .D2             (1'b1                   ),
    .Q              (tx_clk_oddr_s          ));
    OBUFDS i_tx_clk_obuf (
        .I(tx_clk_oddr_s),
        .O(tx_clk_out_p),
        .OB(tx_clk_out_n)
    );
    
endmodule

 四、ad9361读取脚本文件

根据上一节的ad9361_lut.v脚本文件,可以将读取脚本用状态机实现,分为三个状态为写状态、读状态和延时状态,并通过循环来反复执行这些状态,直到所有寄存器都被配置完毕。最后,可以将状态机设置为一个固定状态,并发出配置结束的标志信号。

为了确保正常操作,我建议将时钟频率设置为20MHz,并与SPI读写时钟保持一致。这样可以确保数据传输的稳定性和可靠性。

通过这种方式,您可以有效地配置AD9361芯片的寄存器,并在配置完成后获得一个明确的结束标志,以确保配置的正确性和完整性。

 通过ad9361_config_writedata传输到SPI读写模块进行读写操作,

 代码:

module ad9361_init(
	input 				clk,
	input 				rst_n,
	output 	reg			read,
	output 	reg			write,
	output 	reg	[9:0]	address,
	output 	reg	[7:0]	writedata,
	input 		[7:0]	readdata,
	input 				waitrequest,
	output	reg			chip_rst_n,
	output	 	[12:0]  init_index,
	output 	reg			init_done
);

//`define MODELSIM
    `define SPI_CLK_FREQ       20  //MHz	
    `include "ad9361_lut.v"
	reg	   [12:0]	index;
	reg	   [2:0]	state;
	reg    [31:0] 	delay_cnt;
	reg    [18:0]	command;
	
    assign init_index = index;
	always @ (posedge clk)	command <= ad9361_lut(index);


字
数
太
多
省
略
一
部
分


				3'd4    :   begin 
				                index <= index + 1;
				                state <= state + 1;
                            end
				3'd5    :   begin 
				                state <= state + 1;
                            end
				3'd6    :   begin 
				                state <= 1;
                            end
				3'd7    :   begin 
                                init_done <= 1;
                            end
				default :   state <= 0;
			endcase
	end
	
endmodule
		

五、SPI读写文件

基于上一节读取脚本文件读出的地址和数据,我们可以设计一个通用的SPI控制器,用于读写各种配置寄存器。该控制器采用三个状态机来实现不同的功能:开始传输、传输状态和传输完成。同时,我们可以使用一个always语句来实时输入数据,实现对寄存器的配置。

这个通用SPI控制器具有以下特点:

  1. 灵活性:它可以适应不同的寄存器配置需求,根据脚本文件中的地址和数据选择相应的寄存器进行读写操作。
  2. 可重用性:由于其通用性,该控制器可以在不同的工程中被重复使用,以满足不同的寄存器配置需求。
  3. 状态机驱动:通过三个状态机(开始传输、传输状态和传输完成),控制器可以在不同的阶段执行相应的操作,以确保正确的数据传输和操作完成。

通过使用这个通用SPI控制器,您可以方便地配置各种寄存器,并在传输完成后获得相应的状态信号,以确保配置的成功和完整性。

 代码:

module ad9361_spi(
    input 				clk,
    input				rst_n,
//ad9361 interface
    input 				read,
    input 				write,
    input 		[9:0] 	address,
    input 		[7:0] 	writedata,
    output 	reg [7:0]	readdata,
    output 	reg 		waitrequest,
//SPI interface
    output				spi_clk,
    output	reg			spi_csn,
    output	reg			spi_sdo,
    input				spi_sdi
);
    reg	   [4:0]   bit_cnt;	
    reg	   [23:0]  command;
    reg	   [1:0]   state;
//SPI state    
    localparam  START				= 0,
                TR					= 1,
                DONE				= 2;
     
    wire           wr_rdn;  //只写不读
    assign wr_rdn = write && !read;

字
数
限
制
省
略

    reg	[7:0]	readdata_shift = 0;
    always @ (posedge clk)
    begin
        readdata_shift <= {readdata_shift[6:0], spi_sdi};
    end
    
    always @ (posedge clk)
    begin
        if (bit_cnt == 24 && read)begin
            readdata <= {readdata_shift[6:0], spi_sdi};
        end
    end
    
endmodule

六、工程顶层的设计

需要注意完成配置后,dac_valid才拉高,然后把dac_data传给tx_data,保证传输数据的正确。防止数据进行错位。

 代码:

module system_top(
//USER GPIO (PL GCLK 100MHz)
    input               pl_gclk,
    output              led7,
    output  reg         led0,
    input               SW0,
//ad9361 spi
    output              spi_clk,
    output              spi_csn,
    input               spi_sdi,
    output              spi_sdo,
//ad9361 control
    output              en_agc,
    output reg          enable,
    output reg          txnrx,
    output              resetb,
    output              sync_in,
    output      [3:0]   ctrl_in,
    input       [7:0]   ctrl_out,
//ad9361 rx channel
    input               rx_clk_in_p,
    input               rx_clk_in_n,
    input       [5:0]   rx_data_in_n,
    input       [5:0]   rx_data_in_p,
    input               rx_frame_in_n,
    input               rx_frame_in_p,

字
数
限
制
省
略

ad9361_spi ad9361_spi_0(
    .clk ( gclk_div ),
    .rst_n ( rstr ),
    .read ( ad9361_config_read ),
    .write ( ad9361_config_write ),
    .address ( ad9361_config_address ),
    .writedata ( ad9361_config_writedata ),
    .readdata ( ad9361_config_readdata ),
    .waitrequest ( ad9361_config_waitrequest ),
    .spi_clk ( spi_clk ),
    .spi_csn ( spi_csn ),
    .spi_sdo ( spi_sdo ),
    .spi_sdi ( spi_sdi )
);

endmodule

七、下板测试

把上述文件全部加入工程之后,然后分配管脚,进行编译和实现,产生bit流文件

AD9361应处在FDD工作状态,tx1和rx1单通道收发,收的频率2.4GHz,发的频率2.4GHz,为了测试方便本次设计产生一个稳定的正弦波信号,用频谱仪和ila分别测试,得出实验结果如下所示:

 

并且通过ila查看了每个读寄存器的值,均符合要求。  

本次纯逻辑配置ad9361设计完成,更多设计后续继续更新,,,

  • 10
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
### 回答1: zynq7020 ad9361是一种集成了Xilinx的可编程逻辑器件和ADI的射频收发器件的平台。它可用于无线通信领域,如无线电频谱感知、无线电软定义、卫星通信等。 硬件电路设计部分,在设计zynq7020 ad9361硬件电路时,需要考虑以下几个方面: 1. 功耗优化:合理选择电路元件和功耗控制策略,确保系统在满足性能要求的前提下最小化功耗消耗。 2. 信号完整性:采用合理的布局和阻抗控制手段,降低信号传输中的串扰和衰减,保证高速信号的完整性。 3. 时钟和同步:设计合理的时钟和同步电路,确保系统各个模块的时序一致,避免数据损坏和丢失。 4. EMI/EMC设计:采用合适的滤波器、隔离器等措施,降低电磁干扰和电磁辐射,确保系统的电磁兼容性。 在PCB开发方面,一般需要经历以下几个步骤: 1. 确定器件布局:根据电路设计要求,合理布局芯片、芯片外围器件、连接器等元件,确保信号传输和功耗控制的有效性。 2. 绘制原理图:根据电路设计,使用EDA软件进行原理图绘制,定义引脚、信号路径等信息。 3. PCB布线:将原理图中的电路连接关系转化为实际的PCB布线,考虑时序、信号完整性、电磁兼容性等因素,进行差分信号、时钟、电源等的布线。 4. 完善PCB设计:添加必要的电源滤波、地面平面、跳线和设置焊盘等措施,优化PCB的性能和可靠性。 5. PCB制造:将设计好的PCB文件进行工厂制造,包括制板、钻孔、化学镀铜、插件、焊接、测试等过程。 6. 电路调试:制造好的PCB连接到相关的硬件系统中进行调试,验证设计的功能和性能。 总之,zynq7020 ad9361硬件电路设计与PCB开发是一项复杂的工作,需要综合考虑多个因素,设计合理的电路、布局和连接,并确保电路性能和可靠性。 ### 回答2: Zynq-7020是Xilinx公司推出的一款面向嵌入式应用的可编程系统芯片,它结合了ARM处理器和FPGA功能,可用于实现高性能的嵌入式系统。AD9361是Analog Devices公司开发的一款多模式多频段射频收发器,适用于无线通信系统中的射频收发功能。 对于Zynq-7020和AD9361硬件电路设计与PCB开发,以下是一些资料分享的主要内容: 1. 器件数据手册:包括Zynq-7020和AD9361的详细规格和功能特性,可以从Xilinx和Analog Devices的官方网站上获得这些手册。 2. 参考设计文件:Xilinx和Analog Devices官方网站上提供了一些针对Zynq-7020和AD9361的参考设计文件,这些设计文件包含了硬件原理图、PCB布局指导、信号完整性分析等内容,有助于理解和设计自己的硬件电路。 3. 开发设计文件:可能会有一些第三方厂商基于Zynq-7020和AD9361开发开发板,他们通常会提供相关的硬件设计文件和PCB源文件,可以从开发板厂商的官方网站上找到这些资料。 4. 其他相关论坛和社群:在Xilinx和Analog Devices的官方社群和论坛上,有一些热心的工程师会分享自己的硬件设计经验和资料,可以从这些社群和论坛中获得一些有用的参考资料。 总之,对于Zynq-7020和AD9361硬件电路设计与PCB开发,可以通过查阅器件数据手册、参考设计文件、开发设计文件以及参与相关社群和论坛等方式来获取更多的资料和分享。这些资料将有助于理解和设计高性能的嵌入式系统,提高设计效率和质量。 ### 回答3: 关于Zynq7020和AD9361硬件电路设计和PCB开发资料,我建议您秉持以下几个方面来分享: 1. Zynq7020资料分享: - Zynq7020是Xilinx推出的一款嵌入式可编程逻辑器件,它结合了ARM Cortex-A9双核处理器和可编程逻辑。 - 可以分享Zynq7020的官方手册,其中包含了芯片的功能、引脚定义、时钟和电源管理、外设接口等方面的详细资料。 - 还可以分享基于Zynq7020的开发设计文件,包括原理图和PCB布局,这将有助于理解芯片的使用方法和外设的连接方式。 2. AD9361资料分享: - AD9361是安托法格AST公司推出的一款集成式RF收发器芯片,支持广泛的射频频段和通信标准。 - 可以分享AD9361的官方手册,其中包括详细的功能介绍、寄存器设置、电路连接示例等。 - 还可以分享基于AD9361开发设计文件,包括原理图和PCB布局,这将有助于理解芯片的使用方法和外围电路的设计。 3. 硬件电路设计资料分享: - 可以分享关于Zynq7020和AD9361硬件电路设计指南,介绍如何正确地连接和配置这两个芯片,以及一些设计注意事项和技巧。 - 可以分享相关的应用笔记或技术文档,介绍如何实现特定功能或解决特定问题的电路设计方案。 - 如果有相关的例程或Demo设计,也可以分享这些资料,让其他开发者可以直接参考或借鉴。 4. PCB开发资料分享: - 可以分享关于PCB设计的基本原则和技巧,帮助其他开发者正确地布局和布线。 - 可以分享相关的PCB设计工具的使用教程或经验分享,例如Altium Designer、Cadence Allegro等。 - 如果有相关的PCB设计文件(如Gerber文件),也可以分享这些文件,让其他开发者可以快速制作自己的PCB板。 最后,分享这些资料的目的是为了促进技术的传播和共享,帮助其他开发者更好地学习和应用Zynq7020和AD9361。希望以上回答对您有帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值