HLS学习2:使用ARM核点灯

1、引言

本系列博客主要用于记录学习过程,如有错误欢迎指点。

芯片:xc7z020clg400-1;
开发板:小熊猫7020开发板;
开发环境:Vivado 18.3;
系统环境:Windows 11;
参考资料:小熊猫HLS文档、ug902、ug871、米联客HLS、黑金HLS等。

尝试采用ZYNQ 7020的ARM核进行点灯。

2、开发流程

2.1、新建工程

2.2、新建 block design

2.3、添加ZYNQ核与配置

双击ZYNQ IP,进行配置

2.3.1、取消Clock Resets

在这里插入图片描述

2.3.2、取消AXI GP0接口

在这里插入图片描述

2.3.3、使能UART1

确认是48、49管脚
在这里插入图片描述

2.3.4、取消PL Fabric clocks

在这里插入图片描述

2.3.5、配置DDR3

将Memory Part 型号配置为MT41J256M16,将DRAM Bus Width配置为16Bit。
在这里插入图片描述

2.3.6、自动连线

连线完成
在这里插入图片描述

2.4、 导出文件

默认配置
在这里插入图片描述
生成完成后,继续导出HDL Wrapper(默认)
在这里插入图片描述
生成.V文件后,继续导出硬件描述文件
在这里插入图片描述
不调用PL端,所以不用生成bit文件(以下不用勾选)
在这里插入图片描述

扫描二维码关注公众号,回复: 15344623 查看本文章

2.5、ARM_SDK

2.5.1、新建工程

从Vivado中打开Xilinx SDK
在这里插入图片描述
新建工程
在这里插入图片描述
输入项目名称“hello world”,然后选择Hello World例程。
在这里插入图片描述
左侧可以看到例程的工程文件
在这里插入图片描述

2.5.2、Debug配置

选择菜单栏的Debug图标
在这里插入图片描述
在弹出的对话框中,默认选择第一项,进行Debug
在这里插入图片描述
跳转到Debug 页面后,在Other中,选择terminal工具
在这里插入图片描述
在这里插入图片描述
在右下角弹出的terminal串口中,选择connect
在这里插入图片描述
选择合适的端口和波特率。
在这里插入图片描述
连接成功后,运行仿真即可
在这里插入图片描述

2.5.3、仿真结果

在这里插入图片描述
从左上角可以切换界面
在这里插入图片描述

3、点灯

3.1、Vivado开发

删掉第二小节的Block Design,重新添加一个新的ZYNQ IP。

3.1.1、ZYNQ IP配置

在新IP 中,仅修改DDR——》将Memory Part 型号配置为MT41J256M16,将DRAM Bus Width配置为16Bit(与2.3.5一致)
添加UART1,与2.3.3一致。
在这里插入图片描述

3.1.2、GPIO IP配置

添加两个GPIO IP,一个配置为输入,一个配置为输出
在这里插入图片描述
在这里插入图片描述

3.1.3、连线与其他设置

点击自动连线
在这里插入图片描述
全选
在这里插入图片描述
连线完成后,可以看到多出了rst_ps7(这个是复位控制模块)、ps7_0_axi_periph(这个是AXI总线互联模块),
再点击Run Block Automation,生成控制引脚。
在这里插入图片描述
弹出的对话框默认即可,生成完成。
在这里插入图片描述
生成输出产品Generate Output Products.
创建HDL包装 Create HDL Wrapper.
(参考2.4小节)

3.1.4、配置管脚

选择左侧菜单栏的RTL ANAYSIS——》Open Elaborated Design
在这里插入图片描述
按如下配置,配置完成后使用快捷键保存ctrl+s,自己命名。
在这里插入图片描述

3.1.5、导出硬件

由于我们需要使用硬件,所以首先生成Bitestream,等待生成完成,可见资源使用情况。
在这里插入图片描述
然后在菜单栏选择导出硬件。勾选Include bitstream
在这里插入图片描述

3.2、SDK开发

从Vivado中启动SDK。默认即可
在这里插入图片描述
新建一个工程,跟2.5.1一致,重命名一下,点击Next后,选择helloworld例程模板
在这里插入图片描述
删掉原始代码,添加如下代码

#include <stdio.h>
#include "platform.h"
#include "xparameters.h"
#include "xscugic.h"
#include "xil_exception.h"
#include "xgpio.h"
#include <unistd.h> // usleep()
#include <stdbool.h>  // bool

#define LED_DEVICE_ID          XPAR_AXI_GPIO_1_DEVICE_ID
#define KEY_DEVICE_ID          XPAR_AXI_GPIO_0_DEVICE_ID

XGpio LEDInst;
XGpio KEYInst;

u8 key_value_pre=0;
u8 key_value_now=0;
int main()
{
    
    
    init_platform();
    int status;
    status = XGpio_Initialize(&KEYInst, KEY_DEVICE_ID); // initial KEY
    if(status != XST_SUCCESS) return XST_FAILURE;
    status = XGpio_Initialize(&LEDInst, LED_DEVICE_ID);  // initial LED
    if(status != XST_SUCCESS)return XST_FAILURE;
    XGpio_SetDataDirection(&KEYInst, 1, 1); // set KEY IO direction as in
    XGpio_SetDataDirection(&LEDInst, 1, 0); // set LED IO direction as out
    XGpio_DiscreteWrite(&LEDInst, 1, 0x0);// at initial, all LED turn off
    printf(">>> Press PL KEY1 ~ KEY4 one by one, and check the PL LED1 ~ LED4\n");
    while(1)
    {
    
    
        usleep(100000); // 0.1s sleep, to debounce, in common, the meta-state will sustain no more than 20ms
        key_value_pre=key_value_now;
        key_value_now= XGpio_DiscreteRead(&KEYInst, 1) & 0x0F;
        XGpio_DiscreteWrite(&LEDInst, 1, key_value_now);
        if(key_value_pre!=key_value_now)  printf("key state_changed!\n");
    }

    cleanup_platform();
    return 0;
}

使用Ctrl+S保存后,编译器会自动编译。
在这里插入图片描述
Debug 配置
在这里插入图片描述
程序烧录进FPGA,按下按钮的同时,LED亮起

猜你喜欢

转载自blog.csdn.net/u014798590/article/details/126223208
今日推荐