FC2カウンター FPGAの部屋 Vivado HLSでラプラシアン・フィルタ式のみをaxi lite slaveモジュールにする2
FC2ブログ

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

FPGAの部屋

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

Vivado HLSでラプラシアン・フィルタ式のみをaxi lite slaveモジュールにする2

Vivado HLSでラプラシアン・フィルタ式のみをaxi lite slaveモジュールにする1”の続き。
(2013/10/05:修正 図とCソースコードを修正しました)

Run C/RTL Cosimulation ボタンをクリックして、Verilog HDLのCo-Simulation を行う。
image_process_Zed_linux_25_131001.png

Cのテストベンチから、Verilog HDLやVHDLのシミュレーターを起動してシミュレーションし、CとHDLの統合シミュレーションが出来るのはとっても便利だ。
シミュレーションが成功して、結果はPASSだった。
image_process_Zed_linux_26_131001.png

次は、カスタムIPとして出力する。

Export RTLアイコンをクリックするか、Solution メニューから Export RTL を選択する。
Export RTL Dialog が開く。そのままOKボタンをクリックして、IPとして出力した。
image_process_Zed_linux_27_131001.png

impl フォルダが作られて、ipフォルダにIPとして出力された。
image_process_Zed_linux_28_131002.png

これでVivado のIP Integrator で使えるわけだが、もしかして?EDKのpcore として出力できないのか?と思い、もう一度、Export RTLアイコンをクリックするか、Solution メニューから Export RTL を選択した。
Export RTL Dialog が開く。Format Selection のプルダウンメニューを見ていると、Pcore of EDK がありました。そのままOKボタンをクリックした。
image_process_Zed_linux_29_131002.png

pcore フォルダが作製され、MPDファイルなどができていた。これで、そのままEDKで pcore として使えそうだ。良かった。。。
image_process_Zed_linux_30_131002.png

使用したCソフトウェアの laplacian_filter.c を下に貼っておく。
(2013/12/21:ラプラシアン・フィルタ関数にバグが有った。このCソース・ファイルとテストベンチは修正してないが、詳しくは、”Vivado HLSでラプラシアン・フィルタ関数をaxi masterモジュールにする2”をご覧ください。)

// laplacian_filter axi lite slave version

#include <stdio.h>

int laplacian_filter(int *x0y0, int *x1y0, int *x2y0, int *x0y1, int *x1y1, int *x2y1, int *x0y2, int *x1y2, int *x2y2)
{
#pragma HLS PIPELINE
#pragma HLS INTERFACE ap_hs port=x0y0
#pragma HLS INTERFACE ap_vld port=x1y0
#pragma HLS INTERFACE ap_vld port=x2y0
#pragma HLS INTERFACE ap_vld port=x0y1
#pragma HLS INTERFACE ap_vld port=x1y1
#pragma HLS INTERFACE ap_vld port=x2y1
#pragma HLS INTERFACE ap_vld port=x0y2
#pragma HLS INTERFACE ap_vld port=x1y2
#pragma HLS INTERFACE ap_vld port=x2y2

#pragma HLS RESOURCE variable=x0y0 core=AXI4LiteS metadata="-bus_bundle BUS_A"
#pragma HLS RESOURCE variable=x1y0 core=AXI4LiteS metadata="-bus_bundle BUS_A"
#pragma HLS RESOURCE variable=x2y0 core=AXI4LiteS metadata="-bus_bundle BUS_A"
#pragma HLS RESOURCE variable=x0y1 core=AXI4LiteS metadata="-bus_bundle BUS_A"
#pragma HLS RESOURCE variable=x1y1 core=AXI4LiteS metadata="-bus_bundle BUS_A"
#pragma HLS RESOURCE variable=x2y1 core=AXI4LiteS metadata="-bus_bundle BUS_A"
#pragma HLS RESOURCE variable=x0y2 core=AXI4LiteS metadata="-bus_bundle BUS_A"
#pragma HLS RESOURCE variable=x1y2 core=AXI4LiteS metadata="-bus_bundle BUS_A"
#pragma HLS RESOURCE variable=x2y2 core=AXI4LiteS metadata="-bus_bundle BUS_A"
#pragma HLS RESOURCE variable=return core=AXI4LiteS metadata="-bus_bundle BUS_A"

    return(abs(-*x0y0 -*x1y0 -*x2y0 -*x0y1 +8*(*x1y1) -*x2y1 -*x0y2 -*x1y2 -*x2y2));
}


laplacian_filter_tb.c も貼っておく。

// laplacian_filter Test Bench
// laplacian_filter_tb.c
//

#include <stdio.h>

int laplacian_filter(int *x0y0, int *x1y0, int *x2y0, int *x0y1, int *x1y1, int *x2y1, int *x0y2, int *x1y2, int *x2y2);

int main(){
    int x0y0;
    int x1y0;
    int x2y0;
    int x0y1;
    int x1y1;
    int x2y1;
    int x0y2;
    int x1y2;
    int x2y2;
    int y;
    int sw_result;

    x0y0 = 1;
    x1y0 = 1;
    x2y0 = 1;
    x0y1 = 1;
    x1y1 = 2;
    x2y1 = 1;
    x0y2 = 1;
    x1y2 = 1;
    x2y2 = 1;

    y = laplacian_filter(&x0y0, &x1y0, &x2y0, &x0y1, &x1y1, &x2y1, &x0y2, &x1y2, &x2y2);
    sw_result = abs(-x0y0 -x1y0 -x2y0 -x0y1 +8*(x1y1) -x2y1 -x0y2 -x1y2 -x2y2);

    printf("HW result = %d\n", y);
    printf("SW result = %d\n", sw_result);

    if (y == sw_result){
        printf("Success SW and HW results match\n");
        return(0);
    } else {
        printf("ERROR SW and HW results mismatch\n");
        return(1);
    }
}

  1. 2013年10月01日 04:37 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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