Vitis HLS 学习笔记--S_AXILITE 寄存器及驱动

目录

1. 简介

2. S_AXILITE Registers 寄存器详解 

2.1 “隐式”优势

2.2 驱动程序文件

2.3 硬件头文件

2.4 硬件头文件中 SC/COR/TOW/COH 的解释

2.5 驱动控制过程

3. 总结


1. 简介

回顾此博文《Vitis HLS 学习笔记--Syn Report解读(1)-CSDN博客》。

我们在代码中使用了如下指令:

#pragma HLS INTERFACE mode=s_axilite bundle=BUS_A port=return

便得到了这些寄存器:

* S_AXILITE Registers
+-------------+----------+--------+-------+--------+----------------------------------+----------------------------------------------------------------------+
| Interface   | Register | Offset | Width | Access | Description                      | Bit Fields                                                           |
+-------------+----------+--------+-------+--------+----------------------------------+----------------------------------------------------------------------+
| s_axi_BUS_A | CTRL     | 0x00   | 32    | RW     | Control signals                  | 0=AP_START 1=AP_DONE 2=AP_IDLE 3=AP_READY 7=AUTO_RESTART 9=INTERRUPT |
| s_axi_BUS_A | GIER     | 0x04   | 32    | RW     | Global Interrupt Enable Register | 0=Enable                                                             |
| s_axi_BUS_A | IP_IER   | 0x08   | 32    | RW     | IP Interrupt Enable Register     | 0=CHAN0_INT_EN 1=CHAN1_INT_EN                                        |
| s_axi_BUS_A | IP_ISR   | 0x0c   | 32    | RW     | IP Interrupt Status Register     | 0=CHAN0_INT_ST 1=CHAN1_INT_ST                                        |
| s_axi_BUS_A | reg_in   | 0x10   | 32    | W      | Data signal of reg_in            |                                                                      |
+-------------+----------+--------+-------+--------+----------------------------------+----------------------------------------------------------------------+

 本文将对这些寄存器进行详细解释。

2. S_AXILITE Registers 寄存器详解 

2.1 “隐式”优势

使用 Vitis HLS 工具进行硬件设计带来了额外的“隐式”优势,即在驱动程序的自动生成方面。

这极大地简化了硬件设计流程,为工程师省了大量的时间。

在传统的硬件设计过程中,FPGA逻辑工程师的RTL代码完成设计后,还需要手动编写与之配套的驱动程序。不仅包括编写驱动程序本身,还要精确指定硬件设计中各个模块的地址和偏移量。这一过程不仅耗时耗力,而且极易出错,因为任何地址或偏移量的错误指定都可能导致整个系统无法正常工作。

相比,Vitis HLS提供了一个自动化的解决方案。如果使用Vitis HLS进行设计,工具不仅能够将高层次的算法描述转换成高效的硬件实现,而且还能自动创建与之匹配的驱动程序,包含了地址和偏移量指定,大大降低了设计复杂性和出错的可能性。

2.2 驱动程序文件

如简介中说指出的,一旦使用了 s_axilite 协议,工具会自动创建一组 C 语言驱动程序文件。

#pragma HLS INTERFACE mode=s_axilite ...

这些驱动文件位于如下目录中:

<proj>/solution1/impl/ip/drivers/func_v1_0/data
<proj>/solution1/impl/ip/drivers/func_v1_0/src

文件路径

使用模式

描述

data/func.mdd

独立

驱动程序定义文件

data/func.tcl

独立

共 SDK 用于将软件集成到 SDK 工程中

src/xfunc_hw.h

独立 or Linux

定义所有内部寄存器的地址偏移

src/xfunc.h

独立 or Linux

API 定义

src/xfunc.c

独立 or Linux

标准化的 API 实现

src/xfunc_sinit.c

独立

初始化 API 实现

src/xfunc_linux.c

Linux

初始化 API 实现

src/Makefile

独立

Makefile

2.3 硬件头文件

在这几个文件中,对于硬件涉及最重要的文件就是这个 src/xfunc_hw.h 宏定义的硬件头文件了。它提供了存储器映射位置完整列表,对应分组到 AXI4-Lite 从接口内的所有端口。

此头文件包含两部分:

  • 块级控制信号
  • 映射到 s_axilite 接口内的函数实参

以下是 xfunc_hw.h 的完整内容:

