FPGA系统性学习笔记连载_Day9【xilinx ZYNQ7000系列之《PS端 》串口打印】
本系列为FPGA系统性学习学员学习笔记整理分享,如有学习或者购买开发板意向,可加交流群联系群主。
连载《叁芯智能fpga设计与研发-第9天》 【xilinx ZYNQ7000系列 PS、PL、PS-PL 基本开发流程】 之 《PS端 》【串口打印实验】
原创作者:紫枫术河 转载请联系群主授权,否则追究责任
这篇文章记录ZYNQ7020的PS端的基本开发流程,关于PL端的开发流程,参考之前文章。
本篇文章,以配置一个PS端的UART外设,并打印一句话《hello ZYNQ7020,Author:liushuhe 2020.11.26》来演示
ZYNQ7020的基本开发流程,本篇文章需要一点点的C语言知识,不会也不影响实验的,跟着步骤做就行了。
一、任务分工
ZYNQ 芯片分为 PL 和 PS, PS 端的 IO 分配相对是固定的,不能任意分配,虽然 PS 端的 ARM 是硬核,但是在 ZYNQ 当中也要将 ARM 硬核添加到工程当中才能使用,FPGA 工程师负责把 Vivado 工程搭建好,提供好硬件给软件开发人员,软件开发人员便能在这个基础上开发应用程序 ,软件开发人员,不用关心FPGA的部分。
二、FPGA工程师搭建硬件平台
我们这里演示搭建一个带UART和arm A9处理器的硬件平台
1.1、建立vivado工程
创建一个“ps_uart”的工程,具体过程,参考我文章开头超链接文章;
1.2、点击“Create Block Design”,创建一个 Block 设计,也就是图形化设计
1.3、“Design name”可以不修改,我改成ps_uart便于识别
1.4、点击“Add IP”快捷图标
1.5、搜索“zynq”,在搜索结果列表中双击“ZYNQ7 Processing System
1.6、双击 Block 图中的“processing_system7_0”(直接双击蓝色区域),配置相关参数
1.7、首先出现的界面是 ZYNQ 硬核的架构图,可以很清楚看到它的结构,可以参考 官方文档,在官网搜索ug585 即可
1.8、图中绿色部分是可配置模块,可以点击进入相应的编辑界面
1.9、也可以在左侧的窗口进入编辑 ,下面分别介绍左侧选项代表的功能;
2.0、Zynq 块设计参数配置,单击绿色块右下角,可以进行参数配置
2.1、PS-PL Configuration 配置界面,主要是进行 PS 与 PL 之间接口的配置,主要是AXI 接口,这些接口可以扩展 PL 端的 AXI 接口外设核。
2.2、我们这篇文章是PS开发流程,关于PS-PL Configuration 配置在这里保持默认,在后面的实验中我再补充
2.3、外设配置,ZYNQ 的 PS 端外设很多是复用的 ,同一引脚可以配置为不同的功能
zynq内部只有2个串口,UART0、UART1、我们看UART0可以接在(10、11)/(14、15)/(18、19)/(22、23)/(26、27)
2.4、配置串口,我们的ps_uart需要一个串口来打印消息,查看ZYNQ7020开发板的原理图
从原理图看出,ZYNQ的PS端的串口,连接的是MIO12、MIO13端口,并且电源是3.3v
2.5、从I/O分配看,MIO12、MIO13是串口1,在MIO12、MIO13引脚对应串口上单击,会看见该模块变为绿色,即代表分配成功
关于BANK0、BANK1的电压,由于创龙没有给核心板的原理图,但是给了一个WORD的描述文档,大家也要熟悉这个方式
国内很多厂家都是这样,属于技术保密
按照上述表格分配UART1电压和引脚
2.6、配置 QSPI, QSPI 可以作为 ZYNQ 的启动存储设备, ZYNQ 可以通过读取 QSPI 中存储的启动文件加载 ARM 和 FPGA
从核心板word表格和创龙给的例程,得知我们选择 Quad SPI Flash 为 Single SS 4bit IO
2.7、配置以太网,在 PS 端设计有以太网接口
1、根据原理图选择 Ethernet 0 到 MIO16-MIO27
电压是1.8v
2、配置PHY 寄存器配置接口,选择 MDIO 并配置到 MIO52-MIO53
2.8、配置 USB0 到 MIO28-MIO39
2.9、ZYNQ还可以SD卡启动
查看底板原理图,选择 SD 0,配置到 MIO40-MIO45,选择Card Detection MIO0,用于检测 SD 卡的插入。
1、配置SD0
2、选择Card Detection MIO0,用于检测 SD 卡的插入
3.0、控制剩余未分配的 MIO,用作 GPIO ,打开GPIO MIO, PS 便可以配置
1、双击GPIO MIO当出现打钩的提示时,软件会自动把我们未使用到的IO分配为GPIO
2、到这里引脚分配全部完成,如果以后做实验需要配置其他外设,可以参考这个文章,作相应的修改即可
3.1、MIO 配置
修改 Enet0 的电平标准为 HSTL 1.8V, Speed 为 fast,这些参数非常重要,如果不修改,网络可能不通。其他部分保持默认。
3.2、时钟配置
在“Clock Configuration”选项卡中我们可以配置 PS 时钟输入时钟频率,这里默认是 33.333333,和板子上一致,不用修改,
CPU 频率改为 767Mhz,同时 PS 还可以给 PL 端提供 4 路时钟,频率可以配置,这里不需要,所以保持默认即可。
还有 PS 端外设的时钟等也可以进行配置,这里保持默认。
3.3、DDR3 配置
在“DDR Configuration”选项卡中可以配置 PS 端 ddr 的参数
根据例程,内存芯片我们选择《MT41K256M16 RE-125》,Effective DRAM Bus Width 选择《32bit》
其他部分保持默认,点击 OK
3.4、到这里ZYNQ核的配置完成,我们配置参数及导出硬件信息
1、点击“Run Block Automation”, vivado 软件会自动完成一些导出端口的工作
2、按照默认点击“OK”
3、连接 FCLK_CLK0 到 M_AXI_GP0_ACLK,按 Ctrl S 保存设计
4、选择 Block 设计,右键“Create HDL Wrapper...”,创建一个 Verilog 或 VHDL 文件,为ps_uart生成 HDL顶层文件
5、在弹出对话框,选择让vivado软件自动更新 顶层文件
6、展开设计可以看到 PS 被当成一个普通 IP 来使用 ,之前生成那个顶层文件,其实就是为了把我们的硬件配置
生成一个IP核,供我们调用
7、选择 block 设计,右键“Generate Output Products”,此步骤会生成 block 的输出文件,包括IP,例化模板, RTL 源文件, XDC 约束,第三方综合源文件等等。供后续操作使用。
8、点击“Generate”
9、PS 端的引脚不需要绑定 ,因为在生成的IP文件包含了 PS 端引脚分配的 XDC 文件
在 IP Sources, Block Designs->ps_uart->Synthesis 中,可以看到处理器的 XDC 文件,绑定了 PS 端的 IO,因此不需要再新建 XDC 绑定这些引脚
10、在菜单栏“File -> Export -> Export Hardware...”导出硬件信息,这里就包含了 PS 端的配置信息。
11、在弹出的对话框中点击“OK”
12、因为我们这个实验仅仅是使用了 PS 的串口,不需要 PL 参与,这里就没有使能“Include bitstream” ,关于PS-PL的联合实验,我会另写一篇
13、此时会多出 xx.sdk 文件夹,并且有个 hdf 文件,这个文件就是这个文件就包含了 Vivado 硬件设计的信息,供软件开发人员使用。
14、到此为止, FPGA 工程师工作告一段落,剩下的工作交给ARM软件开发人员。
二、ARM软件编写C语言程序,在串口打印一句话《hello ZYNQ7020,Author:liushuhe 2020.11.26》
1、点击 Vivado 菜单“File -> Launch SDK”,启动 SDK
2、在弹出的对话框选择OK
3、启动 SDK 后我们会看到一个文件夹,有一个名为"system.hdf”文件,这个文件就包含了
Vivado硬件设计的信息,可以给软件开发使用,也可以看到 PS 端外设的寄存器列表。
4、在 SDK 的菜单“New -> Application Project”,建立一个 APP 工程
在弹出的对话框中,“Project name”填写“ps_uart_hello”,硬件平台选择我们自己定义的ps_uart_wrapper_hw_platform
语言C、其他默认,点击“Next”
5、模板选择《hello world》,点击Finish
6、可以看到 SDK 创建了一个“ps_uart_hello”目录,还有一个“ps_usrt_hello_bsp”的目录,在“ps_usrt_hello_bsp”目录中可以找到很多有用的信息,软件开发人员比较清楚,BSP也就是 Board Support Package板级支持包的意思,里面包含了开发所需要的驱动文件,用于应用程序开发。
7、双击“system.mss”,还可以看到有些 PS 外设还提供了例程,这是用来了解学习这些外设的
第一手资料。驱动文档说明可以在 Documentation 中找到。通过 Import Examples 引入官方
例子,加快学习。
8、连接 JTAG 线到开发板、 UART 的 USB 线到 PC
9、打开串口终端调试工具, 串口根据电脑的COM口设置,波特率设置为115200
10、将开发板的启动模式设置到 JTAG 模式
开发板设置拨码为【 010101(1~6 JTAG 模式)】、【 100101(1~6 QSPI 模式)】、【101001(1~6 SD卡模式】
11、给开发板上电,准备运行程序
1、修改helloword.c,将printf打印修改为printf("hello ZYNQ7020,Author:liushuhe 2020.11.26n");
2、编译代码,右键单击ps_uart_hello,在弹出的列表选择Build Project,编译完成可以看看没有报错
12、选择“ps_uart_hello”,右键“Run as”,选择第一个“Launch on Hardware(SystemDebuger)”,使用系统调试,直接运行程序。
13、可以看到串口没有任何输出
14、为了保证系统的可靠调试,需要添加一个配置,右键“Run As -> Run Configuration...”
15、选择“Reset entire system”复位整个系统,如果系统中还有 PL 设计,还必须选择“Program FPGA”,再次点击“Run”
16、点击“OK”,确认重新运行
17、这次就可以看到熟悉《hello ZYNQ7020,Author:liushuhe 2020.11.26》显示出来了
三、Debug调试
1、除了“Run As”,还可以“Debug As”,这样可以设置断点,单步运行
2、进入 Debug 模式 ,程序会自动运行到main函数处
3、和其他开发工具一样,我们也可以逐步运行、设置断点
4、窗口右上角,有2个按钮可以方便我们在debug和编辑模式之间进行切换
四、到此,关于ZYNQ7020 的PS端基本开发流程,全部跑通,关于PS-PL的联合实验,待我另写一篇。