一、建立工程-vivado
虽然是ARM端的开发,但是需要先在VIVADO端进行硬件平台的创建,再设立好工程路径、工程名,选择好对应芯片即可(不创建任何.v文件),如下图所示。
首先,对于ZYNQ而言,其实ARM端才是主设备,FPGA更多充当了从设备的概念。点击Create Block Design,添加ZYNQ设备,注意在前文中已选定好芯片信号为ZYNQ7系列,此时下面的ultra系列都是无法使用的。
其次介绍一下所放设备对应的输入输出:
M_AXI_GP0_ACLK | 当ARM作为主设备时,输出的时钟(AXI设备) |
DDR FIXED_IO | 即DDR3设备,与片外DDR相连 |
固定IO,不管 | |
FCLK_CLK0 | 输出一个时钟供其他模块使用(普通设备) |
FCLK_RSET0_N | 输出一个复位供其他模块使用(普通设备) |
所以,当只使用PS时,可以去掉M_AXI_GP0_ACLK、FCLK_CLK0、FCLK_RSET0_N。而对于DDR和FIXED_IO,无需去理会,对于DDR3而言,只要你设定好DDR的芯片型号、供电等各类参数即可,无需进行引脚约束,因为其FPGA设计而言已经固定好,所以免去此约束。但是对于DDR4而言,需要手动约束引脚。
1、修改:PS引脚号、DDR芯片、增删信号复位线、增删PL-PS交互内容。
(1)PS引脚号:查看设备原理图对应PS的MIO号,采用的是MIO14 15。设定115200波特率。
(2)DDR芯片:设定芯片号、供电等参数。
(3)删信号复位线、AXI接口:删除给PL的时钟、复位,若在此给50MHz,对于PL设计而言,无需再采用外部输入的时钟、复位
设定完后,点run auto连接即可。
2、VIVADO全操作
validate design→generate output→create hdl wrapper→综合生成bit流→导出硬件设备。
(1)validate design:初步验证BD文件设计的正确性,弹出无误。一般有问题的话,检查模块时钟和所接时钟是否一致等问题。
(2)generate output:生成输出文件,即放置的这些模块产生对应IP模块。
(3)create hdl wrapper:可以理解为创建顶层文件,即例化BD文件,将BD文件的输入、输出,连接到顶层,从而可以构成约束文件。
(4)综合-引脚约束,此时的DDR已默认分配了,无需进行。生成bit流,此时的工程无PL端,故无需生成,直接导出即可。
(5)导出:File > Export > Export hardware,因为无PL、无bit文件,可以不包含,导出后,launch SDK即可。
二、建立SDK工程
刚才导出了硬件,其对应了所设定的PS的各个参数,在此参数的基础上,编写应用层代码:创建工程、编译、下载。
(1)创建工程:随便起名字,需无中文,左边为刚才导出的硬件平台,第二个board support package为板级支持包,其包含了所需要用到的各类底层库,例如内存读写等。
(2)编译:直接在helloword.c的基础上修改即可。
蓝色为应用层,为用户编写的代码,一般都是在src,可以自己写很多库,放在includes。红色为板级支持包,不支持修改,即使你双击里面的文件修改,在编译后会恢复到默认,因为是支持底层的库。黄色为硬件平台,比如设定的串口、DDR资源等。
Ctrl+S就是保存+编译,无误后,可以烧录进板子。最好选中复位系统,因为没有bit流,不再对FPGA烧写。
三、效果
#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"
char temp[20];
int main()
{
init_platform();
print("Hello World\n\r");
while(1)
{
scanf("%s",temp);
printf("你刚才发送了:%s",temp);
}
cleanup_platform();
return 0;
}