控制硬件 - 2023.2 简体中文

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

Document ID
UG1399
Release Date
2023-12-18
Version
2023.2 简体中文
提示: 以下示例演示的是 ap_ctrl_hs 块控制协议,它是 Vivado IP 流程的默认协议。请参阅 块级控制协议,以获取有关 ap_ctrl_chain 协议的更多信息和描述,该协议是 Vitis 内核流程的默认协议。

在此示例中,硬件头文件 xexample_hw.h 提供了存储器映射位置完整列表,对应分组到 AXI4‑Lite 从接口内的所有端口,如 S_AXILITE 控制寄存器映射 中所述。

// 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)
//        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  - Channel 0 (ap_done)
//        bit 1  - Channel 1 (ap_ready)
// 0x0c : IP Interrupt Status Register (Read/TOW)
//        bit 0  - Channel 0 (ap_done)
//        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
// 0x1c : 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)

要对 s_axilite 接口中的寄存器进行正确编程,您必须了解硬件端口使用默认端口协议或定制协议来工作的方式,如 S_AXILITE 和端口级协议 中所述。

例如,要启动块操作,ap_start 寄存器必须设置为 1。随后,器件将继续从 AXI4‑Lite 从接口中的寄存器读取已分组到该接口中的任意输入。当此块完成操作后,ap_doneap_idleap_ready 寄存器将由硬件输出端口进行设置,并由相应的寄存器读取已分组到 AXI4‑Lite 从接口中的任何输出端口的结果。

此示例中的函数实参 c 的实现突显了了解硬件端口工作方式的重要性。函数实参 c 可供读取和写入,因此作为独立的输入端口和输出端口 c_ic_o 来实现,如 S_AXILITE 示例 中所述。

s_axilite 接口进行编程的第 1 个建议流程对应于函数的一次性执行流程:

  • 使用 C 语言驱动程序文件 中提供的中断函数标准 API 实现来判定期望的中断工作方式。
  • 为块输入端口加载寄存器值。在以上示例中,此操作是使用 API 函数 XExample_Set_aXExample_Set_bXExample_Set_c_i 来执行的。
  • 使用 XExample_Startap_start 位设置为 1,以开始执行函数。此寄存器为自我清除型寄存器,如以上头文件中所述。完成一次传输事务后,此块将暂停操作。
  • 允许执行此函数。解决生成的所有中断。
  • 读取输出寄存器。在以上示例中,这是使用 API 函数 XExample_Get_c_o_vld(用于确认数据有效)和 XExample_Get_c_o 来执行的。
    注释: s_axilite 接口中的寄存器遵循的 I/O 协议与端口相同。在此情况下,输出有效设置为逻辑 1,以指示数据是否有效。
  • 针对下一项传输事务重复此过程。

第 2 个建议流程对应于块的连续执行流程。在此模式下,AXI4‑Lite 接口中包含的输入端口应仅限于执行配置的端口,如需获取有关此模式的详细描述,请参阅下一章节。通常,此块运行速度必须比 CPU 更快。如果块必须等待输入,那么块的大部分时间将用于等待:

  • 使用中断函数来判定期望的中断工作方式。
  • 为块输入端口加载寄存器值。在以上示例中,此操作是使用 API 函数 XExample_Set_aXExample_Set_aXExample_Set_c_i 来执行的。
  • 使用 API XExample_EnableAutoRestart 设置自动启动函数。
  • 允许执行此函数。个别端口 I/O 协议将同步通过时钟处理的数据。
  • 解决生成的所有中断。执行此操作期间可访问输出寄存器,但数据可能多次发生变化。
  • 使用 API 函数 XExample_DisableAutoRestart 来停止执行。
  • 读取输出寄存器。在以上示例中,此操作是使用 API 函数 XExample_Get_c_oXExample_Set_c_o_vld 来执行的。