从今天开始,凌霄工作室持续更新对发行的zynq 7020开发板进行教程编写。本篇文章主要讲述zynq 7020 PS端的GPIO操作,点亮硬件上的LED灯。文章中使用的开发工具为xilinx的Vivado 2018.3,嵌入式开发工具使用的是和vivado版本对应的SDK 2018.3。请大家自行安装开发工具。
首先打开安装好的vivado 2018.3软件,创建工程。
打开软件后选择Next。
在下面这一页中,需要输入工程路径和工程名称。需要注意的是,这里的工程路径和工程名称不能出现汉字,只支持英文名称和路径,否则后续编译会出错。输入工程路径和工程名称后,点击Next。
工程类别选择默认的RTL Project就行,本页不做修改,点击Next。
接下来需要给工程添加源文件,我们目前没有源文件,所以还是点击Next。
再下一页是添加FPGA的引脚约束文件,我们这里是第一次创建工程且不涉及到PL端的操作,所以这里也不添加,点击Next。
接下来是器件选择栏,这里比较重要,型号千万不能选错,需要和硬件上的ZYNQ/FPGA型号选择一致。Family选择Zynq-7000大的系列,Package选择clg484封装,Speed选择-2。此时底下Part会出现待选器件型号,我们选择xc7z020clg484-2,和开发板上的实际型号保持一致。选择结束后点击Next。
这一页需要确认信息是否和开发板上的器件型号一致,若不一致,点击Back返回重新选择,确认没问题,点击Finish。
此时便进入vivado开发界面。
进入这个界面后,我们需要开发操作PS端的GPIO,需要新建Block,点击Create Block Design,之后进入输入Block名称界面,可保持默认。
进入Block设计界面后,我们点击图片中的两个+号都可以,点击后输入zynq,选择ZYNQ7 Processing System,双击加入界面。
zynq 模块添加进来后,需要对模块进行配置,此时双击ZYNQ模块,进入配置界面。首先配置DDR接口,Enable DDR需要勾选,Memory类型选择DDR3,Memory型号选择MT41K256M16-125,Memory总线宽度选择32bit。
然后选择外设IO引脚界面,在这里需要选择QSPI Flash外设,选择这个的原因是后续需要把程序固化在开发板的Flash中,断电后程序不丢失,再次上电可运行断电前固化的程序;这里还有需要选择Bank0和Bank1的电平,Bank0选择LVCMOS3.3V,Bank1选择LVCMOS1.8V,这里的电平选择是和开发板硬件设计上对应的,需要和硬件保持一致。
接下来进入MIO配置界面,在这个界面中,我们点开GPIO选项,勾选GPIO MIO选项即可,其他的不需要操作。
在Clock配置界面,点开PL Fabric Clocks选项,取消FCLK_CLK0的对勾,因为本设计中不牵扯FPGA端程序开发,所以不需要给FPGA端提供时钟。
最后一项是PS和PL端高速数据传输选项,我们不使用,所以也把对钩取消。
以上页面全部按照说明配置操作完毕后,点击底下的OK选项退出配置界面。此时会看到我们zynq模块上的引脚少了一些,这是因为我们前面把没用的选项对勾已取消。
然后点击Run Block Automation等待vivado进行自动连线和引脚扇出操作。在弹出的界面保持默认,点击OK就行。
自动运行后,界面如下图所示,引出了DDR接口和GPIO接口。然后点击vivado界面左上角的保存按钮。
点击左上角的Project Manager按钮,退出Block绘制界面。此时我们看到Design Sources中已经加入了design_1.bd文件,这个文件里面已经包含了我们前面做的一切配置,但是此时它还不能用,我们需要把它生成verilog语言,然后编译生成bit文件。
首先右键design_1,点击Generate Output Products...。弹出界面选择Generate。
等待生成完成,这里生成的过程时间,取决于工程的大小和电脑的性能。生成完成后,继续右键design_1,点击Create HDL Wrapper...。生成其他模块可调用或直接使用的顶层模块文件。
生成完成后,我们可以看到整个文件层次结构就比较清晰明朗了。
接下来就是生成bit文件。点击下图中的两个按钮,都可以生成bit文件。弹出的对话框选择Yes。等待bit文件生成。
bit文件生成后,弹出提示框,这里我们选择Cancel,不选择Ok。然后点击左上角的File->Export->Export Hardware。
弹出的界面中,我们不勾选Include bitstream选项,因为我们没有对PL端进行任何操作和编程,直接点击Ok就行。
然后继续点击左上角的File->Launch SDK选型,进入嵌入式开发工具SDK界面。弹出的对话框选择Ok就行。
此时会加载SDK界面,加载成功后,进入嵌入式开发界面。SDK界面中,箭头所指的栏就是我们底层的硬件配置。
接下来开始SDK程序的开发。首先新建工程,File->New->Application Project;输入工程名,底下会自动输入BSP的名称;点击Next,我们选择一个空的工程,然后点击Finish。
进入SDK导航栏后,我们看到新增加了两个文件夹,第一个是我们的工程文件夹,第二个是我们的板级支持包BSP文件夹。
点击ps_gpio_task->src,右键src新建main.c源文件,src->New->Source File,输入main.c,点击Finish 。
打开新建的main.c文件,输入以下代码。
这里有个宏定义#define Gpio_0 0,这是和我们的硬件对应的GPIO 位置,硬件上MIO[0]引脚接的是LED灯。MIO[0]控制三极管点亮LED灯,MIO[0]输出低电平时,三极管不导通,LED灯不亮;MIO[0]输出高电平时,三极管导通,LED灯亮。
程序中XGpioPs_LookupConfig(GPIO_DEVICE_ID);XGpioPs_CfgInitialize(&Gpio, ConfigPtr,ConfigPtr->BaseAddr);函数是对ARM的初始化,这是xilinx一贯的做法。接下来的XGpioPs_SetDirectionPin(&Gpio, Gpio_0, 1);XGpioPs_SetOutputEnablePin(&Gpio, Gpio_0, 1);是将MIO[0]的方向设置为输出,并且使能MIO[0]引脚。在while(1)中,首先执行XGpioPs_WritePin(&Gpio, Gpio_0, ~XGpioPs_ReadPin(&Gpio, Gpio_0));这个函数,这个函数的功能是先读取MIO[0]的状态,然后再取反输出,在while(1)前,执行了XGpioPs_WritePin(&Gpio, Gpio_0, 0x0);函数,将MIO[0]输出0电平,所以在while(1)中取反输出就变成了输出1电平,sleep(1)延时1秒再读取后取反输出了0电平,实现了0->1->0->1的闪烁变化。
程序编写完成之后,我们右键ps_gpio_task文件夹,选择Build Project编译整个工程。
编译完成后,把程序下载到开发板里面,验证实际运行的效果。右键ps_gpio_task文件夹,选择Run AS,选择Run Configurations...。
在弹出的对话框中双击下图箭头指示的按钮。
然后选择勾选Reset entire system选项,点击右下角的Apply按钮,最后点击run,等待执行结束,程序就在开发板上运行了。
以上就是今天的主要分享,如何对zynq的ps端IO口进行操作。在篇文章中我们分享如何通过sdk软件固化程序到flash中,期待下期再见。大家可微信搜索“凌霄工作室”或者微信号“LingXiao_Studio”。
本工作室推出的所有开发板,大家可加入下面所示微信群进行采购、讨论以及技术交流。
各位同仁需要该开发板的,可以联系凌霄工作室的市场销售:18691898395 史总。