FC2カウンター FPGAの部屋 IP
fc2ブログ

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

FPGAの部屋

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

Vivado 2020.2 を使用して AXI4-Stream 版ビットマップ・ディスプレイ・コントローラをテストする2

Vivado 2020.2 を使用して AXI4-Stream 版ビットマップ・ディスプレイ・コントローラをテストする1”の続き。

今まで作ってきた IP と Digilent の GitHub の Digilent Vivado library の rgb2dvi IP を使用して AXI4-Stream 版ビットマップ・ディスプレイ・コントローラをテストしてみようということで、前回は、Vivado 2020.2 で bm_disp_axis_test プロジェクトを作成し、IP を接続したブロックデザインを作成して、論理合成、インプリメンテーション、ビットストリームの生成を行って、ハードウェアをエクスポートした。今回は、Vitis 2020.2 を立ち上げて、プラットフォームとアプリケーション・プロジェクトを作成して、実機検証してみよう。

Vitis 2020.2 を Vivado 2020.2 から立ち上げて、 bm_disp_axis_test_wrapper プラットフォームと bm_disp_axis_test アプリケーション・プロジェクトを作成した。

bm_disp_axsi_test_system -> bm_disp_axsi_test -> src に bm_disp_axis_test.c ソースコード・ファイルを作成した。画像を C 言語のヘッダ・ファイルに変換した bmp_data.h をインポートした。(”Vivado HLS 2019.1 を使用してBMPファイルをC のヘッダファイルに変換する”参照)
bm_dispc_axis_60_210412.png

これで、ビットファイルを ZYBO Z7-20 にコンフィギュレーションして、アプリケーション・ソフトウェアを起動したが、HDMI ポートに接続されたディスプレイに画像が表示された。成功だ。
bm_dispc_axis_61_210412.jpg

bm_disp_axis_test.c ソースコードを貼っておく。

// bm_disp_axis_test.c
// 2021/04/09 by marsee
//

#include <stdio.h>
#include "xil_io.h"
#include "xparameters.h"

#include "xdma2axis.h"
#include "bmp_data.h"

#define FRAME_BUFFER_ADDRESS 0x10000000
#define DMA_DEST_ADDRESS 0x10200000

#define HORIZONTAL_PIXELS   800
#define VERTICAL_LINES      600

int bmp_write(unsigned int addr);
void Xil_DCacheFlush(void);

int main(){
    XDma2axis xdma2s_ap;

    XDma2axis_Initialize(&xdma2s_ap, XPAR_DMA2AXIS_0_DEVICE_ID);

    XDma2axis_Set_x_size(&xdma2s_ap, (u32)HORIZONTAL_PIXELS);
    XDma2axis_Set_y_size(&xdma2s_ap, (u32)VERTICAL_LINES);
    XDma2axis_Set_in_V(&xdma2s_ap, (u32)FRAME_BUFFER_ADDRESS);

    bmp_write(FRAME_BUFFER_ADDRESS);
    Xil_DCacheFlush();

    Xil_Out32(XPAR_BITMAP_DISP_CONT_AXIS_0_BASEADDR, (u32)DMA_DEST_ADDRESS); // bm_disp_axis start
    XDma2axis_Start(&xdma2s_ap);
    XDma2axis_EnableAutoRestart(&xdma2s_ap);

    return(0);
}

int bmp_write(unsigned int addr){
    for(int y=0; y<VERTICAL_LINES; y++){
        for(int x=0; x<HORIZONTAL_PIXELS; x++){
            Xil_Out32(addr+(y*HORIZONTAL_PIXELS+x)*sizeof(int),
                ((int)bmp_file_array[y][x][2]<<16)+((int)bmp_file_array[y][x][1]<<8)+(int)bmp_file_array[y][x][0]);
        }
    }
    return(0);
}

  1. 2021年04月12日 05:00 |
  2. IP
  3. | トラックバック:0
  4. | コメント:0