// ==============================================================
// Vitis HLS - High-Level Synthesis from C, C++ and OpenCL v2022.1 (64-bit)
// Tool Version Limit: 2022.04
// Copyright 1986-2022 Xilinx, Inc. All Rights Reserved.
// ==============================================================
// BUS_A
// 0x00 : Control signals
//        bit 0  - ap_start (Read/Write/SC)
//        bit 1  - ap_done (Read/COR)
//        bit 2  - ap_idle (Read)
//        bit 3  - ap_ready (Read/COR)
//        bit 7  - auto_restart (Read/Write)
//        bit 9  - interrupt (Read)
//        others - reserved
// 0x04 : Global Interrupt Enable Register
//        bit 0  - Global Interrupt Enable (Read/Write)
//        others - reserved
// 0x08 : IP Interrupt Enable Register (Read/Write)
//        bit 0 - enable ap_done interrupt (Read/Write)
//        others - reserved
// 0x0c : IP Interrupt Status Register (Read/COR)
//        bit 0 - ap_done (Read/COR)
//        others - reserved
// 0x10 : Data signal of reg_in
//        bit 7~0 - reg_in[7:0] (Read/Write)
//        others  - reserved
// 0x14 : reserved
// (SC = Self Clear, COR = Clear on Read, TOW = Toggle on Write, COH = Clear on Handshake)#define XFUNC_BUS_A_ADDR_AP_CTRL     0x00
#define XFUNC_BUS_A_ADDR_GIE         0x04
#define XFUNC_BUS_A_ADDR_IER         0x08
#define XFUNC_BUS_A_ADDR_ISR         0x0c
#define XFUNC_BUS_A_ADDR_REG_IN_DATA 0x10
#define XFUNC_BUS_A_BITS_REG_IN_DATA 8

代码中的注释部分已经描述了寄存器的作用,以及每个寄存器的用途和位字段的含义。

下面是对这些注释的详细解释:

0x00地址,是控制寄存器,包含启动、完成、空闲、准备等控制信号,以及自动重启和中断信号的标志位。

  • ap_start (bit 0):启动操作,可读写,自清除(SC)。
  • ap_done (bit 1):操作完成标志,可读,读取后自清除(COR)。
  • ap_idle (bit 2):表示设备空闲,只读。
  • ap_ready (bit 3):表示设备准备就绪,可读,读取后自清除(COR)。
  • auto_restart (bit 7):自动重启操作,可读写。
  • interrupt (bit 9):中断标志,只读。
  • 其他位保留。

0x04地址,是全局中断使能寄存器,用于控制是否允许全局中断。

  • 位0:全局中断使能,可读写。
  • 其他位保留。

0x08地址,是IP中断使能寄存器,用于控制特定中断的使能。

  • 位0:使能ap_done中断,可读写。
  • 其他位保留。

0x0c地址,是IP中断状态寄存器,用于显示当前的中断状态。

  • 位0:ap_done中断状态,可读,读取后自清除(COR)。
  • 其他位保留。

0x10地址,是reg_in数据信号的寄存器,用于读写reg_in的值。

  • 位7~0:reg_in[7:0]的值,可读写。
  • 其他位保留。

接下来的代码定义了宏,这些宏将上述寄存器地址映射到具体的常量,方便在软件中引用这些寄存器地址。

2.4 硬件头文件中 SC/COR/TOW/COH 的解释

  • SC - Self Clear

在写入操作中,当写入的寄存器位为1时,该位会被自动清除为0,而写入0时则不受影响。这通常用于只需要一次性设置某个寄存器位的情况

  • COR - Clear on Read

在读取操作中,当读取的寄存器位为1时,该位会被自动清除为0,而读取0时则不受影响。这通常用于需要清除某个中断标志的情况。

  • TOW - Toggle on Write

在写入操作中,当写入的寄存器位为1时,该位会被取反,即原来为0的变成1,原来为1的变成0。这通常用于切换某个功能或状态的情况。

  • COH - Clear on Handshake

在某个操作完成后,该寄存器位会自动清除为0。这通常用于需要等待某个操作完成的情况。

比如等待DMA传输完成后清除中断标志。

2.5 驱动控制过程

在软件中可使用 API 函数来控制硬件块,驱动的基本流程

  • 1. 创建硬件实例

XFunc HlsXFunc

  • 2. 查找器件配置

XFunc_LookupConfig(DeviceId)

  • 3. 初始化器件

XFunc_CfgInitialize(InstancePtr, ConfigPtr)

  • 4. 设置 HLS 块的输入参数

XFunc_Set_reg_in(InstancePtr, Data)

  • 5. 启动器件并读取结果

