array参数在顶层约束中的情况
2026/5/22 19:14:28 网站建设 项目流程


一、input_array约束为axis
void array_FIFO (dout_t d_o[4], din_t d_i[4], didx_t idx[4]) {
#pragma HLS INTERFACE axis register both port=d_i

int i;

// Breaks FIFO interface d_o[3] = d_i[2];
For_Loop: for (i=0;i<4;i++) {
d_o[i] = d_i[idx[i]];

//d_o[i] = d_i[i];

}

}

rtl仿真结果:

注意,数组指定axis的时候,不需要指定depth,因为数组默认就已经给定了depth了,数组的大小就是depth,如果是指针变量就不行,指针变量约束为axis,是需要开发者显示的指定detph,否则是死锁的。


二、input_array约束为s_axilite

void array_FIFO (dout_t d_o[4], din_t d_i[4], didx_t idx[4]) {
#pragma HLS INTERFACE s_axilite register port=d_i

int i;

// Breaks FIFO interface d_o[3] = d_i[2];
For_Loop: for (i=0;i<4;i++) {
d_o[i] = d_i[idx[i]];

//d_o[i] = d_i[i];

}

}

需要注意的是,约束为axilte,并不是将其约束为寄存器了,上述代码将其约束为axilite_ram了。

修改代码后:

void array_FIFO (dout_t d_o[4], din_t d_i[4], didx_t idx[4]) {
#pragma HLS INTERFACE s_axilite register depth=4 port=d_i

int i;

// Breaks FIFO interface d_o[3] = d_i[2];
For_Loop: for (i=0;i<4;i++) {
d_o[i] = d_i[idx[i]];

//d_o[i] = d_i[i];

}

}

综合还是生成axilite_bram了。

再次修改:

void array_FIFO (dout_t d_o[4], din_t d_i[4], didx_t idx[4]) {
#pragma HLS ARRAY_PARTITION variable=d_i complete dim=1
#pragma HLS INTERFACE s_axilite register depth=4 port=d_i

int i;

// Breaks FIFO interface d_o[3] = d_i[2];
For_Loop: for (i=0;i<4;i++) {
d_o[i] = d_i[idx[i]];

//d_o[i] = d_i[i];

}

}

三、input_array约束为m_axi------------非常常用

void array_FIFO (dout_t d_o[4], din_t d_i[4], didx_t idx[4]) {
#pragma HLS INTERFACE m_axi port=d_i

int i;

// Breaks FIFO interface d_o[3] = d_i[2];
For_Loop: for (i=0;i<4;i++) {
d_o[i] = d_i[idx[i]];

//d_o[i] = d_i[i];

}

}

上述是数组设计,约束为m_axi的时候,不需要指定depth。如果是指针,需要指定depth.

四、input_array约束为ap_hs

void array_FIFO (dout_t d_o[4], din_t d_i[4], didx_t idx[4]) {
//#pragma HLS INTERFACE m_axi depth=0 port=d_i
#pragma HLS INTERFACE ap_hs port=d_i

int i;

// Breaks FIFO interface d_o[3] = d_i[2];
For_Loop: for (i=0;i<4;i++) {
d_o[i] = d_i[idx[i]];

//d_o[i] = d_i[i];

}

}

五、input_array约束为ap_memory---------非常常用

void array_FIFO (dout_t d_o[4], din_t d_i[4], didx_t idx[4]) {
//#pragma HLS INTERFACE m_axi depth=0 port=d_i
#pragma HLS INTERFACE ap_memory port=d_i

int i;

// Breaks FIFO interface d_o[3] = d_i[2];
For_Loop: for (i=0;i<4;i++) {
d_o[i] = d_i[idx[i]];

//d_o[i] = d_i[i];

}

}

六、input_array约束为bram---------非常常用

void array_FIFO (dout_t d_o[4], din_t d_i[4], didx_t idx[4]) {
//#pragma HLS INTERFACE m_axi depth=0 port=d_i
#pragma HLS INTERFACE bram port=d_i

int i;

// Breaks FIFO interface d_o[3] = d_i[2];
For_Loop: for (i=0;i<4;i++) {
d_o[i] = d_i[idx[i]];

//d_o[i] = d_i[i];

}

}

七、input_array约束为ap_fifo

八、input_array约束为ap_bus
几乎很少用到,用到再说

九、axilite + ap_memory接口的bram-------非常常用
这个只要你将数组约束为axilite,默认就是生成ap_memory+lite接口的bram资源,注意这里是生成ram了,不只是接口。
这个是生成了实实在在的存储资源,而不是存储资源接口。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询