Vivado 2020.2 を使用して AXI4-Stream 版ビットマップ・ディスプレイ・コントローラをテストする1

今まで、Vivado 2020.2 を使用して AXI4-Stream 版ビットマップ・ディスプレイ・コントローラを作ってきた。
Vivado 2020.2 を使ってビットマップ・ディスプレイ・コントローラをAXI4-Stream対応にする1
”Vivado 2020.2 を使ってビットマップ・ディスプレイ・コントローラをAXI4-Stream対応にする2
Vivado 2020.2 を使ってビットマップ・ディスプレイ・コントローラをAXI4-Stream対応にする3
Vivado 2020.2 を使ってビットマップ・ディスプレイ・コントローラをAXI4-Stream対応にする4

AXI4-Stream 版ビットマップ・ディスプレイ・コントローラに画像のピクセル・データを供給する DMA2axis IP も作った。
Vitis HLS 2020.2 で DMA2axis IP を作る1
Vitis HLS 2020.2 で DMA2axis IP を作る2

今まで作ってきた IP と Digilent の GitHub の Digilent Vivado library の rgb2dvi IP を使用して AXI4-Stream 版ビットマップ・ディスプレイ・コントローラをテストしてみよう。

Vivado 2020.2 で bm_disp_axis_test プロジェクトを作成した。
bm_dispc_axis_52_210411.png

bm_disp_axis_test プロジェクトのディレクトリに DMA2axis 、 bitmap_disp_cont_axis 、 rgb2dvi の各IP が入ったディレクトリを作成した。
bm_dispc_axis_59_210411.png

DMA2axis 、 bitmap_disp_cont_axis 、 rgb2dvi の各IP を IP Catalog に登録した。

bm_disp_axis_test ブロックデザインを作成した。
bm_dispc_axis_53_210411.png

processing_system7_0 のクロックの設定を示す。
bm_dispc_axis_54_210411.png

rgb2dvi_0 の設定を示す。
bm_dispc_axis_55_210411.png

Address Map を示す。
bm_dispc_axis_56_210411.png

論理合成、インプリメンテーション、ビットストリームの生成を行った。
Project Summary を示す。
bm_dispc_axis_57_210411.png

ハードウェアをエクスポートして、 bm_disp_axis_test_wrapper.xsa を作成した。
bm_dispc_axis_58_210411.png
  1. 2021年04月11日 03:45 |
  2. IP
  3. | トラックバック:0
  4. | コメント:0

Vivado 2020.2 を使ってビットマップ・ディスプレイ・コントローラをAXI4-Stream対応にする4

Vivado 2020.2 を使ってビットマップ・ディスプレイ・コントローラをAXI4-Stream対応にする3”の続き。

Vitis Vision Library を本格的にやるために、前回は、今まで作ったファイルを使用してシミュレーションを行って、成功した。今回は、IP としてパッケージをしてみよう。

”ビットマップ・ディスプレイ・コントローラをAXI4-Stream対応にする5(IP作成)”を参考にやってみよう。

Vivado 2020.2 のTools メニューから Create and Package IP... を選択する。

Create and Package New IP ダイアログが表示された。
bm_dispc_axis_31_210407.png

Package your current project のラジオボタンが設定されていることを確認して、Next > ボタンをクリックした。
bm_dispc_axis_27_210407.png

ここもデフォルトのまま
bm_dispc_axis_28_210407.png

Summary
bm_dispc_axis_29_210407.png

Package IP タブが表示された。
bm_dispc_axis_30_210407.png

Identification
Vendor を marsee101 に変更した。
bm_dispc_axis_31_210407.png

Compatibility
bm_dispc_axis_32_210407.png

File Groups
video_timing_param.vh が入っている。
bm_dispc_axis_33_210407.png

Customization Parameters
bm_dispc_axis_34_210407.png

Ports and Interfaces 。 vid... 信号をRGB インターフェースにまとめる。
bm_dispc_axis_35_210407.png

ここからは、”ZYBO_0 を変更1(ブロックデザインの修正)”を参照する。