XFunc_Start(InstancePtr)

XFunc_Get_reg_in(InstancePtr)
 

初始化函数合并,在src/xfunc_sinit.c中:

XFunc_Initialize(InstancePtr, DeviceId)

=

    XFunc_LookupConfig(DeviceId)

+

    XFunc_CfgInitialize(InstancePtr, ConfigPtr)

所以使用XFunc_Initialize()可以一步实现查找和配置器件,完成初始化。

3. 总结

本文重点关注了 Vitis HLS 在设计过程中自动生成的驱动程序及其相关文件。通过对 s_axilite 协议下生成的寄存器进行解释,我们了解了这些寄存器的作用和每个寄存器位的含义,以及驱动程序中的控制过程。这种自动化的设计流程减少了手动编写驱动程序的工作量,同时也降低了出错的可能性,为硬件设计带来了更高的可靠性和稳定性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/317831.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嘉楠堪智 CanMV K230 的 CanMV-IDE 环境与 MicroPython 编程

嘉楠推出了 CanMV IDE 开发环境&#xff0c;可以使用 MicroPython 开发针对 CanMV K230 的各种程序&#xff0c;同时也提供了大量的例子程序&#xff0c;方便使用者学习。 嘉楠开发者社区&#xff0c;给出了详细的 CanMV K230 教程&#xff0c;可以借以快速上手。 目录 固件…

商务谈判模拟口才训练方案(3篇)

商务谈判模拟口才训练方案&#xff08;3篇&#xff09; 商务谈判模拟口才训练方案&#xff08;一&#xff09; 一、训练目标 本训练方案旨在提高参与者在商务谈判中的口才表达能力&#xff0c;包括清晰表达、有效倾听、应对挑战和构建信任等能力。 二、训练内容 基础口才训练…

word启动缓慢之Baidu Netdisk Word Addin

word启动足足花了7秒钟&#xff0c;你知道我这7秒是怎么过来的吗&#xff1f; 原因就是我们可爱的百度网盘等APP&#xff0c;在我们安装客户端时&#xff0c;默认安装了Office加载项&#xff0c;不仅在菜单栏上加上了一个丑陋的字眼&#xff0c;也拖慢了word启动速度........ 解…

Python 语音识别系列-实战学习-语音识别特征提取

Python 语音识别系列-实战学习-语音识别特征提取 前言1.预加重、分帧和加窗2.提取特征3.可视化特征4.总结 前言 语音识别特征提取是语音处理中的一个重要环节&#xff0c;其主要任务是将连续的时域语音信号转换为连续的特征向量&#xff0c;以便于后续的语音识别和语音处理任务…

【开源设计】京东慢SQL组件:sql-analysis

京东慢SQL组件&#xff1a;sql-analysis 一、背景二、源码简析三、总结 地址&#xff1a;https://github.com/jd-opensource/sql-analysis 一、背景 开发中&#xff0c;无疑会遇到慢SQL问题&#xff0c;而常见的处理思路都是等上线&#xff0c;然后由监控报警之后再去定位对应…

Linux进程——进程的创建(fork的原理)

前言&#xff1a;在上一篇文章中&#xff0c;我们已经会使用getpid/getppid函数来查看pid和ppid,本篇文章会介绍第二种查看进程的方法&#xff0c;以及如何创建子进程&#xff01; 本篇主要内容&#xff1a; 查看进程的第二种方法创建子进程系统调用函数fork 在开始前&#xff…

2023 广东省大学生程序设计竞赛(部分题解)

目录 A - Programming Contest B - Base Station Construction C - Trading D - New Houses E - New but Nostalgic Problem I - Path Planning K - Peg Solitaire A - Programming Contest 签到题&#xff1a;直接模拟 直接按照题目意思模拟即可&#xff0c;为了好去…

C——双向链表

一.链表的概念及结构 链表是一种物理存储单元上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的。什么意思呢&#xff1f;意思就是链表在物理结构上不一定是连续的&#xff0c;但在逻辑结构上一定是连续的。链表是由一个一个的节点连…

CMake使用

一、CMake 是什么 CMake 是一个跨平台的自动化构建系统&#xff0c;它使用配置文件 CMakeLists.txt 来管理软件构建过程。CMake 基于 Makefile 做了二次开发。 二、单个文件目录 # CMake 最低版本号要求 cmake_minimum_required(VERSION 3.16.3)# 工程名 project(CMakeSingle)…

