提示: 以下示例演示的是
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_done
、ap_idle
和 ap_ready
寄存器将由硬件输出端口进行设置,并由相应的寄存器读取已分组到 AXI4‑Lite 从接口中的任何输出端口的结果。
此示例中的函数实参 c
的实现突显了了解硬件端口工作方式的重要性。函数实参 c
可供读取和写入,因此作为独立的输入端口和输出端口 c_i
和 c_o
来实现,如 S_AXILITE 示例 中所述。
对 s_axilite
接口进行编程的第 1 个建议流程对应于函数的一次性执行流程:
- 使用 C 语言驱动程序文件 中提供的中断函数标准 API 实现来判定期望的中断工作方式。
- 为块输入端口加载寄存器值。在以上示例中,此操作是使用 API 函数
XExample_Set_a
、XExample_Set_b
和XExample_Set_c_i
来执行的。 - 使用
XExample_Start
将ap_start
位设置为 1,以开始执行函数。此寄存器为自我清除型寄存器,如以上头文件中所述。完成一次传输事务后,此块将暂停操作。 - 允许执行此函数。解决生成的所有中断。
- 读取输出寄存器。在以上示例中,这是使用 API 函数
XExample_Get_c_o_vld
(用于确认数据有效)和XExample_Get_c_o
来执行的。注释:s_axilite
接口中的寄存器遵循的 I/O 协议与端口相同。在此情况下,输出有效设置为逻辑 1,以指示数据是否有效。 - 针对下一项传输事务重复此过程。
第 2 个建议流程对应于块的连续执行流程。在此模式下,AXI4‑Lite 接口中包含的输入端口应仅限于执行配置的端口,如需获取有关此模式的详细描述,请参阅下一章节。通常,此块运行速度必须比 CPU 更快。如果块必须等待输入,那么块的大部分时间将用于等待:
- 使用中断函数来判定期望的中断工作方式。
- 为块输入端口加载寄存器值。在以上示例中,此操作是使用 API 函数
XExample_Set_a
、XExample_Set_a
和XExample_Set_c_i
来执行的。 - 使用 API
XExample_EnableAutoRestart
设置自动启动函数。 - 允许执行此函数。个别端口 I/O 协议将同步通过时钟处理的数据。
- 解决生成的所有中断。执行此操作期间可访问输出寄存器,但数据可能多次发生变化。
- 使用 API 函数
XExample_DisableAutoRestart
来停止执行。 - 读取输出寄存器。在以上示例中,此操作是使用 API 函数
XExample_Get_c_o
和XExample_Set_c_o_vld
来执行的。