S_AXILITE 控制寄存器映射 - 2021.2 Chinese

Vitis 高层次综合用户指南 (UG1399)

Document ID
UG1399
Release Date
2021-12-15
Version
2021.2 Chinese
Vitis HLS 会自动生成控制寄存器映射 (Control Register Map) 用于控制 Vivado IP 或 Vitis 内核以及组合到 s_axilite 接口中的各端口。此寄存器映射会被添加到生成的 RTL 文件中,并且可拆分为两部分:
  1. 块级控制信号
  2. 映射到 s_axilite 接口内的函数实参
Vitis 内核流程中,默认情况下,块协议与 s_axilite 接口关联。要更改默认块协议,请按如下方式指定接口编译指示:
#pragma HLS INTERFACE mode=ap_ctrl_hs port=return
但在 Vivado IP 流程中,块控制协议分配到其自己的接口 ap_ctrl,如 Vivado IP 流程接口 中所示。但如果您在自己的 IP 内使用的是 s_axilite 接口,那么也可以使用以下 INTERFACE 编译指示来向该接口分配块控制协议,如以下示例所示:
#pragma HLS INTERFACE mode=s_axilite port=return bundle=BUS_A
#pragma HLS INTERFACE mode=ap_ctrl_hs port=return bundle=BUS_A

在控制寄存器映射中,Vitis HLS 会保留地址 0x000x0C 用于块级协议信号和中断控制,如下所示:

地址 描述
0x00 控制信号
0x04 全局中断使能寄存器
0x08 IP 中断使能寄存器(读/写)
0x0c IP 中断状态寄存器(读取/TOW)

控制信号 (0X00) 包含 ap_startap_doneap_readyap_idle;对于 ap_ctrl_chain,块协议还包含 ap_continue。这些均为块级接口信号,通过 s_axilite 适配器来访问。

要开始块操作,控制寄存器中的 ap_start 位必须设置为 1。随后,HLS 引擎将继续从 AXI4-Lite 从接口中的寄存器读取已分组到该接口中的任意输入。

当此块完成操作后,ap_doneap_idleap_ready 寄存器将由硬件输出端口进行设置,并由相应的寄存器读取已分组到 s_axilite 接口中的任何输出端口的结果。

对于函数实参,Vitis HLS 会自动为分配给 s_axilite 接口的每个实参或端口分配地址。该工具将为每个端口分配一个偏移,从 0x10 开始,低位地址则保留用于控制信号。分配给端口的大小或地址范围取决于使用的实参数据类型和端口协议。

由于已组合到 AXI4-Lite 接口中的变量均为函数实参,在 C 语言代码中不含默认值,因此无法为 s_axilite 接口中的任何实参寄存器赋予默认值。这些寄存器可通过使用 config_rtl 命令进行复位来实现,但不能为其赋予任何其它默认值。

以下提供了 Vitis HLSap_ctrl_hs 块控制协议生成的控制寄存器映射:

//------------------------Address Info-------------------
// 0x00 : Control signals
//        bit 0  - ap_start (Read/Write/COH)
//        bit 1  - ap_done (Read/COR)
//        bit 2  - ap_idle (Read)
//        bit 3  - ap_ready (Read)
//        bit 7  - auto_restart (Read/Write)
//        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)
//        bit 1  - enable ap_ready interrupt (Read/Write)
//        others - reserved
// 0x0c : IP Interrupt Status Register (Read/TOW)
//        bit 0  - ap_done (COR/TOW)
//        bit 1  - ap_ready (COR/TOW)
//        others - reserved
// 0x10 : Data signal of a
//        bit 7~0 - a[7:0] (Read/Write)
//        others  - reserved
// 0x14 : reserved
// 0x18 : Data signal of b
//        bit 7~0 - b[7:0] (Read/Write)
//        others  - reserved
//  : Control signal of b
//        bit 0  - b_ap_vld (Read/Write/SC)
//        others - reserved
// 0x20 : Data signal of c_i
//        bit 7~0 - c_i[7:0] (Read/Write)
//        others  - reserved
// 0x24 : reserved
// 0x28 : Data signal of c_o
//        bit 7~0 - c_o[7:0] (Read)
//        others  - reserved
// 0x2c : Control signal of c_o
//        bit 0  - c_o_ap_vld (Read/COR)
//        others - reserved
// (SC = Self Clear, COR = Clear on Read, TOW = Toggle on Write, COH = Clear on Handshake)