目标
你好!
预备知识
我们
工程实例
-
创建一个空白工程,创建过程可以参考这里
https://blog.csdn.net/malcolm_110/article/details/107222944 -
Creak block design
-
添加zynq block
-
添加一个AXI_GPIO模块
-
添加点击自动布线
在弹出窗口中打勾
-
效果如下,我们可以看到系统会
自动添加了一个AXI转换器
,一端连接到了ARM核,一端连到了AXI的设备上,我们这里用的是GPIO设备。如果AXI总线上挂多个从设备,只需要双击AXI Interconnect,重新配置端口数即可。本例中设置2个从设备,一个做GPIO输出用,另一个连接RAM。
-
可以点击Regenerate Layout ,让模块重新布局。
-
添加一个ILA模块,功能相当于内置的逻辑分析仪,用来在线监测数据
时钟连到系统时钟上,输入信号连到AXI的第二路从口上。
-
继续添加一个VIO 模块,监测IO的输出情况。修改配置,只需要输入,4bit位宽;不需要输出。连好线。
记得配置一下arm核的参数,ddr型号/延时数据等
设置后,点击validate design -
修改axi io端口为 axi_lite 类型,并关联时钟
在地址空间分配上,可以选择自动,深度可以选择为4k -
建立工程的头文件
12. 执行编译
-
接下来进行PL端的开发,Add Sources,创建一个空的verilog文件,可以命名为soc_axi_ctrl.v。
-
双击design_system_wrapper 可以弹出一个IP工程的verilog文件,我们把这个文件的端口例化到soc_axi_ctrl.v。
-
创建一个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
- 添加管脚约束文件,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]}]
- 编译
编译过程有点长,我们可以查看一些编译状态
====================================
- 信息导入到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,添加多个信号
设置监测条件
设置监测长度
点击运行