一、数组映射
1.将大量小型数组映射到单一大的数组
在设计中,代码中会存在大量的小型的数组,这样会浪费RAM的数量和资源。可以
将其映射到单一的大型的数组中,通常可以减少所需要的RAM的数量。

2.每个数组映射到器件上,可能映射为块RAM或者UltraRAM。任意一个FPGA中提供的
基本块RAM单元为18K。

二、数组使用array_map映射
1.水平映射
这个是通过扩展RAM的depth来实现的。通过并置原始数组创建新的阵列。单一的数组的元素,也就是depth变大来实现。
2.垂直映射
这个是通过扩展RAM的width来实现的。将数组的位宽变大的单一数组来实现。

三、水平映射
void foo (...) {
int8 array1[M];
int12 array2[N];
#pragma HLS ARRAY_MAP variable=array1 instance=array3 horizontal
#pragma HLS ARRAY_MAP variable=array2 instance=array3 horizontal
...
    loop_1: for(i=0;i<M;i++) {
        array1[i] = ...;
        array2[i] = ...;
        ...
    }
...
}
数组 array1 和 array2 可组合为单一数组,在以下示例中指定为 array3

ARRAY_MAP 指令的 offset 选项用于指定使用 horizontal 选项时后续数组添加到的位置。重复先前示例,但反转命令顺序(先指定 array2,然后指定 array1)并添加 offset,如下所示:

四、垂直映射

垂直映射,是并置多个数组生成更宽的位宽来合并多个数组。垂直映射使用vertical选项进行优化。
void foo (...) {
int8 array1[M];
int12 array2[N];
#pragma HLS ARRAY_MAP variable=array2 instance=array3 vertical
#pragma HLS ARRAY_MAP variable=array1 instance=array3 vertical
...
loop_1: for(i=0;i<M;i++) {
array1[i] = ...;
array2[i] = ...;
...
}
...
}

                                                垂直映射模型

五、数组的复杂映射

#pragma HLS array_partition variable=m_accum cyclic factor=2 dim=1
#pragma HLS array_partition variable=v_accum cyclic factor=2 dim=1
#pragma HLS array_map variable=m_accum[0] instance=_accum horizontal
#pragma HLS array_map variable=v_accum[0] instance=mv_accum horizontal
#pragma HLS array_map variable=m_accum[1] instance=mv_accum_1 horizontal
#pragma HLS array_map variable=v_accum[1] instance=mv_accum_1 horizontal

其中,第一条指令

#pragma HLS array_partition variable=m_accum cyclic factor=2 dim=1

其中,第二条指令

#pragma HLS array_partition variable=v_accum cyclic factor=2 dim=1

其中,第三条指令

#pragma HLS array_map variable=m_accum[0] instance=_accum horizontal

只是将m_accum[0]命名为_accum

其中,第四条指令

#pragma HLS array_map variable=v_accum[0] instance=mv_accum horizontal

v_accum[0]命名为mv_accum

下面这两条指令
#pragma HLS array_map variable=m_accum[1] instance=mv_accum_1 horizontal
#pragma HLS array_map variable=v_accum[1] instance=mv_accum_1 horizontal
是将m_accum[1]和v_accum[1]水平合并为mv_accum_1

六、全局数组映射
可以对全局数组进行映射。对全局数组映射生成的实例,也将是全局实例;
映射到这个全局数组实例的任何局部数组将会变成全局数组。

七、函数的局部数组映射到同一个目标数组时候,目标数组实例将会变成全局实例


 

更多推荐