FC2カウンター FPGAの部屋 Vitis HLS 2020.2 で DMA2axis IP を作る1
fc2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

Vitis HLS 2020.2 で DMA2axis IP を作る1

Vivado 2020.2 を使ってビットマップ・ディスプレイ・コントローラをAXI4-Stream対応にする4”で作った bitmap_disp_cont_axis IP を実機でテストするために DMA to axis 変換 IP を作る必要があるので、作成する。

Vitis HLS 2020.2 で DMA2axis プロジェクトを作成した。
DMA2axis_1_210408.png

ソースコードの DMA2axis.cpp を示す。

// DMA2axis.cpp
// 2021/04/08 by marsee
//

#include <ap_int.h>
#include <hls_stream.h>
#include <ap_axi_sdata.h>

int DMA2axis(volatile ap_int<32> *in, hls::stream<ap_axis<32,1,1,1> >& outs,
        int x_size, int y_size){
#pragma HLS INTERFACE s_axilite port=y_size
#pragma HLS INTERFACE s_axilite port=x_size
#pragma HLS INTERFACE s_axilite port=return
#pragma HLS INTERFACE axis register both port=outs
#pragma HLS INTERFACE m_axi depth=480000 port=in offset=slave
    ap_axis<32,1,1,1> out_val;

    for(int y=0; y<y_size; y++){
#pragma HLS LOOP_TRIPCOUNT avg=600 max=1080 min=480
        for(int x=0; x<x_size; x++){
#pragma HLS LOOP_TRIPCOUNT avg=800 max=1920 min=640
#pragma HLS PIPELINE II=1
            out_val.data = in[y*x_size+x];
            if(x==0 && y==0)
                out_val.user = 1;
            else
                out_val.user = 0;
            if(x == x_size-1)
                out_val.last = 1;
            else
                out_val.last = 0;
            outs << out_val;
        }
    }
    return(0);
}


テストベンチの DMA2axis_tb.cpp を示す。

// DMA2axis_tb.cpp
// 2021/04/08 by marsee
//

#include <stdint.h>
#include <ap_int.h>
#include <hls_stream.h>
#include <ap_axi_sdata.h>

int DMA2axis(volatile ap_int<32> *in, hls::stream<ap_axis<32,1,1,1> >& outs,
        int x_size, int y_size);

int main(){
    hls::stream<ap_axis<32,1,1,1> > outs;
    ap_axis<32,1,1,1> vals;

    // 800 x 600 の領域を確保
    std::vector<ap_int<32>> buf(sizeof(ap_int<32>)*800*600);

    // 確保した領域にデータを入力する
    for(int i=0; i<480000; i++){
        buf[i] = i;
    }

    DMA2axis((volatile ap_int<32> *)&buf[0], outs, 800, 600);

    for(int i=0; i<480000; i++){
        outs >> vals;
        if(vals.data != i){
            printf("Error : i = %d; vals.data = %d\n", i, vals.data);
            return(1);
        }
    }
    printf("Simulation succeeded without error\n");
    return(0);
}

  1. 2021年04月08日 05:17 |
  2. Vitis HLS
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
https://marsee101.blog.fc2.com/tb.php/5201-f8308c40
この記事にトラックバックする(FC2ブログユーザー)