vid_…信号を選択して(選択しなくても良さそうだが。。。)、右クリックメニューから Add Bus Interface... を選択し、RGBインターフェースを生成する。

Add Interface ダイアログが表示された。
Interface Definition を選択するために ... ボタンをクリックした。
bm_dispc_axis_36_210407.png

Interface Definition Chooser でRGB インターフェースのvid_io_rtl を選択した。
bm_dispc_axis_37_210407.png

Interface Definition に vid_io_rtl が表示された。
Name に RGB と入力した。
Display name に RGB Video Output と入力し、OKボタンをクリックした。
bm_dispc_axis_39_210407.png

Port Mapping タブをクリックして、ポートをマッピングした。
bm_dispc_axis_40_210407.png

RGB インターフェースを設定することができた。
bm_dispc_axis_41_210407.png

Addressing and Memory
bm_dispc_axis_42_210407.png

Customization GUI
bm_dispc_axis_43_210407.png

Review and Package で Package IP ボタンをクリックしてIP を生成した。
bm_dispc_axis_44_210407.png

IP 生成が成功したというダイアログが表示された。
bm_dispc_axis_45_210407.png

bm_dispc_axis/bm_dispc_axis.srcs ディレクトリに marsee101_user_bitmap_disp_cont_axis_1.0.zip が生成された。
bm_dispc_axis_46_210407.png
  1. 2021年04月07日 04:41 |
  2. IP
  3. | トラックバック:0
  4. | コメント:0

Vivado 2020.2 を使ってビットマップ・ディスプレイ・コントローラをAXI4-Stream対応にする3

Vivado 2020.2 を使ってビットマップ・ディスプレイ・コントローラをAXI4-Stream対応にする2”の続き。

Vitis Vision Library を本格的にやるために、前回は、Vitis_HLS 2020.2 でシミュレーション用の AXI4-Stream Master Model を作った。今回は、今まで作ったファイルを使用してシミュレーションしてみよう。

参考にするのは、”ビットマップ・ディスプレイ・コントローラをAXI4-Stream対応にする3(シミュレーション)”だ。シミュレーション用のテストベンチ・ファイルの bitmap_disp_cntrler_axi_master_tb.v もここに貼ってある。

シミュレーションするための Verilog HDL コードは、”ビットマップ・ディスプレイ・コントローラをAXI4-Stream対応にする4(ソースコードの公開)”に貼ってあるのだが、 video_timing_param.vh が抜けているので、ここに貼っておく。

// video_timing_param.vh
// by marsee
// 2014/07/26

parameter integer H_ACTIVE_VIDEO = (RESOLUTION=="VGA") ?    640 :   // VGA    25MHz
                    (RESOLUTION=="SVGA") ?                  800 :   // SVGA   40MHz
                    (RESOLUTION=="XGA") ?                   1024 :  // XGA    65MHz
                    (RESOLUTION=="SXGA") ?                  1280 :  // SXGA   108MHz
                    (RESOLUTION=="HD") ?                    1920 : 1920;    // HD     148.5MHz

parameter integer H_FRONT_PORCH = (RESOLUTION=="VGA") ? 16 :    // VGA
                    (RESOLUTION=="SVGA") ?              40 :    // SVGA
                    (RESOLUTION=="XGA") ?               24 :    // XGA
                    (RESOLUTION=="SXGA") ?              48 :    // SXGA
                    (RESOLUTION=="HD") ?                88 : 88;    // HD

parameter integer H_SYNC_PULSE = (RESOLUTION=="VGA") ?  96 :    // VGA
                    (RESOLUTION=="SVGA") ?              128 :   // SVGA
                    (RESOLUTION=="XGA") ?               136 :   // XGA
                    (RESOLUTION=="SXGA") ?              112 :   // SXGA
                    (RESOLUTION=="HD") ?                44 : 44;    // HD

