FC2カウンター FPGAの部屋 2019年01月15日
FC2ブログ

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

FPGAの部屋

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

Ultra96のDisplayPortを使用するためのIPを作成する3(pattern_gen_axis IPの変更)

Ultra96のDisplayPortを使用するためのIPを作成する2(pattern_gen_axis IP)”の続き。

前回は、pattern_gen_axis IP をVivado HLS 2018.3 で作成したのだが、次のaxis2video_out.v を書いている時に、axis2video_out.v からpattern_gen_axis IP をスタートさせたいという欲求があったので、pattern_gen_axis IP のブロック・レベル・インターフェースを ap_ctrl_hs に変更した。

新しいブロック図は下図になった。
DisplayPort_test_65_190115.png

axis2video_out.v からpattern_gen_axis IP をスタートするために、ブロック・レベルのインターフェースのstart と done を使用している。

pattern_gen_axis IP の変更した。ソースコードを示す。ブロック・レベルのインターフェースを ap_ctrl_hs に変更しただけである。

// pattern_gen_axis.cpp
// 2019/01/13 by marsee
//

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

int pattern_gen_axis(hls::stream<ap_axis<32,1,1,1> >& outs,
        ap_uint<11> v_size, ap_uint<11> h_size,
        ap_uint<1> &init_done, ap_uint<1> &init_done_out
){
#pragma HLS INTERFACE ap_none register port=init_done_out
#pragma HLS INTERFACE s_axilite port=init_done
#pragma HLS INTERFACE s_axilite port=v_size
#pragma HLS INTERFACE s_axilite port=h_size
#pragma HLS INTERFACE axis register both port=outs
#pragma HLS INTERFACE ap_ctrl_hs port=return
    ap_axis<32,1,1,1> out_val;

    init_done_out = init_done;

    LOOP_Y: for(int y=0; y<v_size; y++){
#pragma HLS LOOP_TRIPCOUNT min=768 max=768 avg=768
        LOOP_X: for(int x=0; x<h_size; x++){
#pragma HLS LOOP_TRIPCOUNT min=1024 max=1024 avg=1024
#pragma HLS PIPELINE II=1
            if (y < v_size/2){
                if (x < h_size/2){
                    out_val.data = 0xff0000; // *red=0xff; *green=0; *blue=0;
                } else if (x < h_size){
                    out_val.data = 0x00ff00; // *red=0; *green=0xff; *blue=0;
                } else {
                    out_val.data = 0x000000; // *red=0; *green=0; *blue=0;
                }
            } else if (y < v_size){
                if (x < h_size/2){
                    out_val.data = 0x0000ff; // *red=0; *green=0; *blue=0xff;
                } else if (x < h_size){
                    out_val.data = 0xffffff; // *red=0xff; *green=0xff; *blue=0xff;
                } else {
                    out_val.data = 0x000000; // *red=0; *green=0; *blue=0;
                }
            } else {
                out_val.data = 0x000000; // *red=0; *green=0; *blue=0;
            }

            if(x==0 && y==0)
                out_val.user = 1;
            else
                out_val.user = 0;
            if(x == h_size-1)
                out_val.last = 1;
            else
                out_val.last = 0;

            outs << out_val;
        }
    }
    return(0);
}


pattern_gen_axis IP の新しいレジスタマップを示す。

//------------------------Address Info-------------------
// 0x00 : reserved
// 0x04 : reserved
// 0x08 : reserved
// 0x0c : reserved
// 0x10 : Data signal of v_size_V
//        bit 10~0 - v_size_V[10:0] (Read/Write)
//        others   - reserved
// 0x14 : reserved
// 0x18 : Data signal of h_size_V
//        bit 10~0 - h_size_V[10:0] (Read/Write)
//        others   - reserved
// 0x1c : reserved
// 0x20 : Data signal of init_done_V
//        bit 0  - init_done_V[0] (Read/Write)
//        others - reserved
// 0x24 : reserved
// (SC = Self Clear, COR = Clear on Read, TOW = Toggle on Write, COH = Clear on Handshake)


C コードの合成結果を示す。
DisplayPort_test_66_190115.png

Export RTL の結果を示す。問題ないようだ。
DisplayPort_test_67_190115.png
  1. 2019年01月15日 05:26 |
  2. Ultra96
  3. | トラックバック:0
  4. | コメント:0