uniapp0基础编写安卓原生插件和调用第三方jar包和编写语音播报插件之使用jar包插件

前言 如果你不会编写安卓插件,你可以先看看我之前零基础的文章(uniapp0基础编写安卓原生插件和调用第三方jar包和编写语音播报插件之零基础编写安卓插件), 我们使用第三方包,jar包编写安卓插件 开始 把依赖包,放到某个模块的/libs目录(myTestPlug/libs) 还要到build…

缓存分享(1)——Guava Cache原理及最佳实践

Guava Cache原理及最佳实践 1. Guava Cache是什么1.1 简介1.2 核心功能1.3 适用场景 2. Guava Cache的使用2.1 创建LoadingCache缓存2.2 创建CallableCache缓存 缓存的种类有很多&#xff0c;需要根据不同的应用场景来选择不同的cache&#xff0c;比如分布式缓存如redis、memca…

Java设计模式 _结构型模式_桥接模式

一、桥接模式 1、桥接模式 桥接模式&#xff08;Bridge Pattern&#xff09;是一种结构型设计模式。用于把一个类中多个维度的抽象化与实现化解耦&#xff0c;使得二者可以独立变化。 2、实现思路 使用桥接模式&#xff0c;一定要找到这个类中两个变化的维度&#xff1a;如支…

【消息队列】RabbitMQ五种消息模式

RabbitMQ RabbitMQRabbitMQ安装 常见的消息模型基本消息队列SpringAMQPWorkQueue消息预取发布订阅模式Fanout ExchangeDirectExchangeTopicExchange 消息转换器 RabbitMQ RabbitMQ是基于Erlang语言开发的开源消息通信中间件 官网地址&#xff1a;https://www.rabbitmq.com/ R…

C语言趣味代码(四)

这一篇主要编写几个打字练习的小程序&#xff0c;然后通过这些小程序的实现来回顾复习我们之前学过的知识&#xff0c;然后通过这写打字练习的小程序来提升我们的打字技术和编程技术。 1. 打字练习 1.1 基本打字练习 1.1.1 基本实现 首先我们来制作一个用于计算并显示输入一…

嵌入式学习59-ARM7(自动设备号和混杂设备)

知识零碎&#xff1a; 头文件查找&#xff1a; /arm/路径下的头文件 linux驱动程序的编写&#xff0c;编译&#xff0c;运行过程 -------------------------------------------------------------------------------------------------------------------------------- 1.…

【C语言】深入了解文件:简明指南

&#x1f308;个人主页&#xff1a;是店小二呀 &#x1f308;C语言笔记专栏&#xff1a;C语言笔记 &#x1f308;C笔记专栏&#xff1a; C笔记 &#x1f308;喜欢的诗句:无人扶我青云志 我自踏雪至山巅 文章目录 一、文件的概念1.1 文件名:1.2 程序文件和数据文件 二、数据文…

手拉手springboot整合kafka

前期准备安装kafka 启动Kafka本地环境需Java 8以上 Kafka是一种高吞吐量的分布式发布订阅消息系统&#xff0c;它可以处理消费者在网站中的所有动作流数据。 Kafka启动方式有Zookeeper和Kraft&#xff0c;两种方式只能选择其中一种启动&#xff0c;不能同时使用。 Kafka下载…

头歌:Spark的安装与使用

第1关&#xff1a;Scala语言开发环境的部署 相关知识 Scala是一种函数式面向对象语言&#xff0c;它融汇了许多前所未有的特性&#xff0c;而同时又运行于JVM之上。随着开发者对Scala的兴趣日增&#xff0c;以及越来越多的工具支持&#xff0c;无疑Scala语言将成为你手上一件…

第5篇:创建Nios II工程之Hello_World<四>

Q&#xff1a;最后我们在DE2-115开发板上演示运行Hello_World程序。 A&#xff1a;先烧录编译Quartus硬件工程时生成的.sof文件&#xff0c;在FPGA上成功配置Nios II系统&#xff1b;然后在Nios II Eclipse窗口右键点击工程名hello_world&#xff0c;选择Run As-->Nios II …

如何使用Go语言进行并发安全的数据访问?

文章目录 并发安全问题的原因解决方案1. 使用互斥锁&#xff08;Mutex&#xff09;示例代码&#xff1a; 2. 使用原子操作&#xff08;Atomic Operations&#xff09;示例代码&#xff1a; 3. 使用通道&#xff08;Channels&#xff09; 在Go语言中&#xff0c;进行并发编程是常…