VIVADO+ZYNQ7000入门四,PS与PL的AXI总线通信

目标

你好!

预备知识

我们

工程实例

  1. 创建一个空白工程,创建过程可以参考这里
    https://blog.csdn.net/malcolm_110/article/details/107222944

  2. Creak block design
    在这里插入图片描述

  3. 添加zynq block
    在这里插入图片描述

  4. 添加一个AXI_GPIO模块
    在这里插入图片描述

  5. 添加点击自动布线
    在这里插入图片描述
    在弹出窗口中打勾
    在这里插入图片描述

  6. 效果如下,我们可以看到系统会自动添加了一个AXI转换器,一端连接到了ARM核,一端连到了AXI的设备上,我们这里用的是GPIO设备。如果AXI总线上挂多个从设备,只需要双击AXI Interconnect,重新配置端口数即可。本例中设置2个从设备,一个做GPIO输出用,另一个连接RAM。
    在这里插入图片描述

  7. 可以点击Regenerate Layout ,让模块重新布局。
    在这里插入图片描述

  8. 添加一个ILA模块,功能相当于内置的逻辑分析仪,用来在线监测数据
    时钟连到系统时钟上,输入信号连到AXI的第二路从口上。
    在这里插入图片描述

  9. 继续添加一个VIO 模块,监测IO的输出情况。修改配置,只需要输入,4bit位宽;不需要输出。连好线。
    在这里插入图片描述
    记得配置一下arm核的参数,ddr型号/延时数据等
    设置后,点击validate design

  10. 修改axi io端口为 axi_lite 类型,并关联时钟
    在这里插入图片描述
    在地址空间分配上,可以选择自动,深度可以选择为4k

  11. 建立工程的头文件

在这里插入图片描述
12. 执行编译
在这里插入图片描述

  1. 接下来进行PL端的开发,Add Sources,创建一个空的verilog文件,可以命名为soc_axi_ctrl.v。
    在这里插入图片描述

  2. 双击design_system_wrapper 可以弹出一个IP工程的verilog文件,我们把这个文件的端口例化到soc_axi_ctrl.v。
    在这里插入图片描述

  3. 创建一个RAM Block,用来验证AXI的读写。
    在这里插入图片描述
    先选择类型为AXI4
    在这里插入图片描述
    进入AXI4的配置栏,类型选择AXI4 Lite,可以重命名,axi_ram_blk。点击OK后,弹出的窗口都默认选项,系统会执行编译,点击yes/OK就行。
    在这里插入图片描述
    Sources 里面多了一栏“IP”,找到后缀为veo的文件,这里面有我们需要的端口例化,拷贝上面创建的soc_axi_ctrl.v文件里。

最终代码