parameter integer H_BACK_PORCH = (RESOLUTION=="VGA") ?  48 :    // VGA
                    (RESOLUTION=="SVGA") ?              88 :    // SVGA
                    (RESOLUTION=="XGA") ?               160 :   // XGA
                    (RESOLUTION=="SXGA") ?              248 :   // SXGA
                    (RESOLUTION=="HD") ?                148 : 148;  // HD

parameter integer V_ACTIVE_VIDEO = (RESOLUTION=="VGA") ?    480 :   // VGA
                    (RESOLUTION=="SVGA") ?                  600 :   // SVGA
                    (RESOLUTION=="XGA") ?                   768 :   // XGA
                    (RESOLUTION=="SXGA") ?                  1024 :  // SXGA
                    (RESOLUTION=="HD") ?                    1080 : 1080;    // HD

parameter integer V_FRONT_PORCH = (RESOLUTION=="VGA") ? 11 :    // VGA
                    (RESOLUTION=="SVGA") ?              1 : // SVGA
                    (RESOLUTION=="XGA") ?               2 : // XGA
                    (RESOLUTION=="SXGA") ?              1 : // SXGA
                    (RESOLUTION=="HD") ?                4 : 4;  // HD

parameter integer V_SYNC_PULSE = (RESOLUTION=="VGA") ? 2 :  // VGA
                    (RESOLUTION=="SVGA") ?              4 : // SVGA
                    (RESOLUTION=="XGA") ?               6 : // XGA
                    (RESOLUTION=="SXGA") ?              3 : // SXGA
                    (RESOLUTION=="HD") ?                5 : 5;  // HD

parameter integer V_BACK_PORCH = (RESOLUTION=="VGA") ?  31 :    // VGA
                    (RESOLUTION=="SVGA") ?              23 :    // SVGA
                    (RESOLUTION=="XGA") ?               29 :    // XGA
                    (RESOLUTION=="SXGA") ?              38 :    // SXGA
                    (RESOLUTION=="HD") ?                36 : 36;    // HD

    parameter H_SUM = H_ACTIVE_VIDEO + H_FRONT_PORCH + H_SYNC_PULSE + H_BACK_PORCH;
    parameter V_SUM = V_ACTIVE_VIDEO + V_FRONT_PORCH + V_SYNC_PULSE + V_BACK_PORCH;

    parameter H_DISPLAY_SIZE = H_ACTIVE_VIDEO/8; // 横?桁
    parameter V_DISPLAY_SIZE = V_ACTIVE_VIDEO/8; // 縦?行
    parameter ALL_CHAR_SIZE = H_DISPLAY_SIZE*V_DISPLAY_SIZE;

    parameter RED_DOT_POS = 15; // 15~13ビット目がRED
    parameter GREEN_DOT_POS = 12; // 12~10ビット目がGREEN
    parameter BLUE_DOT_POS = 9; // 9~7ビット目がBLUE
    parameter COLOR_ATTRIB_WIDHT = 3;   // 色情報のビット幅


Vivado 2020.2 を使ってビットマップ・ディスプレイ・コントローラをAXI4-Stream対応にする1”の bitmap_afifo と”Vivado 2020.2 を使ってビットマップ・ディスプレイ・コントローラをAXI4-Stream対応にする2”の AXI4-Stream Master Model も使用した。

Vivado 2020.2 で bm_dispc_axis プロジェクトを作成して、各ファイルを Add Source した。
bm_dispc_axis_19_210405.png

Run Simulation から Run Behavioral Simulation を選択して、シミュレーションを行った。
bm_dispc_axis_20_210406.png

シミュレーション波形の全体を示す。
bm_dispc_axis_21_210406.png

画像データの出力開始部分を拡大した。
bm_dispc_axis_22_210406.png

VSYNC が見えるように 17 ms までシミュレーションを行った。
bm_dispc_axis_23_210406.png

問題無さそうだ。
なお、この AXI4-stream 版ビットマップ・ディスプレイ・コントローラはビデオ信号出力なので、 Digilent の rgb2dvi IP を使用して、HDMI 出力として出力する予定だ。
  1. 2021年04月06日 03:59 |
  2. IP
  3. | トラックバック:0
  4. | コメント:0

