zynq 7000 的流水灯实验是最简单的纯PL 的实验, helloworld 是SDK下的最简单实验,但不包括任何PL。
本文是这2者综合下的最简单实验, PS 和 PL 都有的情况下最简单实验。其结果与流水灯实验一样,但是通过SDK的方式来实现。
本实验的前提是做过上面2个实验。否则看不懂的话,请参考我的上面2文,操作细节在这里可能没有描述那么清楚。
1:创建工程,取名led_sdk, 注意选择好FPGA器件 , 我的是 xc7z010clg400-1。工程的创建详情可以查看zynq 7000 的流水灯实验,或者helloworld 实验。
2:原理图设计
左边Flow Navigator里, IP INTEGRATOR下点击 Create Block Design, 对话框中输入原理图名 system。
在原理图中点击+ 添加IP 核,这里有很多Xilinx提供的IP,我们找到ZYNQ7 Processing System 并双击 添加,不要选择后面带BFM(总线功能模型)的,带BFM的IP 为先前的IP处理器版本。
再添加axi gpip 的ip核。
3:配置
双击Diagram界面里的ZYNQ Processing System,打开ZYNQ系统的配置界面。
DDR 配置是与硬件相关的,查看你的硬件资料,准确选择,这是我板的情况 MT41K128M16-JT。
时钟设置,输入频率可能也与硬件相关。FCLK_CLK0 这里要勾取,因为有PL 需要。
这里也要勾取。
这里和helloworld 一样,选取串口,与硬件有关,查看你板子设计情况。这个应该可以不选,但想查看输出信息就需要,方便调试。
led 只是用了4位,并且全部是输出,所以需要点击axi_gpio 设置如下:
上面2个ip 设置好后,点击下面2处。
Run Connection时:
都连接好,就是这样的原理图了。
点击一下,看看地址分配,记下这个地址。
3: 生成 HDL 文件
按下图依次点击(右击 system.bd),Create HDL Wrapper 和 Generate Output Products。
查看下io端口的名字, 在 system_wrapper.v 中:
添加约束文件led_sdk.xdc,文件内容如下:
set_property PACKAGE_PIN J16 [get_ports {gpio_rtl_0_tri_o[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {gpio_rtl_0_tri_o[0]}]
set_property PACKAGE_PIN K16 [get_ports {gpio_rtl_0_tri_o[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {gpio_rtl_0_tri_o[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {gpio_rtl_0_tri_o[2]}]
set_property PACKAGE_PIN H15 [get_ports {gpio_rtl_0_tri_o[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {gpio_rtl_0_tri_o[3]}]
set_property PACKAGE_PIN G15 [get_ports {gpio_rtl_0_tri_o[2]}]
4个led 对应哪4个端口,请查核你的硬件设计。gpio_rtl_0_tri_o则是我们在上面system_wrapper.v 看到的端口名。
产生比特流:
点击产生比特流,需要好些时间。细节可以对照zynq 7000的流水灯实验一文。
4:SDK 部分:
然后输出硬件,菜单 File ->Export ->Export Hardware
弹出对话框时,记得勾取包含比特流,如下,因为有PL 硬件。
FIle ->Launch SDK就进入SDK编程阶段
在SDK 里, 菜单 File -> New -> New application Project
出现对话框,输入工程名,检查硬件平台,虽然我是输入了SDK 但他还有一些自定义板的,一不小心硬件平台还不与你的一致。这里小心一点。
OS Platform 选 standalone
样板取 hello World或者Empty Application
5: 把下面代码替代你helloworld.c 文件内容
#include
//#include "platform.h"
#include "xparameters.h"
#include "xil_io.h"
#define MY_IP 0x41200000 //0x43c00000
int main()
{
//init_platform();
print("Hello World\n\r");
u32 Delay;
u32 Ledwidth;
while (1)
{
for (Ledwidth = 0x0; Ledwidth < 4; Ledwidth++)
{
Xil_Out32(MY_IP,1 << Ledwidth);
printf("led=%x\n\r",1<
}
}
//cleanup_platform();
return 0;
}
保存文件并编译连接,右键你的工程,选 Build Project
然后右键你的工程,选 Run As -> 1: Launch on hardware(System Debugger)
如果你像 helloworld 那样连接usb 转串口线,就可以在终端上看到 hello world。 同时4个led 像流水一样依次点亮。
改变Delay < 28000000这个数据,可以控制流动的快慢。
实验就做完了。