作者:Chen Yang,AMD工程师;文章来源:AMD开发者社区
在(一)中介绍了 Direct IO 的基本概念。本节结合官方示例 using_axilite_with_directio,说明其与 AXI Lite 搭配的使用方式。
该示例中,数据路径通过 hls::stream 构建:
in → sub_task1 → sub_task2 → task2 → out
其中数据在各个 task 之间通过 FIFO 进行传递,而参数 bias 定义为:
hls::ap_none<int> &bias
#pragma HLS interface s_axilite port=bias
AXI Lite 将 bias 映射为寄存器,供 host 在运行时写入;Direct IO 则将其直接映射为硬件端口,使 kernel/IP 在运行过程中可以实时读取该值。
从 cosim 仿真可以看到:

bias 可以通过 AXI Lite 接口不断更新,并被 task2 持续读取。如果不使用 Direct IO,AXI Lite 只能在 kernel/IP 启动前配置参数,无法在运行过程中动态更新。
在 task2 中:
int var = bias.read();
需要注意,这里的 read 并非 FIFO 行为,而是对端口当前值的采样,可理解为:
int var = bias;
Direct IO 与 hls::stream 的主要区别如下:
- stream 基于 FIFO,实现数据缓存和流控;Direct IO 基于 wire,每个 cycle 读取当前值
- stream 保证数据顺序与完整性;Direct IO 无存储,可能丢失中间变化
因此两者分工明确:
- hls::stream:用于 task 之间的数据流传递
- Direct IO:用于运行时控制参数输入
总结:AXI Lite + Direct IO 提供了一种“寄存器 + 实时采样”的接口形式,适用于动态参数更新,而不适用于可靠数据流传输场景。