Vivado 2020.2 を使ってビットマップ・ディスプレイ・コントローラをAXI4-Stream対応にする2

Vivado 2020.2 を使ってビットマップ・ディスプレイ・コントローラをAXI4-Stream対応にする1”の続き。

Vitis Vision Library を本格的にやるために、前回は、Vivado 2020.2 を使用してビットマップ・ディスプレイ・コントローラをAXI4-Stream対応にするために、非同期FIFO の bitmap_afifo を生成した。今回は、シミュレーションするために、Vitis_HLS 2020.2 で AXI4-Stream Master Model を作ってみよう。

”Vivado HLS でAXI4-Stream Master Model IP を作る”を参考にして、Vitis_HLS 2020.2 で AXI4-Stream Master Model を作っていく。

”Vivado HLS でAXI4-Stream Master Model IP を作る”のソースコードとテストベンチを使って axi4_stream_master プロジェクトを作った。
bm_dispc_axis_10_210405.png

C シミュレーションを行った。成功した。
bm_dispc_axis_11_210405.png

C コードを合成した。結果を示す。
bm_dispc_axis_12_210405.png
bm_dispc_axis_13_210405.png

C/RTL 協調シミュレーションを行った。
bm_dispc_axis_14_210405.png

C/RTL 協調シミュレーションの全体波形を示す。
bm_dispc_axis_15_210405.png

outs_TVALID と outs_TREADY がずっと1のままなのが分かる。

最初の部分を拡大した。データも思い通りだ。
bm_dispc_axis_16_210405.png

画像の 1 行はちょうど 8 us = 8000 ns で、1 クロックは 10 ns なので、ちょうど 800 ピクセルになる。
bm_dispc_axis_17_210405.png

solution1/syn/veilog ディレクトリの axi4_stream_master.v と axi4_stream_master_regslice_both.v を Vivado のシミュレーション・ファイルとして使用する。
bm_dispc_axis_18_210405.png
  1. 2021年04月05日 05:24 |
  2. IP
  3. | トラックバック:0
  4. | コメント:0

Vivado 2020.2 を使ってビットマップ・ディスプレイ・コントローラをAXI4-Stream対応にする1

Vitis Vision Library を以前やってみたのだが、 Array2xfMat と xfMat2Array を使用する Mat 形式のデータを DMA で持ってきて Vitis Vision Library で処理する形式が一般的のようだ。 AXI4-Stream ー フィルタ ー AXI4-Stream とするパスはうまく実装できなかった。そこで、 Mat 形式のデータを DMA で持ってきて使うために AXI4-Stream 入出力の IP を使いたいと思う。パラレル入力のカメラ・インターフェース IP は AXI4-Stream 出力になっているので、ビットマップ・ディスプレイ・コントローラを AXI4-Stream 入力にしたい。今回は、 Vivado 2020.2 を使用してビットマップ・ディスプレイ・コントローラをAXI4-Stream対応にしようと思う。手始めに非同期FIFO の bitmap_afifo を生成する。

実は、 2016 年の 8 月にビットマップ・ディスプレイ・コントローラをAXI4-Stream対応にしたのだが、もう一度やってみよう。
関連する記事は、以下の通り。
”ビットマップ・ディスプレ イ・コントローラをAXI4-Stream対応にする1(構想編)”
”ビットマップ・ディスプレ イ・コントローラをAXI4-Stream対応にする2(bitmap_afifo)”
”ビットマップ・ディスプレ イ・コントローラをAXI4-Stream対応にする3(シミュレーション)”
”ビットマップ・ディスプレ イ・コントローラをAXI4-Stream対応にする4(ソースコードの公開)”
”ビットマップ・ディスプレ イ・コントローラをAXI4-Stream対応にする5(IP作成)”

