本篇主要介绍,以比较底层的方法操作外设leds、switches和buttons的方法,以及这段时间对PYNQ学习的一些个人见解。
目录
前言
正文
一、Vivado部分
二、板上验证部分
结尾
前面的一个帖子https://blog.csdn.net/CSD_N_csdn/article/details/105666949讲解了如何操作外设leds、switches和buttons等的方法,其使用的方法是导入pynq自带的base.bit,此文件中包含的资源比较全面,像一个黑匣子,当然,如果你只是想使用其中的一些模块,这个文件就会显得繁杂。此篇我们同样是使用硬件设计(Hardware design)的方法,针对外设,生成简单的bit,直接通过PS的GPIO管脚来控制外设。
根据本篇的实现流程,这里主要分为两个主要部分,所需的环境:Vivado软件(版本不限)、PYNQ-Z2开发板。
(1)创建Vivado工程、选择板卡型号、创建块设计(Create Block Design)
这里,我的工程命名为project_gpio,板卡型号选择Boards-->pynq-z2(此板卡的文件包在我前面的帖子中有链接),然后-->Next-->Finish。
创建块设计(Create Block Design),Create Block Design-->OK,如图
(2)添加所需的IP核,并且配置每个添加的IP核
首先,添加ZYNQ7PS核,然后点击Run Block Automation,点击OK。
双击该核进行配置,配置更改如下:
然后,添加截位的IP核Slice,并对此核配置完如图:
(3)连线,添加端口,添加管脚约束文件
把三个IP核手动连线,完成后如图所示:
添加外设的端口,分别是leds、buttons、switches,添加完成后如图:
添加管脚约束文件(这个切记,一定要约束上一步添加的端口,不然在生成bit文件的时候会报错!),新建一个管脚约束文件gpio,打开文件,在里面添加如下:(这个XDC文件资料链接里会上传)
set_property -dict {PACKAGE_PIN D19 IOSTANDARD LVCMOS33} [get_ports {buttons[0]}]
set_property -dict {PACKAGE_PIN D20 IOSTANDARD LVCMOS33} [get_ports {buttons[1]}]
set_property -dict {PACKAGE_PIN L20 IOSTANDARD LVCMOS33} [get_ports {buttons[2]}]
set_property -dict {PACKAGE_PIN L19 IOSTANDARD LVCMOS33} [get_ports {buttons[3]}]
set_property -dict {PACKAGE_PIN R14 IOSTANDARD LVCMOS33} [get_ports {leds[0]}]
set_property -dict {PACKAGE_PIN P14 IOSTANDARD LVCMOS33} [get_ports {leds[1]}]
set_property -dict {PACKAGE_PIN N16 IOSTANDARD LVCMOS33} [get_ports {leds[2]}]
set_property -dict {PACKAGE_PIN M14 IOSTANDARD LVCMOS33} [get_ports {leds[3]}]
set_property -dict {PACKAGE_PIN M20 IOSTANDARD LVCMOS33} [get_ports {switches[0]}]
set_property -dict {PACKAGE_PIN M19 IOSTANDARD LVCMOS33} [get_ports {switches[1]}]
点击保存即可。
(4)生成bit文件,生成tcl文件
右键点击design_1,生成HDL封装,点击OK。(此处如果出现警告,可以忽略不管,点OK就行)
点击Generate Bitstream,生成bit文件,这个需要等待较长时间。(如果出现警告,点OK就可以了)
上述完成后,点击Export Block Design,生成tcl文件。
(1)在以上部分的vivado工程文件夹中找到bit文件、hwh文件、tcl文件,改为相同的名字,存放在同一个文件夹下。(这步操作和前面定制加速overlay方法相同)
我这里新建了一个design_gpio文件夹,将三个文件改名后放了进去。
(2)将整个文件夹复制到板卡的jupyter_notebooks目录下,如图
(3)通过浏览器访问jupyter,打开ps_gpio.ipynb文件(这个稍后也会上传),然后开始运行cell,注意代码中的文件路径是否需要修改!接下来的验证就可以通过文档提示完成了,这里不再赘述。
需要强调的是,在这里的代码都是直接对gpio_pin进行操作,设置输入或输出,pin的编号等,所以应该是对外设的最直接操作。比开头所说的那篇帖子中,定义类,实例化的等要简单许多,也更容易理解。
结尾说三点:
(1)首先,很抱歉,这段时间更帖不及时,之前给自己定的目标是每周至少一篇,以后请大家监督。这段时间网课占用了部分时间,而且对pynq的学习断断续续,阅读官方手册收效甚微,所以下一步会调整方向!
(2)从本篇帖子开始,后续发帖会更加简洁,默认读者对之前的帖子有所了解,不再详述重复操作,这样也有助于大家提高读帖效率。
(3)下一阶段,小编准备实际着手一个项目,在实践中不断补充知识,积累经验。
资料链接:https://pan.baidu.com/s/1MkQg6TjFgNjZQOU7KWq43Q
提取码:uusn
欢迎下方评论区交流,韭菜会及时回复的。如果文章帮助到了您,请点赞鼓励,谢谢!