axis表示的是AXI4-Stream接口
1.axis接口可以指定input参数
2.axis接口可以指定output参数
3.axis接口不能指定iout参数
4.void test(int a);中的a作为input scalar变量,可以约束为axis接口
5.void test(int& b);中的b作为output scalar变量,可以约束为axis接口
6.void test(int c[200]);中的数组c可以作为input array变量,可以约束为axis接口
7.void test(int d[200]);中的数组d可以作为output array变量,可以约束为axis接口
8.void test(int* e);中的指针e可以约束为axis接口
9.void test(int* f);中的指针f可以约束为axis接口
10.hls::stream变量,自动约束为axis接口

AXI4-STREAM接口
1.axi4-stream接口可以应用于任意输入参数和任意数组或者指针输出参数
2.axi4-stream接口是按照顺序流传输的方式来进行数据的传输的,所以不可以同时支持读写的实参
3.axi4-stream接口包含非寄存器,输入寄存,输出寄存,输入输出信号都寄存四种状态
• 正向:仅寄存 TDATA 和 TVALID 信号。
• 反向:仅寄存 TREADY 信号。
• 双向:寄存所有信号(TDATA、TREADY 和 TVALID)。这是默认方式。
• 关:不寄存任何端口信号


可综合设计模块内部使用axis
1.在设计内,如果实现需要 FIFO,必须使用 STREAM 指令将所有数组指定为流传输
2.在设计内部,对数组应用 STREAM 指令时,硬件内实现生成的 FIFO 包含的元素数量与数组同样多。-depth 选项可用于指
定 FIFO 的大小。
3.顶层接口上的 hls::stream<> 默认情况下使用 ap_fifo 接口来实现
4.设计内部的 hls::stream<> 作为 FIFO 来实现,深度为 2。最优化指令 STREAM 用于更改此默认大小

为什么axis接口不需要像m_axi那样设置depth参数?
axis接口是一种轻量级的流式接口,主要用于点对点的数据流传输,其控制逻辑(ready/valid握手)天然地处理了数据流的同步,通常不需要深度的缓冲区。而m_axi是内存映射接口,用于访问DDR等存储器,需要depth参数来指定访问请求队列的深度

axis接口使用案例一:
#include "ap_int.h"

// 假设使用上面定义的 axis 结构体
template <int D>
struct axis {
    ap_uint<D> data;
    ap_uint<D/8> keep;
    ap_uint<1> last;
};

void pass_scalar_over_axis(axis<32>& input_scalar, 
                           axis<32>& output_scalar) {
    // 告诉 Vivado HLS 将 input_scalar 和 output_scalar 接口实现为 AXI4-Stream
    #pragma HLS INTERFACE axis port=input_scalar
    #pragma HLS INTERFACE axis port=output_scalar
    
    // 你的处理逻辑:这里只是简单地将输入标量传递给输出
    // 在实际应用中,你可能会根据 input_scalar.data 进行计算
    output_scalar.data = input_scalar.data + 42; // 示例处理
    output_scalar.keep = input_scalar.keep; // 通常保持 keep 不变
    output_scalar.last = input_scalar.last; // 或者根据你的协议设置 last
}

案例二:
void dataflow_top(axis<32> &inStream, axis<32> &outStream, axis<32> &configScalar) {
    #pragma HLS DATAFLOW
    #pragma HLS INTERFACE axis port=inStream
    #pragma HLS INTERFACE axis port=outStream
    #pragma HLS INTERFACE axis port=configScalar

    static hls::stream<intermediate_t> pipe1;
    static hls::stream<intermediate_t> pipe2;

    // 假设 module_one 使用 configScalar 作为配置输入
    module_one(inStream, configScalar, pipe1);
    module_two(pipe1, pipe2);
    module_three(pipe2, outStream);
}

案例三:
#include "hls_stream.h"

void data_processing_top(hls::stream<axis_data> &input_stream, 
                         hls::stream<axis_data> &output_stream) {
    #pragma HLS INTERFACE axis port=input_stream
    #pragma HLS INTERFACE axis port=output_stream
    // 你的处理逻辑会在这里
    axis_data input_packet;
    input_stream.read(input_packet); // 阻塞读取,直到有数据可用

    axis_data output_packet;
    output_packet.data = input_packet.data * 2; // 示例处理:数据乘2
    output_packet.last = input_packet.last; // 传递 TLAST 信号

    output_stream.write(output_packet); // 阻塞写入,直到下游准备好
}

案例四:
void processing_system(hls::stream<axis_data> &in, hls::stream<axis_data> &out) {
    #pragma HLS DATAFLOW
    #pragma HLS INTERFACE axis port=in
    #pragma HLS INTERFACE axis port=out

    static hls::stream<axis_data> stage1_to_stage2; // 使用HLS的stream类做内部通道
    static hls::stream<axis_data> stage2_to_stage3;

    module_stage1(in, stage1_to_stage2);
    module_stage2(stage1_to_stage2, stage2_to_stage3);
    module_stage3(stage2_to_stage3, out);
}

hls::stream<> 类实现的串流具有如下属性:

hls::stream<> 的行为与无限深度的 FIFO 相似。
按顺序对其执行读写操作。从 hls::stream<> 读取数据之后,无法再次对其进行读取。
hls::stream<> 作为顶层接口上的实参时,impl 为:ap_fifo or AXIS。
hls::stream<> 作为局部或全局变量时,impl 为:fifo。


vivado hls接口综合
一、如果使用C/RTL协同仿真功能来验证RTL设计,必须满足至少其中一项:
1.顶层接口必须使用ap_ctrl_hs或者ap_ctrl_chain块级接口对顶层函数进行综合
2.如果顶层接口不是ap_ctrl_hs或者ap_ctrl_chain块级接口的情况,也就说顶层接口使用ap_ctrl_none,那就需要满足下面其中
的一种:
a.必须使用纯组合逻辑设计
b.顶层函数的启动间隔必须等于1
c.接口包含的数据必须全部使用ap_hs或者axis接口模式来传输和实现。

更多推荐