ZYNQ仅有PL端逻辑的程序固化
ZYNQ仅有PL端逻辑的程序固化
ZYNQ中PL端led灯的逻辑固化
之前看程序固化,教程大多是PS端中有要实现的代码的固化,我没怎么看明白,如果我程序只有 PL 端的写的Verilog逻辑,没写PS端的相关程序该怎么固化程序,昨天试了半天,实现了一个简单的led的逻辑固化。
须知
- 不带ARM的FPGA固化是没问题的,但是对于 ZYNQ 来说,必须要有 PS 端的配合才能固化程序。
- 安装 Vivado 软件的时候一定要安装 SDK,在启动 SDK 软件前就有 sdk 目录,可能会导致无法启动 SDK,删除这个目录再试。
- 准备好PL端LED的程序,这里用的开发板的实验教程:
*新建工程以及创建 Verilog HDL 文件
module led1(
input sys_clk,
input rst_n,
output reg [3:0] led
);
reg[31:0] timer_cnt;
[email protected](posedge sys_clk or negedge rst_n)
begin
if (!rst_n)
begin
led <= 4’d0 ;
timer_cnt <= 32’d0 ;
end
else if(timer_cnt >= 32’d49_999_999)
begin
led <= ~led;
timer_cnt <= 32’d0;
end
else
begin
led <= led;
timer_cnt <= timer_cnt + 32’d1;
end
end
endmodule
*添加管脚约束这里管教的约束必须与你的开发板原理图相对应
保存IO Ports之后会生成xdc文件
*添加时序约束
完成时序约束后的xdc文件会更新
生成vivado端的bit文件
注意这里不能直接用led1.v来直接生成bit文件,还需要做其他的准备!
1.创建块设计(Create Block Design)
点加号输入zynq搜索ip,然后双击或回车确认
双击该模块,开始设置
点击 Peripheral I/O Pins ,会出现以下的 IO 配置界面。
点亮下面Quad SPI Flash,SD0,还有UART1
展开SD0不要遗漏点亮card detect中的47
MIO Configuration选项中
修改 Quad SPI Flash 和SD0 speed为fast,
以及bank1 IO Voltage为LVCOMS1.8V
确认CLOCK和DDR
memory part需要修改为你的开发板采用或推荐的型号
完成后 Run Block Automation
这两个脚可能需要连线,有的教程没有这一步,开发板入门教程连起来了,但是如果不连起来,可能会报错,可能与版本有关
在 Source 窗口中选中 ledBD.bd,右键并先后选择Generate Output Projects 和 Create HDL Wrapper 选项操作。生成后如下图所示:
2.例化
就是把led1.v写进ledDB_wrapper.v
双击ledDB_wrapper.v,修改
修改后的代码(粗体处是新加的led.v部分,其他地方默认不用改):
module ledBD_wrapper
(rst_n,
sys_clk,
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,
led);
input rst_n;
input sys_clk;
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 [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 rst_n,sys_clk;
wire [3:0] led;
led1 led1
(
.sys_clk(sys_clk),
.rst_n(rst_n),
.led(led)
);
ledBD ledBD_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
重新编译一下工程,生成 bit 文件。
转入SDK
1. Launch SDK
1.再导出硬件,选择菜单 File->Export->Export Hardware…导出,包含bitstram 文件。
2.硬件导出后,选择菜单 File->Launch SDK,启动 SDK 开发环境
3.点击菜单 File -> New -> Application Project,新建一个名为 fsbl 的 APP, 会出现1 个 hardware platform:ledBD_wrapper_hw_platform_0,大概选最新最上面那个就好(图上的platform可能不一致)。
选择zynq fsbl
右键fsbl,然后选择creat boot image
下方方框出现两个文件即正常,bootloader在上,bit文件在下,可能有延迟 稍等或请重试
点击creat image
2.写入flash
点击xlinx-program flash
image file选择上一步生成的bin文件!
fsbl file 使用开发板赠送资料中的厂商定制的fsbl
关于定制版本 fsbl 的来源,可以参考 xilinx 官网链接:
https://www.xilinx.com/support/answers/70148.html
(如果链接失效,可以在 xilinx 官网搜索 AR# 70148)
如果使用 Vivado 2019.1 及以后版本就不需要这个定制的 fsbl,用自己生成的 fsbl 即可。
等待烧写完成后,设置启动模式为 QSPI(不同厂商可能不同,我这里的是调整插销位置来实现的),再次启动,观测到灯正常运行。
参考
1.https://blog.****.net/taowei1314520/article/details/78595482
2.https://www.cnblogs.com/ylsm-kb/p/9456534.html
3.https://blog.****.net/fengyuwuzu0519/article/details/80411894
4.AX7015教程(开发板厂商赠的)