当前位置:   article > 正文

基于ZYNQ7000的SOC点灯实验2--使用AXI_GPIO接口实现PS和PL的交互,PS端点亮PL端的LED

zynq7000

创作目的:熟悉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文件

导入示例程序作为参考

 设计自己的程序

  1. #include "xgpio.h"
  2. XGpio Gpio;
  3. #define LED_DEVICE_ID XPAR_GPIO_0_DEVICE_ID
  4. int main(void){
  5. int Status;
  6. /* Initialize the GPIO driver */
  7. Status = XGpio_Initialize(&Gpio, LED_DEVICE_ID);
  8. if (Status != XST_SUCCESS) {
  9. xil_printf("Gpio Initialization Failed\r\n");
  10. return XST_FAILURE;
  11. }
  12. XGpio_SetDataDirection(&Gpio,1,0); // 设置通道1,输出模式
  13. XGpio_DiscreteWrite(&Gpio,1,0xf); // 使用通道1 点亮四个led灯
  14. }

烧写程序到板卡上,右键app工程,run as configuration 选择全局复位,Program FPGA 。得到预期现象,验证了我们的设计正常,包括硬件设计和软件设计。

最后补充一下其他测试案例:

1、闪烁

2、流水灯

  1. #include "xgpio.h"
  2. XGpio Gpio;
  3. #define LED_DEVICE_ID XPAR_GPIO_0_DEVICE_ID
  4. #define LED_DELAY 50000000
  5. int main(void){
  6. int Status;
  7. int delay;
  8. /* Initialize the GPIO driver */
  9. Status = XGpio_Initialize(&Gpio, LED_DEVICE_ID);
  10. if (Status != XST_SUCCESS) {
  11. xil_printf("Gpio Initialization Failed\r\n");
  12. return XST_FAILURE;
  13. }
  14. XGpio_SetDataDirection(&Gpio,1,0); // 设置通道1,输出模式
  15. // LED闪烁 周期1s亮灭一次
  16. /*
  17. while (1) {
  18. XGpio_DiscreteWrite(&Gpio,1,0xf);
  19. for (delay=0;delay<LED_DELAY;delay++);
  20. XGpio_DiscreteWrite(&Gpio,1,0x0);
  21. for (delay=0;delay<LED_DELAY;delay++);
  22. }*/
  23. // LED流水灯,0.5s流动一次
  24. while (1) {
  25. XGpio_DiscreteWrite(&Gpio,1,0x1);
  26. for (delay=0;delay<LED_DELAY;delay++);
  27. XGpio_DiscreteWrite(&Gpio,1,0x2);
  28. for (delay=0;delay<LED_DELAY;delay++);
  29. XGpio_DiscreteWrite(&Gpio,1,0x4);
  30. for (delay=0;delay<LED_DELAY;delay++);
  31. XGpio_DiscreteWrite(&Gpio,1,0x8);
  32. for (delay=0;delay<LED_DELAY;delay++);
  33. }
  34. }

最后的最后,必须得总结一下了。这两个电灯实验虽然简单,但是还是有必要区分一下的,这对于理解ZYNQ的内部资源很有必要。首先是上个实验中的使用PS端的EMIO点亮LED灯实验,可以看到上文中的硬件设计中LED灯的引脚是直接链接在PS端的,通过PS内部的EMIO直接映射到PL端的LED,而本实验的LED引脚是间接链接在PS端的,通过AXI_GPIO这个IP核链接,相当于通过AXI_GPIO实现了PS端到PL端的交互。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/509914
推荐阅读
相关标签
  

闽ICP备14008679号