FC2カウンター FPGAの部屋 Vivado HLSでAXI4 Master IPを書いた時のバースト転送の条件

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

FPGAの部屋

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

Vivado HLSでAXI4 Master IPを書いた時のバースト転送の条件

Vivado HLS で AXI4 Master IP を書いた時のバースト転送の条件は、ユーザーズガイドによると memcpy() を使った時にバースト転送しますと書いてあるが、どうやらそうでもないようだ。(Vivado Design Suite ユーザー ガイド 高位合成 UG902 (v2015.1) 2015 年 4 月 1 日の158ページの”AXI4 マスター インターフェイス”を参照のこと)

ラプラシアンフィルタの時は、シングル転送で読んで、シングル転送で書いていたが、もっと簡単な、if 文とかもない実装では、バースト転送するようだ。2014.4 と 2015.2 でもそのようだ。

RGBの値のピクセルを輝度信号Y に変換する conv_rgb2y() を複数処理できる conv_rgb2ym() にして単独で AXI4 Master IP にしてみた。
下に、conv_rgb2ym.cpp を示す。

// RGBからYへの変換
// RGBのフォーマットは、{8'd0, R(8bits), G(8bits), B(8bits)}, 1pixel = 32bits
// 輝度信号Yのみに変換する。変換式は、Y =  0.299R + 0.587G + 0.114B
// "YUVフォーマット及び YUV<->RGB変換"を参考にした。http://vision.kuee.kyoto-u.ac.jp/~hiroaki/firewire/yuv.html
// 2013/09/27 : float を止めて、すべてint にした
// 2015/09/15 : RGB-y変換AXI Masterハージョン by marsee

#include "conv_rgb2ym.h"

int conv_rgb2ym(int *rgb, int *y){
#pragma HLS INTERFACE s_axilite port=return

#pragma HLS INTERFACE m_axi depth=4096 port=rgb offset=slave
#pragma HLS INTERFACE m_axi depth=4096 port=y offset=slave

    int r, g, b, y_f;
    int rgb_val;

    for (int i=0; i<DATA_SIZE; i++){
#pragma HLS PIPELINE II=1
        rgb_val = *rgb++;
         b = rgb_val & 0xff;
        g = (rgb_val>>8) & 0xff;
        r = (rgb_val>>16) & 0xff;

        y_f = 77*r + 150*g + 29*b; //y_f = 0.299*r + 0.587*g + 0.114*b;の係数に256倍した
        *y++ = y_f >> 8// 256で割る
    }

    return(0);
}


conv_rgb2ym.h を貼っておく。

// conv_rgb2ym.h
// 2015/09/15 : by marsee
//

#define DATA_SIZE 4096


下にC++のテストベンチ conv_rgb2ym_tb.cpp を貼っておく。

// conv_rgb2ym_tb.cpp
// 2015/09/15 by marsee
//

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "conv_rgb2ym.h"

int conv_rgb2ym(int *rgb, int *y);
int conv_rgb2ym_soft(int *rgb, int *y);

int main(){
    int *rgb, *hw_y, *sw_y;
    int *h, *s;

    // メモリをアロケートする
    if ((rgb =(int *)malloc(sizeof(int) * (DATA_SIZE))) == NULL){
        fprintf(stderr, "Can't allocate rd_bmp memory\n");
        exit(1);
    }
    if ((hw_y =(int *)malloc(sizeof(int) * (DATA_SIZE))) == NULL){
        fprintf(stderr, "Can't allocate hw_lapd memory\n");
        exit(1);
    }
    if ((sw_y =(int *)malloc(sizeof(int) * (DATA_SIZE))) == NULL){
        fprintf(stderr, "Can't allocate sw_lapd memory\n");
        exit(1);
    }

    for (int i=0; i<DATA_SIZE; i++)
        rgb[i] = i<<16 + i<<8 + i;

    conv_rgb2ym(rgb, hw_y);
    conv_rgb2ym_soft(rgb, sw_y);

   for (int i=0; i<DATA_SIZE; i++){
       if (hw_y[i] != sw_y[i]){
           printf("ERROR HW and SW results mismatch i = %d, HW = %d, SW = %d\n", i, hw_y[i], sw_y[i]);
           return(1);
       }
   }
   printf("Success HW and SW results match\n");

   free(rgb);
   free(hw_y);
   free(sw_y);
}

int conv_rgb2ym_soft(int *rgb, int *y){
    int r, g, b, y_f;
    int rgb_val;

    for (int i=0; i<DATA_SIZE; i++){
        rgb_val = *rgb++;
         b = rgb_val & 0xff;
        g = (rgb_val>>8) & 0xff;
        r = (rgb_val>>16) & 0xff;

        y_f = 77*r + 150*g + 29*b; //y_f = 0.299*r + 0.587*g + 0.114*b;の係数に256倍した
        *y++ = y_f >> 8// 256で割る
    }

    return(0);
}


Vivado HLS 2014.4 でプロジェクトを作った。
HLS_AXIM_Burst_1_150917.png

Cシミュレーションを行ってから、HDLへ合成を行った。
その後、C/RTLコシミュレーションを行った。
Vivado 2015.2 で波形を確認した。その波形を下に示す。
HLS_AXIM_Burst_2_150917.png

AWLEN やARLEN は0xff つまり 256バーストとなっている。
WVALID ,WREADY は転送中は 1 だし、RVALID とRREADY も転送中は 1 なので、WAIT無しでバーストしているようだ。
このように単純なコードならば、memcpy() を使わなくてもバースト転送するようだ。
  1. 2015年09月17日 04:25 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:4

コメント

Vivado HLS勉強会の資料

Vivado HLS勉強会の資料、公開してください!
よろしくお願いします。
  1. 2015/09/17(木) 07:51:23 |
  2. URL |
  3. あかとら #-
  4. [ 編集 ]

とりあえず、一般公開の予定はありません。資料が多すぎるし。。。
大学関係者の希望者には配るかもしれません。できれば、他大学で勉強会したいですけど。。。
一般の方はライセンスが無いと思し、企業の方は通常はXilinxのセミナを受講したほうが良いと思います。

P.S. コメントは関連のある記事にお願いします。
  1. 2015/09/17(木) 08:06:39 |
  2. URL |
  3. marsee #f1oWVgn2
  4. [ 編集 ]

以前、if文を避けた記述のソースを書いてましたが、多分あれでもバースト転送しないんでしょうね。
バーストになるメモリの使い方とか演算の量とか条件がいろいろありそう。
  1. 2015/09/17(木) 09:11:21 |
  2. URL |
  3. おる #-
  4. [ 編集 ]

おるさん、マニュアルにはmemcpy() を使うとバースト転送しますよと書いてあります。memcpy()を使わないとバースト転送しませんとは書いてないので、単純な場合はバースト転送するようです。
バースト転送するかしないかの境界がどの辺りにあるかは?今のところ分かりません。
  1. 2015/09/18(金) 05:10:04 |
  2. URL |
  3. marsee #f1oWVgn2
  4. [ 編集 ]

コメントの投稿


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

トラックバック URL
http://marsee101.blog19.fc2.com/tb.php/3252-1d773c45
この記事にトラックバックする(FC2ブログユーザー)