1、创建镜像文件
2、依顺序放入fsbl的elf文件,bit流文件,cpu0的elf文件,cpu1的elf文件(顺序不能变)
SD卡
将生成的boot.bin放入SD卡,名字一定不能改
生成boot.bin的同时还会生成一个.bif文件,这是路径文件,可以通过
Flash
只有PL端代码
Vivado操作
1、创建block design工程
2、加入zynqIP核
- DDR类型和板子统一
- 点上QSPI使能,SD0使能,UART0使能(为了打印BootLoader的信息),将QSPI和SD0改成fast
- 去掉多余的接口
- Bank1电压设置成 LVCMOS1.8V, 根据实际硬件bank电压,我手里是正点原子的板子
- Run Block Automation,生成引脚
3、CTRL+s保存后对黄色的bd(block design)文件Generate Output Products,实际上是先综合ZYNQ这个IP核。再Create HDL Wrapper,我这里是已经生成了顶层的。
4、在.bd文件的顶层中例化你的PL代码顶层模块,如下图
module ultbd_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,
//自己加的引脚
sys_clk ,
sys_rst_n ,
eth_rxc ,
eth_rx_ctl,
eth_rxd ,
eth_txc ,
eth_tx_ctl,
eth_txd ,
eth_rst_n ,
data_in ,
overflow ,
clk_ad ,
gain,
pulse,
uart_tx_out
);
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 sys_clk ;
input sys_rst_n ;
input eth_rxc ;
input eth_rx_ctl;
input [3:0]eth_rxd;
output eth_txc ;
output eth_tx_ctl;
output [3:0]eth_txd;
output eth_rst_n ;
input [11:0]data_in;
input overflow ;
output clk_ad ;
output [6:0]gain;
output pulse ;
output uart_tx_out;
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;
ultbd ultbd_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));
//自行例化的顶层模块
eth_udp_loop u_eth_udp_loop(
.sys_clk (sys_clk ),
.sys_rst_n (sys_rst_n ),
.eth_rxc (eth_rxc ),
.eth_rx_ctl (eth_rx_ctl ),
.eth_rxd (eth_rxd ),
.eth_txc (eth_txc ),
.eth_tx_ctl (eth_tx_ctl ),
.eth_txd (eth_txd ),
.eth_rst_n (eth_rst_n ),
.data_in (data_in ),
.overflow (overflow ),
.clk_ad (clk_ad ),
.gain (gain ),
.pulse (pulse ),
.uart_tx_out(uart_tx_out)
);
endmodule
5、以bd文件的wrapper为顶层,最后生成的等级关系应如下
6、重新生成bitstream后,导出Hardware文件,要勾选include bitstream。这个就是.xsa文件,就是vitis需要的硬件平台
7、启动Vitis(从vivado启动可以选择workspace,建议自己在工程文件夹下创一个vitis的文件夹)
vitis操作
1、建一个新的Application Project,最后选择Zynq FSBL模板
2、此时应该有wrapper.xsa硬件平台和fsbl工程,右键编译如下FSBL工程
3、为了串口能够打印出 bootloader 的信息,在 fsbl_debug.h 文件里添加一条语句,定义一下“FSBL_DEBUG_INFO”常量。修改后保存,重新编译一下 fsbl 项目
4、先板子上电,JTAG模式,Run as一下fsbl工程,看是否有问题,此时程序掉电丢失。
5、程序没问题时Create Boot Image,vitis会自动生成bif文件(得断电再点Create Boot Image才会自动生成),只需要Create Image就行。
此处建议单独建一个bootbin文件夹存放bif和Boot.bin文件,当然默认也行
Boot image partitions放文件的顺序是(顺序不能错):
- fsbl.elf文件
- 硬件平台的bit流文件
- 自己生成的fbsl工程的elf文件
参考:详细教程:vivado2019.2 & vitis2019.2下,zynq7000系列FPGA固化PL程序到外挂flash和SD卡_大功率灯泡的博客-CSDN博客_blockdesign例化到顶层
谢谢这个大哥,让我把这个搞出来了