`timescale 1ns / 1ps
//
// Company: 
// Engineer: malcolm_119
// 
// Create Date: 2020/09/11 11:26:11
// Design Name: 
// Module Name: soc_axi_ctl
// Project Name: 
// Target Devices: xc7z030ffg-2
// Tool Versions: Vivado 2015.5
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module soc_axi_ctl_top(
    inout [14:0]      DDR_addr,
    inout [ 2:0]      DDR_ba,
    inout             DDR_cas_n,
    inout             DDR_ck_n,
    inout             DDR_ck_p,
    inout             DDR_cke,
    inout             DDR_cs_n,
    inout [ 3:0]      DDR_dm,
    inout [31:0]      DDR_dq,
    inout [ 3:0]      DDR_dqs_n,
    inout [ 3:0]      DDR_dqs_p,
    inout             DDR_odt,
    inout             DDR_ras_n,
    inout             DDR_reset_n,
    inout             DDR_we_n,
    inout             FIXED_IO_ddr_vrn,
    inout             FIXED_IO_ddr_vrp,
    inout [53:0]      FIXED_IO_mio,
    inout             FIXED_IO_ps_clk,
    inout             FIXED_IO_ps_porb,
    inout             FIXED_IO_ps_srstb,
    
    output [3:0]      led
    );
    
    wire fclk;
    wire rstn;
             
    wire [31 : 0]    s_axi_awaddr;           
    wire             s_axi_awvalid;           
    wire             s_axi_awready;           
    wire [31 : 0]    s_axi_wdata;           
    wire [3 : 0]     s_axi_wstrb;           
    wire             s_axi_wvalid;           
    wire             s_axi_wready;           
    wire [1 : 0]     s_axi_bresp;           
    wire             s_axi_bvalid;           
    wire             s_axi_bready;           
    wire [31 : 0]    s_axi_araddr;           
    wire             s_axi_arvalid;           
    wire             s_axi_arready;           
    wire [31 : 0]    s_axi_rdata;           
    wire [1 : 0]     s_axi_rresp;           
    wire             s_axi_rvalid;           
    wire             s_axi_rready;           

    
    design_system_wrapper design_system_wrapper(
    .DDR_addr                    (  DDR_addr              ),//  inout [14:0]DDR_addr;                                                    
    .DDR_ba                      (  DDR_ba                ),//  inout [2:0]DDR_ba;                                                       
    .DDR_cas_n                   (  DDR_cas_n             ),//  inout DDR_cas_n;                                                         
    .DDR_ck_n                    (  DDR_ck_n              ),//  inout DDR_ck_n;                                                          
    .DDR_ck_p                    (  DDR_ck_p              ),//  inout DDR_ck_p;                                                          
    .DDR_cke                     (  DDR_cke               ),//  inout DDR_cke;                                                           
    .DDR_cs_n                    (  DDR_cs_n              ),//  inout DDR_cs_n;                                                          
    .DDR_dm                      (  DDR_dm                ),//  inout [3:0]DDR_dm;                                                       
    .DDR_dq                      (  DDR_dq                ),//  inout [31:0]DDR_dq;                                                      
    .DDR_dqs_n                   (  DDR_dqs_n             ),//  inout [3:0]DDR_dqs_n;                                                    
    .DDR_dqs_p                   (  DDR_dqs_p             ),//  inout [3:0]DDR_dqs_p;                                                    
    .DDR_odt                     (  DDR_odt               ),//  inout DDR_odt;                                                           
    .DDR_ras_n                   (  DDR_ras_n             ),//  inout DDR_ras_n;                                                         
    .DDR_reset_n                 (  DDR_reset_n           ),//  inout DDR_reset_n;                                                       
    .DDR_we_n                    (  DDR_we_n              ),//  inout DDR_we_n;                                                          
    .FIXED_IO_ddr_vrn            (  FIXED_IO_ddr_vrn      ),//  inout FIXED_IO_ddr_vrn;                                                  
    .FIXED_IO_ddr_vrp            (  FIXED_IO_ddr_vrp      ),//  inout FIXED_IO_ddr_vrp;                                                  
    .FIXED_IO_mio                (  FIXED_IO_mio          ),//  inout [53:0]FIXED_IO_mio;                                                
    .FIXED_IO_ps_clk             (  FIXED_IO_ps_clk       ),//  inout FIXED_IO_ps_clk;                                                   
    .FIXED_IO_ps_porb            (  FIXED_IO_ps_porb      ),//  inout FIXED_IO_ps_porb;                                                  
    .FIXED_IO_ps_srstb           (  FIXED_IO_ps_srstb     ),//  inout FIXED_IO_ps_srstb;                                                 
    .axi_lite_ram_araddr         (  s_axi_araddr          ),//  output [31:0]axi_lite_ram_araddr;                                        
    .axi_lite_ram_arprot         (                        ),//  output [2:0]axi_lite_ram_arprot;                                         
    .axi_lite_ram_arready        (  s_axi_arready         ),//  input [0:0]axi_lite_ram_arready;                                         
    .axi_lite_ram_arvalid        (  s_axi_arvalid         ),//  output [0:0]axi_lite_ram_arvalid;                                        
    .axi_lite_ram_awaddr         (  s_axi_awaddr          ),//  output [31:0]axi_lite_ram_awaddr;                                        
    .axi_lite_ram_awprot         (                        ),//  output [2:0]axi_lite_ram_awprot;                                         
    .axi_lite_ram_awready        (  s_axi_awready         ),//  input [0:0]axi_lite_ram_awready;                                         
    .axi_lite_ram_awvalid        (  s_axi_awvalid         ),//  output [0:0]axi_lite_ram_awvalid;                                        
    .axi_lite_ram_bready         (  s_axi_bready          ),//  output [0:0]axi_lite_ram_bready;                                         
    .axi_lite_ram_bresp          (  s_axi_bresp           ),//  input [1:0]axi_lite_ram_bresp;                                           
    .axi_lite_ram_bvalid         (  s_axi_bvalid          ),//  input [0:0]axi_lite_ram_bvalid;                                          
    .axi_lite_ram_rdata          (  s_axi_rdata           ),//  input [31:0]axi_lite_ram_rdata;                                          
    .axi_lite_ram_rready         (  s_axi_rready          ),//  output [0:0]axi_lite_ram_rready;                                         
    .axi_lite_ram_rresp          (  s_axi_rresp           ),//  input [1:0]axi_lite_ram_rresp;                                           
    .axi_lite_ram_rvalid         (  s_axi_rvalid          ),//  input [0:0]axi_lite_ram_rvalid;                                          
    .axi_lite_ram_wdata          (  s_axi_wdata           ),//  output [31:0]axi_lite_ram_wdata;                                         
    .axi_lite_ram_wready         (  s_axi_wready          ),//  input [0:0]axi_lite_ram_wready;                                          
    .axi_lite_ram_wstrb          (  s_axi_wstrb           ),//  output [3:0]axi_lite_ram_wstrb;                                          
    .axi_lite_ram_wvalid         (  s_axi_wvalid          ),//  output [0:0]axi_lite_ram_wvalid;                                         
    .axi_fclk                        (  fclk                  ),//  output fclk;                                                             
    .gpo                         (  led                   ),//  output [3:0]gpo;                                                         
    .ext_rst                        (  rstn                  ) //  output [0:0]rstn;                                                        
    );
   
    axi_ram_blk axi_ram_blk (
        .s_aclk                (  fclk           ),// input  wire s_aclk                          
        .s_aresetn             (  rstn           ),// input  wire s_aresetn                          
        .s_axi_awaddr          (  s_axi_awaddr   ),// input  wire [31 : 0] s_axi_awaddr                 
        .s_axi_awvalid         (  s_axi_awvalid  ),// input  wire s_axi_awvalid                          
        .s_axi_awready         (  s_axi_awready  ),// output wire s_axi_awready                         
        .s_axi_wdata           (  s_axi_wdata    ),// input  wire [31 : 0] s_axi_wdata                 
        .s_axi_wstrb           (  s_axi_wstrb    ),// input  wire [3 : 0] s_axi_wstrb                  
        .s_axi_wvalid          (  s_axi_wvalid   ),// input  wire s_axi_wvalid                          
        .s_axi_wready          (  s_axi_wready   ),// output wire s_axi_wready                         
        .s_axi_bresp           (  s_axi_bresp    ),// output wire [1 : 0] s_axi_bresp                 
        .s_axi_bvalid          (  s_axi_bvalid   ),// output wire s_axi_bvalid                         
        .s_axi_bready          (  s_axi_bready   ),// input  wire s_axi_bready                          
        .s_axi_araddr          (  s_axi_araddr   ),// input  wire [31 : 0] s_axi_araddr                 
        .s_axi_arvalid         (  s_axi_arvalid  ),// input  wire s_axi_arvalid                          
        .s_axi_arready         (  s_axi_arready  ),// output wire s_axi_arready                         
        .s_axi_rdata           (  s_axi_rdata    ),// output wire [31 : 0] s_axi_rdata                
        .s_axi_rresp           (  s_axi_rresp    ),// output wire [1 : 0] s_axi_rresp                 
        .s_axi_rvalid          (  s_axi_rvalid   ),// output wire s_axi_rvalid                         
        .s_axi_rready          (  s_axi_rready   ) // input  wire s_axi_rready                          
    );
    
    
endmodule


  1. 添加管脚约束文件,constrain 上面点击右键,选择Add Sources
    在这里插入图片描述
    在这里插入图片描述
#led
set_property PACKAGE_PIN W17  [get_ports {
    
    led[0]}]
set_property PACKAGE_PIN W15  [get_ports {
    
    led[1]}]
set_property PACKAGE_PIN W14  [get_ports {
    
    led[2]}]
set_property PACKAGE_PIN W16  [get_ports {
    
    led[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {
    
    led[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {
    
    led[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {
    
    led[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {
    
    led[3]}]
  1. 编译
    在这里插入图片描述
    编译过程有点长,我们可以查看一些编译状态
    在这里插入图片描述

====================================

  1. 信息导入到SDK环境

File–Export–Export Hardware,然后弹出下面窗口
在这里插入图片描述
继续 File–Launch SDK
19. 进入SDK后,执行File–New–Application
输入工程名称,next里选择空白工程。
建好后,src上右键,新建一个c文件
在这里插入图片描述
文件名必须带.c后缀。
在这里插入图片描述

/*
 * led_ram.c
 *
 *  Created on: 2020年9月11日
 *      Author: malcolm_119
 */

#include "xparameters.h"
#include "xil_io.h"

#define TRI    0x00000004
#define DATA   0x00000000

#define GPIO_BASE_ADDR  XPAR_AXI_GPIO_0_BASEADDR
#define RAM_BASE_ADDR   XPAR_AXI_LITE_RAM_BASEADDR

int main()
{
    
    
	u8 data=0x11;
	u8 data_temp;
	u32 receive;
	volatile int Delay;
	u8 data_cnt;
	u32 receive_data[32];

	Xil_Out32(GPIO_BASE_ADDR+TRI,0x0);

	receive = Xil_In32(GPIO_BASE_ADDR+DATA);

	receive = receive & 0xFFFFFF00;

	receive = receive | data;

	Xil_Out32(GPIO_BASE_ADDR+DATA,receive);


	while(1)
	{
    
    
		for(Delay=0;Delay<100000;Delay++);
		receive = Xil_In32(GPIO_BASE_ADDR+DATA);

		data_temp = data>>7;
		data = (data<<1) | data_temp;

		receive = receive & 0xFFFFFF00;

		receive = receive | data;

		Xil_Out32(GPIO_BASE_ADDR+DATA,receive);

        for(data_cnt=0;data_cnt<32;data_cnt++)
        	Xil_Out32(RAM_BASE_ADDR + data_cnt*4,data_cnt);


        for(data_cnt=0;data_cnt<32;data_cnt++)
        	receive_data[data_cnt] = Xil_In32(RAM_BASE_ADDR + data_cnt*4);
	}

    return 0;
}




代码编写完成后,下板卡上电,烧写文件,便于后面在线debug
在这里插入图片描述
调出调试窗口
在这里插入图片描述
按F8执行程序,可以看到一些寄存器运行的结果。
在这里插入图片描述
同时,vivado里通过vio以及ila工具监测运行
在这里插入图片描述
把端口添加进来
在这里插入图片描述
可以看到IO的值在循环跳变。
在这里插入图片描述

接下来看一下ILA

在这里插入图片描述
按住ctrl,添加多个信号
在这里插入图片描述
设置监测条件
在这里插入图片描述
设置监测长度
在这里插入图片描述
点击运行
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/malcolm_110/article/details/108490361