[ZYNQ入门宝典]年轻人的第一盏LED灯

碎碎念:

在ZYNQ系列芯片中,用BD文件搭建PL_PS全系统是最常见的设计手段,设计BD文件最基本的操作就是基于IP的框图搭建。但官方提供的 IP 不可能涵盖到方方面面,用户还是需要自己编写硬件描述语言,然后将其封装成 IP 来使用。所以,在 VIVADO 中创建用户自定义的IP是最基本的操作技能。

想把ZYNQ的最大功效发挥,则必定要让PS和PL协同工作。让PL和PS之间产生点联系,最简单的莫过于让他们同源了。即,让PS给PL提供工作时钟。显示芯片有无工作最简单的方式就是点亮LED。

PS给PL提供系统时钟,由PL驱动LED产生相应的点灯效果,我认为是ZYNQ最基本的一种软硬件协同工作。
 

 手把手:

Step1:打开 VIVADO 软件,按照正常新建工程的步骤新建一个工程。         

 

[ZYNQ入门宝典]年轻人的第一盏LED灯_第1张图片

 

Step2:建立VHDL顶层文件。书写LED点灯程序。具体程序如下图。程序结构可能不是最合理,但是思路简单明确。一个31位计数器,在100M时钟下不停累加。当第31位翻转时则LED灯翻转一次。因为前期没计算好,两次翻转间隔大概有10S钟,现象会不大明显。后期发现该问题时,无奈已经封装好了IP,懒得改了。当然,如何在VIVADO环境里修改已经封好的IP源文件也是一个待去研究的领域。立个FLAG,有空去研究下。在这里,为了效果明显,有心的同志可以把间隔时间改成一秒。

 

[ZYNQ入门宝典]年轻人的第一盏LED灯_第2张图片

 

 

Step3:行为级仿真。正常流程应该是要进行功能仿真的,但是我发现VIVADO里仿真方法和ISE里不一样,TESTBECH貌似要自己写。想想就这点简单逻辑,就不仿真了。有机会要单独给VIVADO环境下的仿真流程写一贴。

 

Step4:产生IP。单击 Tools>Create and package IP,单击 Next 随后选择 IP 的保存路径,单击 Next,直至完成 具体流程如图。当然,点击完成后,并不是直接成功生成IP。会报若干warning。看了下,都是缺少BUFG等警告,并不碍事。直接点击Package IP。完成IP的封装。

这里还有一个值得注意的是,我的VHDL代码并未编译过,语法没问题就直接点击了Create and package IP。由此可以推断,产生IP 的过程应该是包含了编译的过程。我们并不需要在Flow界面对工程进行编译。

[ZYNQ入门宝典]年轻人的第一盏LED灯_第3张图片

 

[ZYNQ入门宝典]年轻人的第一盏LED灯_第4张图片

 

[ZYNQ入门宝典]年轻人的第一盏LED灯_第5张图片

 

[ZYNQ入门宝典]年轻人的第一盏LED灯_第6张图片

[ZYNQ入门宝典]年轻人的第一盏LED灯_第7张图片

 

[ZYNQ入门宝典]年轻人的第一盏LED灯_第8张图片

 

 

Step5:调用自定义的IP。重新新建一个工程,Project manager 区中单击 Project settings 选择 IP 设置区中的 repository manager 单击+号图标,将上一节封装的 IP 的路径存放进去,单击 OK。 (所以在上一步生成IP的时候要记住IP的路径,因为第一次使用这玩意你不知IP文件究竟选择什么格式)

[ZYNQ入门宝典]年轻人的第一盏LED灯_第9张图片

 

[ZYNQ入门宝典]年轻人的第一盏LED灯_第10张图片

[ZYNQ入门宝典]年轻人的第一盏LED灯_第11张图片

 

Step6:新建一个 BD 文件,输入文件名,完成创建。 BD 文件中添加一个 ZYNQ Processing system,根据自身硬件完成 PS 时钟和内存型号的配置(我直接选择的706开发板)。

 

Step7:添加IP单击添加 IP 图标,输入上一节我们自定义 IP 的模块名,将其添加入 BD 文件中。 单击添加PS

 

[ZYNQ入门宝典]年轻人的第一盏LED灯_第12张图片

 

Step8:修改参数。我们的设计是将PS输出的时钟给PL用。然而PS默认输出的是50M时钟,点击PS设置将其改为100M,和我们的VHDL文件里的时钟相匹配。

 

[ZYNQ入门宝典]年轻人的第一盏LED灯_第13张图片

 

Step9:模块连线。FCLK_CLK0是我们在上一个步骤中设置的100M输出时钟,我们将其提供给LED_IP模块,并且连接到M_AXI_GPO_ACLK上。LED_IP模块的复位引出为对外管脚。后续学习中发现,对于vivado自带的常用IP,用户可以直接点击自动连线,这一点还是很方便的。

 

[ZYNQ入门宝典]年轻人的第一盏LED灯_第14张图片

 

Step10:检查连线有无电气错误。如下图,显然是出现了错误。仔细查看错误信息,原来PS的复位必须和PL的复位同源,于是,我们将这两个模块的复位相连。并且,由于PS模块的复位是低有效,和LED_IP模块的逻辑不一样,因此,将两者相连前,需要在输入端口加一个反相器的IP进行逻辑匹配。检查有无电气错误。完成设计。

[ZYNQ入门宝典]年轻人的第一盏LED灯_第15张图片

 

 

Step11:往后就是VIVADO的一些固定流程了,不熟悉的可以参照网上其他的SDK和VIVADO联调教程。大致流程为:右键单击 Block 文件,文件选择 Generate the Output Products。右键单击 Block 文件,选择 Create a HDL wrapper,根据 Block 文件内容产生一个 HDL 的顶层文件,并选择让 vivado 自动完成。选中 Project manager,然后右单击 Constraints,选择 Add Sources。输入文件名,完成创建,将LED的约束文件填写进去。产生 bit 文件。

 

Step12:硬件信息导入到SDK,运行程序进行调试。任意选择SDK中的一个工程模块,例如建立一个 Hello World 工程 。目的是让ARM能正常工作,使其提供给PL端的时钟正常工作。如果一切顺利,板件上的LED灯将会按照大约10S闪一次的频率 进行变化。

 

彩蛋:此例子中,虽然PS端几乎什么功能都没实现,但对于不懂ARM原理的PL端工程师而言却是极易上手的一个工程实例。最小的一个软硬件协同工作系统,很适用不懂C和C++的工程师上手学习。

 

代码附件:https://download.csdn.net/download/weixin_42229533/10676312

 

你可能感兴趣的:(ZYNQ学习系列)