【问题标题】:VIVADO HLS:How to declare arbitrary precision (or bit-accurate) integer data types for 2D array?VIVADO HLS:如何为二维数组声明任意精度(或位精度)整数数据类型?
【发布时间】:2017-11-24 06:20:35
【问题描述】:

我正在 Vivado HLS 中使用更大尺寸的矩阵。作为普通的“int”,它占用了大量的内存空间并降低了硬件速度。

因此,为了获得更好的优化和性能,最好使用任意精度(或位精度)整数数据类型。我已经阅读了 VIVADO 用户指南,我不清楚。但是,我不知道如何为二维数组初始化“ap_int.h”或“ap_cin.h”。谁能告诉我如何为下面的源代码应用“ap_int.h”或“ap_cin.h”

#define ROWS 102  //k
#define COLS 204
void GeneratorM(int msg[ROWS], int dout[COLS])
{
#pragma HLS INTERFACE s_axilite port=msg bundle=a
#pragma HLS INTERFACE s_axilite port=dout bundle=a
#pragma HLS INTERFACE s_axilite port=return bundle=a
int Generator[ROWS][COLS]= {0};
int G[ROWS][COLS] = {0};
int i,j,k,r,c,n;
k = ROWS;
r = ROWS;
c = COLS;
n = COLS;
static int H[ROWS][COLS];
int Codeword[COLS]= {0};
int s = 0;
for (i=0;i<k;i++)
 for(j=0;j<k;j++)
    if(i == j)
    G[i][j] = 1;

for(i=0;i<r;i++)
 for(j=0;j<k;j++)
    G[j][k+i] = H[i][j];

for(i=0;i<r;i++)
 {
  for(j=0;j<c;j++)
    Generator[i][j]=G[i][j];
 }

for(j=0;j<n;j++)
{
 for(i=0;i<k;i++)
 {
    s = s + msg[i]*Generator[i][j];
 }
  Codeword[j] = s % 2;
  s = 0;
}
 for(i=0;i<n;i++)
 {
 dout[i]=Codeword[i];
 }
}

【问题讨论】:

    标签: c arrays vivado-hls


    【解决方案1】:
    • ap_int.h 用于 C++
    • ap_cint.h 仅适用于 C
    • According to ug902 - 高级综合 C 库,您可以在 C 或 C++ 中使用任意整数精度类型。 (参见第 208 页。)

    基于 C 的 10 位 int 示例:

    #include <ap_cint.h>
    
    int10 foo; 
    

    基于 C++ 的 10 位 int 示例:

    #include <ap_int.h>
    
    ap_int<10> foo;
    

    重写您的示例以在 C 中使用大小为 10 位的任意精度整数数据类型,看起来像这样,它在 HLS 中很好地符合 :)

    #include <ap_cint.h>
    
    #define ROWS 102  //k
    #define COLS 204
    
    typedef int10 arbitraryInt;
    
    void GeneratorM(int msg[ROWS], int dout[COLS])
    {
    #pragma HLS INTERFACE s_axilite port=msg bundle=a
    #pragma HLS INTERFACE s_axilite port=dout bundle=a
    #pragma HLS INTERFACE s_axilite port=return bundle=a
    arbitraryInt Generator[ROWS][COLS]= {0};
    arbitraryInt G[ROWS][COLS] = {0};
    arbitraryInt i,j,k,r,c,n;
    k = ROWS;
    r = ROWS;
    c = COLS;
    n = COLS;
    static arbitraryInt H[ROWS][COLS];
    arbitraryInt Codeword[COLS]= {0};
    arbitraryInt s = 0;
    for (i=0;i<k;i++)
     for(j=0;j<k;j++)
        if(i == j)
        G[i][j] = 1;
    
    for(i=0;i<r;i++)
     for(j=0;j<k;j++)
        G[j][k+i] = H[i][j];
    
    for(i=0;i<r;i++)
     {
      for(j=0;j<c;j++)
        Generator[i][j]=G[i][j];
     }
    
    for(j=0;j<n;j++)
    {
     for(i=0;i<k;i++)
     {
        s = s + msg[i]*Generator[i][j];
     }
      Codeword[j] = s % 2;
      s = 0;
    }
     for(i=0;i<n;i++)
     {
     dout[i]=Codeword[i];
     }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多