Zynq-7000系列之linux开发学习笔记:HelloWorld(二)

开发板:Zynq7030数据采集板
PC平台:Ubuntu-18.04 + MobaXterm
开发环境:Xilinx Vivado + SDK -18.3
学习目标:Zynq7030数据采集板通过串口输出 “Hello World” 字符串

一、Vivado工程创建

上一篇文章Zynq-7000系列之linux开发学习笔记:开发前准备(一)中,介绍了整个开发环境的搭建过程,所需要的文件都已准备就绪。为了先熟悉Zynq7030在Llinux下开发流程,我们先来从最简单的开发学起:从串口打印出 “Hello World” 字符串。
从VMWare虚拟机进入到Ubuntu系统,然后打开一个终端,输入 vivado 打开软件。
Zynq-7000系列之linux开发学习笔记:HelloWorld(二)
然后点击 Create Project 进入到工程创建向导窗口,点击 Next 按钮进入到下一界面。
Zynq-7000系列之linux开发学习笔记:HelloWorld(二)
这里需要给工程名取为: helloWorld ,工程就放在创建的 /home/claude1009/xc7030/helloworld 目录下,点击 Next 按钮进入到下一界面。
Zynq-7000系列之linux开发学习笔记:HelloWorld(二)
选择创建 RTL Project,然后点击 Next 按钮进入到下一界面。
Zynq-7000系列之linux开发学习笔记:HelloWorld(二)
第一个工程,没有别的文件可添加,点击 Next 按钮进入到下一界面。
Zynq-7000系列之linux开发学习笔记:HelloWorld(二)
Zynq-7000系列之linux开发学习笔记:HelloWorld(二)
由于Zynq7030数据采集板是采用 ffg676 封装的7030 FPGA,属于Xilinx的 Zynq-7000 系列,Speed为 -2 。找到对应的芯片后,点击 Next 按钮进入到下一界面。

Zynq-7000系列之linux开发学习笔记:HelloWorld(二)
可以看见整个工程创建的概述,点击 Finish 就完成了工程的创建。
Zynq-7000系列之linux开发学习笔记:HelloWorld(二)

二、系统设计与配置

工程创建完成后,就进入到了系统设计界面,可以看见工程的一些信息。Zynq的系统开发一般都有原理框图的设计,这样可以更直观地对系统的各硬件模块进行连接。点击 Create Block Design 按钮,设计命名为 helloWorld ,然后进入到原理图设计界面,通过添加特定的IP来实现特定的功能。
Zynq-7000系列之linux开发学习笔记:HelloWorld(二)
点击图中的 + 添加IP,在弹出的窗口里输入 Zynq 就可以看见 ZYNQ7 Processing System,这就是本次开发需要的PS端IP,双击创建即可。
Zynq-7000系列之linux开发学习笔记:HelloWorld(二)
创建后就可以看见如图所示的模块,然后双击模块进行配置。
Zynq-7000系列之linux开发学习笔记:HelloWorld(二)
进入到配置界面就可以看到整个Zynq7000系列的架构框图。
Zynq-7000系列之linux开发学习笔记:HelloWorld(二)
选中 PS-PL Configuration ,然后展开选项,图中的 FCLK_RESET0_N M AXI GP0 interface 两个选项目前用不到,将框中的勾去掉即可。
Zynq-7000系列之linux开发学习笔记:HelloWorld(二)
选中 Peripheral I/O Pins ,然后展开选项:将图中的 UART1 选中即可,核对一下UART1的MIO引脚是否能与板上的硬件原理图对应上。
Zynq-7000系列之linux开发学习笔记:HelloWorld(二)
选中 MIO Configuration ,然后展开选项:可以看到刚才选中的 UART1 引脚信息。这里注意:要把 Bank 0 Bank 1 的IO标准选择为 LVCMOS 1.8V 。因为在硬件设计时,这两个Bank的电压都是1.8V,所以还是要依据硬件设计来配置此处的电压标准。
Zynq-7000系列之linux开发学习笔记:HelloWorld(二)
选中 Clock Configuration ,然后展开选项。核对图中的时钟频率是否为33.3333MHz,根据硬件设计来确定。并将图中 FCLK_CLK0 的勾去掉。
Zynq-7000系列之linux开发学习笔记:HelloWorld(二)
选中 DDR Configuration ,然后展开选项。根据硬件设计中所选择的DDR型号,在 Memory Part 中选择对应型号。如果没有的话,可以选择相似的型号。
Zynq-7000系列之linux开发学习笔记:HelloWorld(二)
配置完成后,可以得到如图所示的IP模块,点击 Run Block Automation 进行自动布线。
Zynq-7000系列之linux开发学习笔记:HelloWorld(二)
Zynq-7000系列之linux开发学习笔记:HelloWorld(二)
布线完成后,在左边的 Sources 栏中,右键工程,按图中所示顺序进行操作即可。
Zynq-7000系列之linux开发学习笔记:HelloWorld(二)
Zynq-7000系列之linux开发学习笔记:HelloWorld(二)
最后就可得到如图所示的原理框图设计,检查一下就可以关闭此界面。
Zynq-7000系列之linux开发学习笔记:HelloWorld(二)
退出刚才界面后,点击图中 Generate Bitstream 按钮生成Bitstrem。
Zynq-7000系列之linux开发学习笔记:HelloWorld(二)
在等待一段时间后,Bitstream生成完成。在主界面中,可以看到本工程使用的一些资源。
Zynq-7000系列之linux开发学习笔记:HelloWorld(二)
然后点击 File -> Export -> Export Hardware ,导出硬件配置,并在 Include bitstream 选项上打勾。
Zynq-7000系列之linux开发学习笔记:HelloWorld(二)
Zynq-7000系列之linux开发学习笔记:HelloWorld(二)
最后点击 Launch SDK 即可启动SDK。
Zynq-7000系列之linux开发学习笔记:HelloWorld(二)

