ZYNQ系列固化 手把手教会你FLASH固化ZYNQ

简介

        本文针对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秒间隔闪烁。

        系统点灯的实验完成。

        

Zynq是一种基于Xilinx的可编程SoC(片上系统),它结合了一个双核ARM处理器和可编程逻辑(FPGA)的能力。固化程序到flash是指将FPGA的程序(比特流文件)保存在外部闪存中,以便在系统上电时可以自动加载并执行。 Zynq芯片通常带有内置的非易失性存储器(如flash存储器),用于存储引导程序和其他重要的配置信息。在将程序固化flash之前,首先需要生成比特流文件,该文件包含了FPGA逻辑的配置信息。可以使用Xilinx提供的开发套件(如Vivado)来生成比特流文件,该套件可以对FPGA逻辑进行综合、布局和路由,最终生成比特流文件。 一旦生成了比特流文件,就可以将其写入到Zynq芯片的flash存储器中。这通常需要使用专用的硬件工具,如JTAG调试器或外部编程器。通过这些工具,可以将比特流文件加载到Zynq芯片的闪存中,并设置相应的配置选项,以确保在系统上电时FPGA能够正确地加载和配置。 固化程序到flash的好处是可以在系统开机时自动加载FPGA程序,而无需通过外部设备进行手动配置。这提供了更加灵活和方便的方式来实现硬件功能定制和重配置。此外,固化程序到flash还可以节省时间,因为无需每次开机时都手动加载FPGA程序。 总的来说,将Zynq固化程序到flash存储器中是一种常用的做法,它提供了一种方便的方式来保存和自动加载FPGA程序,以满足不同应用需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值