FC2カウンター FPGAの部屋 Vivado HLS 2014.4 で AXI4-Stream をテストする2(1次元のフィルタのテスト1、C++ソースコードの公開)

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

FPGAの部屋

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

Vivado HLS 2014.4 で AXI4-Stream をテストする2(1次元のフィルタのテスト1、C++ソースコードの公開)

Vivado HLS 2014.4 で AXI4-Stream をテストする1(準備編)”の続き。

今度の目的は、AXI4-Stream を使ったラプラシアンフィルタをC++をソースコードとした高位合成で作製するのだが、さいしょの段階として、高位合成がどのようなHDLを生成するのかを確認するために最初に1次元のフィルタで試してみようと思う。

AXI4-Steramでラプラシアンフィルタを実装するためには、明示的にシフトレジスタを書く必要がある。その書き方は、”Vivado HLS ツールを使用し たビデオ処理用メ モ リ構造のインプリメント XAPP793 (v1.0) 2012 年 9 月 20 日”の3ページからに書いてある。この辺りを順次試しながら、ラプラシアンフィルタのAXI4-Stream版を試していこうと思う。

なお、ラプラシアンフィルタ のC++版ソースコードは、tu1978 さんがすでに、GitHubにあげてくれている(formalism/laplacian_filter_hls)。これを使わせて頂いても良いのだが、Vivado HLS 2014.4 の AXI4-Stream の作法の練習とともに、シフトレジスタの書き方の練習からやっていこうと思う。それに、C++ をよく知らないので、C++ の練習もやっていこうと思っている。

tu1987 さんのラプラシアンフィルタのC++ ソースコードを参考にさせて頂いて、インチキな myfilter() を書いてみた。トップのファイル名は fil_axis_sample.cpp とした。fil_axis_sample.cpp を下に示す。

//
// fil_axis_sample.cpp
// 2015/04/18
//

#include <stdio.h>
#include <string.h>
#include <ap_int.h>
#include <hls_stream.h>

#include "fil_axis_sample.h"

int my_filter(int sr0, int sr1, int sr2);

int fil_axis_sample(hls::stream<ap_int<32> >& in_data, hls::stream<ap_int<32> >& out_data){
#pragma HLS INTERFACE axis port=in_data
#pragma HLS INTERFACE axis port=out_data
#pragma HLS INTERFACE s_axilite port=return

    int sreg[3] = {};    // 0にクリアする

#pragma HLS array_partition variable=sreg complete

    for (int i=0; i<HORIZONTAL_PIXEL_WIDTH; i++){
#pragma HLS PIPELINE
        for (int j=0; j<2; j++){
#pragma HLS UNROLL
                sreg[j] = sreg[j+1];
        }
        sreg[2] = in_data.read();

        int val = my_filter(sreg[0], sreg[1], sreg[2]);
        out_data.write(val);
    }

    return 1;
}

int my_filter(int sr0, int sr1, int sr2){
    int rv = -sr0 +2*sr1 -sr2;
    if (rv < 0){
        rv = 0;
    }

    return(rv);
}


fil_axis_sample.h はこれだけだ。

// fil_axis_sample.h

#define HORIZONTAL_PIXEL_WIDTH 50


これで、Vivado HLS 2014.4 で fil_axis_sample プロジェクトを作製した。
lap_filter_AXIS_1_150424.png

次に、テストベンチ用のC++ ファイル、fil_axis_sample_tb.cpp を作製した。fil_axis_sample_tb.cpp を下に示す。

// fil_axis_sample_tb.cpp

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ap_int.h>
#include <hls_stream.h>
#include <iostream>
#include <fstream>

#include "fil_axis_sample.h"

int fil_axis_sample(hls::stream<ap_int<32> >& in_data, hls::stream<ap_int<32> >& out_data);

#define CLOCK_PERIOD 10

int main()
{
    using namespace std;

    hls::stream<ap_int<32> > in_data;
    hls::stream<ap_int<32> > out_data;
    int m_seq = 1// M系列の値
    int xor_shift;

    cout << "in_data" << endl;
    for(int i=0; i < HORIZONTAL_PIXEL_WIDTH; i++){
        //xor_shift = (m_seq>>31) ^ ((m_seq>>21)& 1) ^ ((m_seq>>1) & 1) ^ (m_seq & 1); // (32, 22, 2, 1)
        //m_seq = (m_seq<<1) | xor_shift;
        if ((i%CLOCK_PERIOD) < (CLOCK_PERIOD/2))
            m_seq = 0;
        else
            m_seq = 1000;

        in_data.write((ap_int<32>)m_seq);
        cout << hex << m_seq << endl;
    }

    fil_axis_sample(in_data, out_data);

    cout << endl;
    cout << "out_data" << endl;
    for(int i=0; i < HORIZONTAL_PIXEL_WIDTH; i++){
        ap_int<32> val = out_data.read();
        cout << hex << val << endl;
    }

    return 0;
}


最初に、入力データをM系列で作ったが、出力がよく分からなかったので、矩形波で作りなおした。
  1. 2015年04月24日 05:41 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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