三、SDK软件编程

进入到SDK软件界面后,自动加载Vivado工程里面的配置。然后便可看见软件工程的一些地址信息。
Zynq-7000系列之linux开发学习笔记:HelloWorld(二)
点击 File -> New -> Application Project ,创建一个应用工程,命名为 helloworld ,然后点击 Next
Zynq-7000系列之linux开发学习笔记:HelloWorld(二)
Xilinx为我们提供了一些软件模板,这里我们使用 Hello World 即可。
Zynq-7000系列之linux开发学习笔记:HelloWorld(二)
创建成功后,在左边的工程目录中多出了两个文件夹: helloworld helloworld_bsp 。展开 helloWorld ,找到src目录下的 helloworld.c 文件,就可以看到自动生成的C代码了。这里我多添加了一行图中所示的代码0.0.0.0.0
Zynq-7000系列之linux开发学习笔记:HelloWorld(二)
C代码搞定后,点击图中所示的图标,打到配置FPGA的界面,点击 Browse 找到在Vivado下生成的Bitstream,该文件在工程目录/ helloworld.runs/impl_1/helloworld_wrapper.bit
Zynq-7000系列之linux开发学习笔记:HelloWorld(二)
Zynq-7000系列之linux开发学习笔记:HelloWorld(二)
最后右键helloworld工程文件夹,选择 Run As -> 1 Launch on Hardware(System Debugger)即可。
Zynq-7000系列之linux开发学习笔记:HelloWorld(二)
这里要注意的就是,下载调试前要在PC端打开准备好的MobaXterm工具。确认好PC端的串口COM号,点击软件界面中的 Session 创建一个串口连接,波特率为 115200 即可。
等待下载完成后,就可以在MobaXterm里看到串口打印的信息了。
Zynq-7000系列之linux开发学习笔记:HelloWorld(二)
这里再多说一个问题:在本次设计的工程中,系统是怎么知道C代码中的print语句输出字符串到UART1的呢?而不是输出到其它UART口或者是JTAG的Console口?
简单说明一下:在SDK的工程目录中右键 helloworld_bsp ,然后选择 helloworld_bsp -> Board Support Package Settings 。在 Board Support Package Settings 界面里,选择 Standalone ,可以看到 stdin stdout 两项是连接到 ps7_uart_1 的,说明Print凼数输出和输入的对象为UART1。
Zynq-7000系列之linux开发学习笔记:HelloWorld(二)
到此为止,一个最简单的Hello World工程就实现完成了。是不是对整个开发流程有一丢丢的熟悉了呢0.0.0