赞
踩
创作目的:熟悉ALINX的XC7Z100开发板,熟悉ARM架构,理解ZYNQ的ARM+FPGA即PS+PL结构,熟练掌握vivado端的硬件设计以及sdk端的软件设计,实现软硬件协同工作测试板卡的功能。
1、准备工作
硬件环境:vivado 2017.4
软件环境:xilinx sdk 2017.4
2、硬件设计
创建工程,选择型号,创建block design,添加zynq的ps模块就不赘述了,可参见之前博客。
点击添加AXI GPIO接口IP核
点击进入配置界面,这里使用到4位led,全输出,配置如下
点击Run Connection Automation
点击regenerate layout 刷新图标,将GPIO输出引脚修改名称为led,由自动完成的布局布线可知,我们使用的时钟都是100MHz的FCLK输出的,如果需要使用其他频率的时钟可以添加时钟模块,修改布线。
按F6验证设计的有效性并保存
老样子,Generate Output Products,Create HDL Wrapper,添加引脚约束,生成比特流文件
这些步骤不再赘述,参考之前博客或者其他博客。下面是我的板卡对应的四个led灯的约束,不同板卡根据自己的原理图找到对应引脚,注意端口名称,我将GPIO输出名称改为了led这里就是led_tri_o,读者可打开顶层文件验证端口名称是否相同。
set_property BITSTREAM.GENERAL.COMPRESS TRUE [current_design]
set_property CONFIG_VOLTAGE 3.3 [current_design]
set_property CFGBVS VCCO [current_design]
set_property IOSTANDARD LVCMOS33 [get_ports {led_tri_o[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led_tri_o[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led_tri_o[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led_tri_o[0]}]
set_property PACKAGE_PIN AJ16 [get_ports {led_tri_o[0]}]
set_property PACKAGE_PIN AK16 [get_ports {led_tri_o[1]}]
set_property PACKAGE_PIN AE16 [get_ports {led_tri_o[2]}]
set_property PACKAGE_PIN AE15 [get_ports {led_tri_o[3]}]
至此,硬件设计部分已经完成。导出硬件包含比特流文件,打开SDK,进入软件设计部分。
3、软件设计
同样新建APP工程,可参照前文。在新建的工程中添加C文件
导入示例程序作为参考
设计自己的程序
- #include "xgpio.h"
-
- XGpio Gpio;
-
- #define LED_DEVICE_ID XPAR_GPIO_0_DEVICE_ID
-
- int main(void){
- int Status;
-
- /* Initialize the GPIO driver */
- Status = XGpio_Initialize(&Gpio, LED_DEVICE_ID);
- if (Status != XST_SUCCESS) {
- xil_printf("Gpio Initialization Failed\r\n");
- return XST_FAILURE;
- }
-
-
- XGpio_SetDataDirection(&Gpio,1,0); // 设置通道1,输出模式
- XGpio_DiscreteWrite(&Gpio,1,0xf); // 使用通道1 点亮四个led灯
- }
烧写程序到板卡上,右键app工程,run as configuration 选择全局复位,Program FPGA 。得到预期现象,验证了我们的设计正常,包括硬件设计和软件设计。
最后补充一下其他测试案例:
1、闪烁
2、流水灯
- #include "xgpio.h"
-
- XGpio Gpio;
-
- #define LED_DEVICE_ID XPAR_GPIO_0_DEVICE_ID
-
- #define LED_DELAY 50000000
-
- int main(void){
- int Status;
- int delay;
- /* Initialize the GPIO driver */
- Status = XGpio_Initialize(&Gpio, LED_DEVICE_ID);
- if (Status != XST_SUCCESS) {
- xil_printf("Gpio Initialization Failed\r\n");
- return XST_FAILURE;
- }
-
-
- XGpio_SetDataDirection(&Gpio,1,0); // 设置通道1,输出模式
-
- // LED闪烁 周期1s亮灭一次
- /*
- while (1) {
- XGpio_DiscreteWrite(&Gpio,1,0xf);
- for (delay=0;delay<LED_DELAY;delay++);
- XGpio_DiscreteWrite(&Gpio,1,0x0);
- for (delay=0;delay<LED_DELAY;delay++);
- }*/
-
- // LED流水灯,0.5s流动一次
- while (1) {
- XGpio_DiscreteWrite(&Gpio,1,0x1);
- for (delay=0;delay<LED_DELAY;delay++);
- XGpio_DiscreteWrite(&Gpio,1,0x2);
- for (delay=0;delay<LED_DELAY;delay++);
- XGpio_DiscreteWrite(&Gpio,1,0x4);
- for (delay=0;delay<LED_DELAY;delay++);
- XGpio_DiscreteWrite(&Gpio,1,0x8);
- for (delay=0;delay<LED_DELAY;delay++);
- }
-
- }
最后的最后,必须得总结一下了。这两个电灯实验虽然简单,但是还是有必要区分一下的,这对于理解ZYNQ的内部资源很有必要。首先是上个实验中的使用PS端的EMIO点亮LED灯实验,可以看到上文中的硬件设计中LED灯的引脚是直接链接在PS端的,通过PS内部的EMIO直接映射到PL端的LED,而本实验的LED引脚是间接链接在PS端的,通过AXI_GPIO这个IP核链接,相当于通过AXI_GPIO实现了PS端到PL端的交互。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。