简介
本文针对ZYNQ系列PS端可以无工程或者不带操作系统的环境下固化程序。
实验任务
ZYNQ开发板上电后FPGA LED以1S循环亮灭。
设计FPGA工程
1、创建工程,以xc7z020clg400-2 (active)型号为例,Vivado为2020.2版本;
2、设计代码,顶层文件设置为led.v文件,代码如下:
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2024/09/14 09:35:37
// Design Name:
// Module Name: led_top
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
module led_top(
input sys_clk,
input sys_rst_n,
output reg led
);
reg[31:0] cnt;
always@(posedge sys_clk or negedge sys_rst_n)begin
if(sys_rst_n == 'D0)begin
led <= 'd0;
cnt <= 'd0;
end
else if(cnt >= 'd100_000_000)begin
led <= ~led;
cnt <= 'd0;
end
else begin
cnt <= cnt + 'd1;
end
end
endmodule
3、创建Block Design,如下图所示:
添加IP,生成一个ZYNQ IP核,再对该核做配置。
(1)使能FLASH启动控制。
(2)选择硬件匹配的DDR3配置,注意这里必须选择所对应的DDR3,网上很多没有提到这一步会导致FPGA FLASH无法正常启动。
(3)其他的驱动不做使用,点击生成ZYNQ IP,并将固定接口映射输出,选择接口右键2选择Make Extemal生成对外接口,如下图所示:
(4)将Block Design生成顶层文件,如下图所示:
自动生成的代码如下:
//Copyright 1986-2020 Xilinx, Inc. All Rights Reserved.
//--------------------------------------------------------------------------------
//Tool Version: Vivado v.2020.2 (win64) Build 3064766 Wed Nov 18 09:12:45 MST 2020
//Date : Fri Apr 19 15:38:59 2024
//Host : LPA0157 running 64-bit major release (build 9200)
//Command : generate_target sys_ps_wrapper.bd
//Design : sys_ps_wrapper
//Purpose : IP block netlist
//--------------------------------------------------------------------------------
`timescale 1 ps / 1 ps
module sys_ps_wrapper
(DDR_addr,
DDR_ba,
DDR_cas_n,
DDR_ck_n,
DDR_ck_p,
DDR_cke,
DDR_cs_n,
DDR_dm,
DDR_dq,
DDR_dqs_n,
DDR_dqs_p,
DDR_odt,
DDR_ras_n,
DDR_reset_n,
DDR_we_n,
FIXED_IO_ddr_vrn,
FIXED_IO_ddr_vrp,
FIXED_IO_mio,
FIXED_IO_ps_clk,
FIXED_IO_ps_porb,
FIXED_IO_ps_srstb);
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;
wire [14:0]DDR_addr;
wire [2:0]DDR_ba;
wire DDR_cas_n;
wire DDR_ck_n;
wire DDR_ck_p;
wire DDR_cke;
wire DDR_cs_n;
wire [3:0]DDR_dm;
wire [31:0]DDR_dq;
wire [3:0]DDR_dqs_n;
wire [3:0]DDR_dqs_p;
wire DDR_odt;
wire DDR_ras_n;
wire DDR_reset_n;
wire DDR_we_n;
wire FIXED_IO_ddr_vrn;
wire FIXED_IO_ddr_vrp;
wire [53:0]FIXED_IO_mio;
wire FIXED_IO_ps_clk;
wire FIXED_IO_ps_porb;
wire FIXED_IO_ps_srstb;
sys_ps sys_ps_i
(.DDR_addr(DDR_addr),
.DDR_ba(DDR_ba),
.DDR_cas_n(DDR_cas_n),
.DDR_ck_n(DDR_ck_n),
.DDR_ck_p(DDR_ck_p),
.DDR_cke(DDR_cke),
.DDR_cs_n(DDR_cs_n),
.DDR_dm(DDR_dm),
.DDR_dq(DDR_dq),
.DDR_dqs_n(DDR_dqs_n),
.DDR_dqs_p(DDR_dqs_p),
.DDR_odt(DDR_odt),
.DDR_ras_n(DDR_ras_n),
.DDR_reset_n(DDR_reset_n),
.DDR_we_n(DDR_we_n),
.FIXED_IO_ddr_vrn(FIXED_IO_ddr_vrn),
.FIXED_IO_ddr_vrp(FIXED_IO_ddr_vrp),
.FIXED_IO_mio(FIXED_IO_mio),
.FIXED_IO_ps_clk(FIXED_IO_ps_clk),
.FIXED_IO_ps_porb(FIXED_IO_ps_porb),
.FIXED_IO_ps_srstb(FIXED_IO_ps_srstb));
endmodule
4、创建顶层文件并例化sys_ps_wrapper和LED代码,如下图所示:
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2024/04/17 10:44:59
// Design Name:
// Module Name: top
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
module top(
DDR_addr,
DDR_ba,
DDR_cas_n,
DDR_ck_n,
DDR_ck_p,
DDR_cke,
DDR_cs_n,
DDR_dm,
DDR_dq,
DDR_dqs_n,
DDR_dqs_p,
DDR_odt,
DDR_ras_n,
DDR_reset_n,
DDR_we_n,
FIXED_IO_ddr_vrn,
FIXED_IO_ddr_vrp,
FIXED_IO_mio,
FIXED_IO_ps_clk,
FIXED_IO_ps_porb,
FIXED_IO_ps_srstb,
clk_in,
led
);
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;
input clk_in;
output led;
wire [14:0]DDR_addr;
wire [2:0]DDR_ba;
wire DDR_cas_n;
wire DDR_ck_n;
wire DDR_ck_p;
wire DDR_cke;
wire DDR_cs_n;
wire [3:0]DDR_dm;
wire [31:0]DDR_dq;
wire [3:0]DDR_dqs_n;
wire [3:0]DDR_dqs_p;
wire DDR_odt;
wire DDR_ras_n;
wire DDR_reset_n;
wire DDR_we_n;
wire FIXED_IO_ddr_vrn;
wire FIXED_IO_ddr_vrp;
wire [53:0]FIXED_IO_mio;
wire FIXED_IO_ps_clk;
wire FIXED_IO_ps_porb;
wire FIXED_IO_ps_srstb;
wire PS_CLK;
wire PS_RST_N;
wire sys_clk;
wire sys_rst_n;
wire pll_rst_n;
reg[31:0] cnt;
wire reg_rst_n;
assign sys_rst_n = pll_rst_n;
sys_ps_wrapper sys_ps_wrapper_inst(
.DDR_addr(DDR_addr),
.DDR_ba(DDR_ba),
.DDR_cas_n(DDR_cas_n),
.DDR_ck_n(DDR_ck_n),
.DDR_ck_p(DDR_ck_p),
.DDR_cke(DDR_cke),
.DDR_cs_n(DDR_cs_n),
.DDR_dm(DDR_dm),
.DDR_dq(DDR_dq),
.DDR_dqs_n(DDR_dqs_n),
.DDR_dqs_p(DDR_dqs_p),
.DDR_odt(DDR_odt),
.DDR_ras_n(DDR_ras_n),
.DDR_reset_n(DDR_reset_n),
.DDR_we_n(DDR_we_n),
.FIXED_IO_ddr_vrn(FIXED_IO_ddr_vrn),
.FIXED_IO_ddr_vrp(FIXED_IO_ddr_vrp),
.FIXED_IO_mio(FIXED_IO_mio),
.FIXED_IO_ps_clk(FIXED_IO_ps_clk),
.FIXED_IO_ps_porb(FIXED_IO_ps_porb),
.FIXED_IO_ps_srstb(FIXED_IO_ps_srstb)
);
sys_pll sys_pll_inst
(
// Clock out ports
.clk_out1(sys_clk),
// Status and control signals
.resetn('d1),
.locked(pll_rst_n),
// Clock in ports
.clk_in1(clk_in)
);
led_top led_top_inst(
.sys_clk(sys_clk),
.sys_rst_n(sys_rst_n),
.led(led)
);
endmodule
5、添加XDC约束文件,这里只针对FPGA接口,如下:
set_property PACKAGE_PIN U18 [get_ports clk_in]
set_property IOSTANDARD LVCMOS33 [get_ports clk_in]
set_property -dict {PACKAGE_PIN J16 IOSTANDARD LVCMOS33} [get_ports led]
6、编译代码,点击Generate Bitstream,生成bit文件,如下图所示:
设计Vitis工程
选择生成XSA文件,如下图所示:
选择包含bit文件,如下图所示:
选择XSA文件生成路径,默认路径即可,如下图所示:
打开Vitis软件,如下图所示:
初次打开选择创建工程,如下图所示:
点击NEXT
选择由XSA创建生成一个平台,如下图所示:
1、选择XSA生成平台;
2、上面生成XSA的路径选择;
3、勾选之后, 软件会自动在硬件平台工程里生成 fsbl 的相关文件
4、平台名称;
5、设置完毕点击NEXT。
设置工程名称,如下图所示:
连续点击NEXT,生成的工程会有系统自带的一些DEMO,我们这里选择空工程,如下图所示:
设置完成后,生成的工程如下图所示,并选择编译:
点击头文件(这里必须选择头文件,不然系统不会自动寻找路径)选择生成烧录文件,如下图所示:
这里引文Vitis是空工程,所以没有软件文件,如下图所示:
到这里已经生产烧录的BIN文件了,接下来对ZYNQ进行烧录,烧录的时候ZYNQ选择JTAC模式,烧录选择如下:
系统会自动寻找路径,点击烧录,如下图所示:
代码烧录完成提示如下:
设计验证结果
将ZYNQ选择到QSPI启动模式重新上电,现象如下:
可以看到 PL端LED灯以1秒间隔闪烁。
系统点灯的实验完成。