今回は、Zynq 用のVivado 2020.2 のプロジェクトを作って、bitmap_afifo (ビットマップのピクセル用の非同期FIFO)を作る。
Vivado 2016.2 と 2020.2 の違いについても確認したい。

Vivado 2020.2 で作成した bm_dispc_axis プロジェクトを示す。まだ空の状態なので、 bitmap_afifo を FIFO Generator で作成する。
IP Catalog をクリックして、IP Catalog ウインドウを表示し、 fifo で検索する。FIFO Generator が表示されるので、それをダブルクリックして、ダイアログを表示させた。
bm_dispc_axis_1_210404.png

Customize IP ダイアログが表示された。
Componet Name を bitmap_afifo とした。
Basic タブで Fifo Implementation を Independent Clocks Block RAM を選択した。
Read Mode は First Word Fall Through とした。
bm_dispc_axis_2_210404.png

Natrive Ports タブでは、以下のとおりに設定した。
Read Mode : Fist Word Fall Through
Data Port Parameters : Write Width 32
Data Port Parameters : Write Depth 512
Data Port Parameters : Read Width 32
Data Port Parameters : Read Depth 512
Enabel Reset Synchronization のチェックを外した
bm_dispc_axis_3_210404.png

Status Flags では、Overflow と Underflow Flag にチェックを入れた。
bm_dispc_axis_4_210404.png

Data Counts では More Accurate Data Counts にチェックを入れた。これを入れないと First Word Fall Through の場合はカウントが狂うというか、First Word Fall Through の回路を含んだカウントにならない。
Write Data Count (Synchronized with Write Clk) にチェックを入れた。
bm_dispc_axis_5_210404.png

Summary タブを示す。
bm_dispc_axis_6_210404.png

OK ボタンをクリックする。
Generate Output Products ダイアログが表示された。
Generate ボタンをクリックする。
bm_dispc_axis_7_210404.png

Generate Output Products ダイアログが表示された。
bm_dispc_axis_8_210404.png

bitmap_afifo が生成された。
bm_dispc_axis_9_210404.png
  1. 2021年04月04日 05:26 |
  2. IP
  3. | トラックバック:0
  4. | コメント:0

非同期外部入力に xpm_cdc を使用する

これまで、uart_rx や uart_tx を作ってきたが、uart_rx の入力は自分の FPGA の内部クロックに同期していない信号となる。そこで、自分の内部クロックに同期させる必要があるわけだ。以前は、Synchronizer IP を自分で作っていたのだが、 ”Vivado 2020.2 の新機能1”で紹介したように、新たに xpm_cdc IP が追加されたので、使ってみよう。

なぜ、自分の内部クロックに同期させる必要があるかわからない方は”Fpgaでの非同期信号の扱い方とvivadoによるサポート(公開用)”を参照のこと。

uart_rx, uart_rx_axi4ls, uart_tx を接続したブロックデザインを示す。
uart_rx の rxst_V_dout[0:0] の前段に xpm_cdc IP が接続されている。
xpm_cdc_1_210228.png

外部入力の rx_422_rx0 を xpm_cdc の src_in に入力して、dest_out から uart_rx の rxst_V_dout[0:0] に入力されている。
src_clk と dest_clk は uart_rx の ap_clk に接続されている。UART では、src_clk が無いので、何処に接続したものか?と悩んだが、後で述べるように、これで良さそうだ。

xpm_cdc_gen_0 の設定を見てみよう。
CDC Type は Single-bit Synchronizer に設定した。
INPUT REGISTER FOR SOURCE CLOCK DOMAIN は src_clk が無いので、チェックを外した。
xpm_cdc_2_210228.png

CDC-Type の設定値を見てみよう。
xpm_cdc_3_210228.png

論理合成後の xpm_cdc の Schematic を見てみよう。
dest_clk をクロックにいれた 4 段の FF があるのが分かる。これで良さそうだ。
xpm_cdc_4_210301.png
  1. 2021年03月03日 03:27 |
  2. IP
  3. | トラックバック:0
  4. | コメント:0
»