ZYNQ_MPSOC学习笔记(一)
本系列文章主要介绍阶段性学习ZYNQ_MPSOC所遇棘手问题及其解决办法,此外对于个人遗忘或者未曾学过的一些知识进行补充。
zynq PL端与PS端同时使用
在官方所给教程中,将PL端的LED项目与PS端的hello项目联合烧写到开发板的说法为:
根据本章的 PS 端添加 ZYNQ 核并配置,最简单的方法就是在本章工程的基础上添加 LED 实
验的 verilog 源文件,并进行例化,组成一个系统,并需要生成 bitstream。
由于本人数电知识还是三年前所学,盲目相信了官方说法,直接将引脚绑定文件导入。然而在加入了TOP后,led仅仅只是一个模块,并不能直接与外部连接。所以在top模块的设计时,需要定义led所需输入输出,并将其在例化lde模块时与led的输入输出连接。此处需要注意的是,top模块的output led定义时不能采用reg型,它仅仅是将led的reg型输出通过wire与外部连接,所以在top中,led_top删去了reg,定义为wire型。由于与外部连接的是top模块,那么led.xdc文件中的引脚约束自然也就毫无意义。所以需要修改管xdc文件,将需要的led管脚全部改成top模块的管脚。
最终top.v如下:
module top(
input sys_clk_top,
input rst_n_top,
output [3:0] led_top
);
design_1_wrapper design_1_wrapper_inst();
led led_inst(
.sys_clk(sys_clk_top),
.rst_n(rst_n_top),
.led(led_top)
);
endmodule
top.xdc如下:
set_property PACKAGE_PIN AB13 [get_ports {led_top[3]}]
set_property PACKAGE_PIN AA12 [get_ports {led_top[2]}]
set_property PACKAGE_PIN Y12 [get_ports {led_top[1]}]
set_property PACKAGE_PIN W13 [get_ports {led_top[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led_top[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led_top[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led_top[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led_top[3]}]
set_property PACKAGE_PIN AA13 [get_ports rst_n_top]
set_property PACKAGE_PIN AB11 [get_ports sys_clk_top]
set_property IOSTANDARD LVCMOS33 [get_ports rst_n_top]
set_property IOSTANDARD LVCMOS33 [get_ports sys_clk_top]
create_clock -period 40.000 -name sys_clk_top -waveform {0.000 20.000} [get_ports sys_clk_top]
其余文件不做修改,至此PL端的编写已经完成,烧写到开发板运行正常,可以看见开发板led灯闪烁。接下来是PS端的配置。PS端的配置其实很简单,但是这里有一个误区很容易掉进去,本人在此处浪费了不少时间。由于教程中hello是直接通过创建APP工程导入,此处自然也通过创建APP工程创建,而这也导致出现问题。在创建APP工程的过程中,出现了
ERROR :
org.eclipse.core.runtime.CoreException: CDT Project already configured
查阅资料发现这个问题的原因是自制IP,我并未完全理解其中原理,但是我观察到其实在创建APP工程时,其实是会先生成design的平台的,只是在后续创建hellosystem的时候,全面崩溃,导致平台也被删除。于是突发奇想,先只创建平台工程,在平台的基础上再创建一个APP工程hello,这时终于不再报错了,按流程烧写到开发板可以同时看到led闪烁和串口打印helloworld,至此,PL端与PS的同时使用正式试验成功,过程并不容易。