FPGAの部屋

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

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。ご利用ください。 http://marsee101.web.fc2.com/index.html

2016年04月

AXI VDMAのMM2Sを使用してビデオ出力3(シミュレーション1)”の続き。

前回はシミュレーション時にエラーが出てしまった。今回はシミュレーション時のエラーを解消した。具体的には、rgb2dvi IP を削除した。

前回、シミュレーション時のエラーは rgb2dvi IP のみで発生しているので、それを削除しようということになったが、今回、結局 rgb2dvi IP を削除した。
そして、バグを発見した reset はアクティブ・ローだったので resetn に変更した。テストベンチもリセットがアクティブ・ハイの仕様になっていたので、2日間、回路が動作しなかった。orz...
発覚後、直ぐに修正。

また、reg_set_axi_lite_master IP のバージョンも古かった。”Vivado 2014.4でのVerilog HDLで記述したROM の初期化データの扱い”を参考にして新しい reg_set_axi_lite_master IP に入れ替えた。
新しいプロジェクトとV_ZYBO_CAMDS ブロックデザインを示す。
5dd119c0.png


2f959dc2.png


c6d8beaf.png


63f2e2a1.png


シミュレーションを行った。
56ffabdb.png


reg_set_axi_lite_master がレジスタを設定しているのが見える。
ba1a3f1f.png


でも、まだ動いたばかりでAXI VDMA のアドレスと設定値がいい加減なので、設定値を決める必要がある。

AXI VDMAのMM2Sを使用してビデオ出力2(Vivadoのブロックデザイン)”の続き。

前回、AXI VMDA の S2MM と MM2S を両方使用したブロックデザインを作製した。今回は、そのブロックデザインをシミュレーションしようと思う。だが、Zynq のPS はプロセッサのモデルが無くてそのままではシミュレーションが出来ない。そこで、reg_set_axi_lite_master IP を使用する。このIP は言ってみれば、設定ファイル(vdma_reg_set.txt)の設定内容(2行構成で、最初の行がアドレス、次の行が書き込むデータの2行構成の組がある)をAXI4 Lite Master でIP のレジスに書き込むIP である。もう1つメモリのモデルの mem_sim_axi_slave を使用する。これは、汎用のメモリ・モデルだ。(詳しくは、”ソフトウェアのCソースコードをVivado HLS 2014.4 で高位合成したIPをシミュレーション”を参照のこと)

シミュレーションを行うために、前回のVivado プロジェクト・フォルダをコピーして、CAMDS_FASTXt2_VDMAt_161 というフォルダ名を作製した。
c2312826.png


PS の代わりに reg_set_axi_lite_master IP と mem_sim_axi_slave IP を追加した。ブロックデザインを示す。
93816cde.png


MT9D111 カメラ・モジュールのモデル mt9d111_model.v と シミュレーション用トップファイル V_ZYBO_CAMDS_tb.v を追加して、シミュレーションを行った。しかし、エラーが出てしまった。エラー内容を示す。

[USF-XSim 62] 'compile' step failed with error(s). Please check the Tcl console output or 'Z:/Sim/CAMDS_FASTXt2_VDMAt_161/V_ZYBO_CAMDS_151.sim/sim_1/behav/xvhdl.log' file for more information.


xvhdl.logを見ろと言われているので、見た。xvhdl.log のエラー内容を示す。

ERROR: [VRFC 10-149] 'resetbridge' is not compiled in library xil_defaultlib [Z:/Sim/CAMDS_FASTXt2_VDMAt_161/V_ZYBO_CAMDS_151.ip_user_files/bd/V_ZYBO_CAMDS/ipshared/digilentinc.com/rgb2dvi_v1_2/src/ClockGen.vhd:56]
ERROR: [VRFC 10-149] 'syncasync' is not compiled in library xil_defaultlib [Z:/Sim/CAMDS_FASTXt2_VDMAt_161/V_ZYBO_CAMDS_151.ip_user_files/bd/V_ZYBO_CAMDS/ipshared/digilentinc.com/rgb2dvi_v1_2/src/ClockGen.vhd:64]
ERROR: [VRFC 10-1504] unit behavioral ignored due to previous errors [Z:/Sim/CAMDS_FASTXt2_VDMAt_161/V_ZYBO_CAMDS_151.ip_user_files/bd/V_ZYBO_CAMDS/ipshared/digilentinc.com/rgb2dvi_v1_2/src/ClockGen.vhd:46]


rgb2dvi IP の中のファイルがエラーと言われている様だ。IP の再パッケージを行った。
エラーの行を見ると、いずれも component 文を使用しないで下位モジュールをインスタンスしている箇所がエラーになっているようだ。
531583ec.png


とりあえず、シミュレーションに rgb2dvi IP は必要無いので、これを削除しようと思う。

AXI VDMAのMM2Sを使用してビデオ出力1(構想編)”の続き。

前回、AXI VDMA のMM2S も使いたいという話をしたが、今回は、Vivado 2016.1 でプロジェクトを作成して、ブロックデザインを完成させた。

まずは、ZYBO 用のプロジェクトをコピーし、ペーストした。
c591a755.png


ブロックデザインを修正した。具体的には camera_module から AXI VDMA を分離して、MM2S を生かした。
8457a249.png


camera_module を示す。image_filter はFASTX コーナー検出IP だ。
2872bf2a.png


video_module を示す。rgb2dvi IP, rgb2vga IP は Digilent 社の出しているIPだ。Digilent Vivado library の中の一部だ。
bf4c8007.png


なお、Slice と Concat だが、これは、私の作った AXI4-Stream 対応カメラ・インターフェース ( mt9d111_inf_axis ) のAXI4-Stream の32ビット幅データのバイトレーンの割当は、Dummy, Red, Green, Blue である。ところが、Xilinx 社のビデオIP のデータのバイトレーンの割当は Red, Blue, Green になっているので、それを変換するためである。(AXI4-Stream to Video Out v4.0 LogiCORE IP Product Guide Vivado Design Suite PG044 November 18, 2015 を参照のこと)

ブロックデザインはできたが、論理合成するには早過ぎるので、シミュレーションをしたいのだが、PSがあるとシミュレーションが出来ないので、違うプロジェクトでシミュレーションを行っていこうと思う。

FASTX コーナー検出の改良3(threshold をソフトウェアで変更可能にする)”でリアルタイムでFASTX コーナー検出をすることができた。現在のMT9D111 カメラのフレームレートは 800 x 600 の 15 fps なのだが、AXI VDMA IPでカメラ画像のAXI4-Stream から DMA する時に 3 つ以上のフレームバッファの時にしかDMA されない。ビデオ出力は私の作ったbitmap_disp_cntrler_axi_master で出力しているのだが、それは 1 つのフレームバッファにしか対応していない。よって、AXI VDMA IP で書かれた 3 つのフレームバッファの内の最初の 1 つをbitmap_disp_cntrler_axi_master で表示している。したがって、フレームレートが 1/3 になってしまう。
今回は、今まで S2MM のみ使用したAXI VDMA のMM2S も使って、ビデオ出力をしようと思う。

AXI VDMA のMM2S 出力のAXI4-Stream をビデオ信号にするためには、Xilinx社のIP の AXI4-Stream to Video Out (v_axi4_vid_out)、Video Timing Controller (vtc) が使えると思う。
これは、以前やったとこがある。”ビデオ信号にAXI4 Stream版のラプラシアンフィルタを通して画像出力3(Vivadoプロジェクト)”が参考になるはずだ。
そのブロック図を示す。前述した2つのIP が使用されている。
a0508d52.png


Xilinx社のAXI4-Stream to Video Out の資料ページ
FPGAの部屋の記事、”Video Timing Controller (VTC)
Xilinx 社のVideo Timing Controller (ビデオ タイミング コントローラー)の資料ページ

ビデオ出力は、。”ビデオ信号にAXI4 Stream版のラプラシアンフィルタを通して画像出力3(Vivadoプロジェクト)”で使っている rgb2vga や rgb2dvi を使うことにしよう。これらは、Digilent 社のGitHubの Digilent Vivado library からダウンロードすることができる。

FASTX コーナー検出の改良2(threshold をソフトウェアで変更可能にする)”の続き。

前回は、Vivado HLS 2016.1 でC コードの合成とIP へのパッケージを行った。今回は、その threshold を変更できるFASTX コーナー検出IP をカメラ表示システムに組み込んで、ZYBO にダウンロードしてやってみた。

threshold を変更できるFASTX コーナー検出IP を組み込んだ、Vivado 2016.1 のプロジェクトを示す。もう、ビットストリームの生成まで済んでいる。
7dfc1ec8.png


Summary を示す。タイミング制約も満足している。
4cb88b59.png


ハードウェアをエクスポートして、SDKを立ち上げた。
b2129a9d.png


fastx_on_serial.c を作製した。下にソースコードを示す。

// fastx_on_serial.c
// 2016/04/13 by marsee
//
// Refered to http://japan.xilinx.com/support/documentation/sw_manuals_j/xilinx2014_4/ug902-vivado-high-level-synthesis.pdf
//
// 2016/04/21 : threshold をシリアル経由で入力する
//

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

int main(){
    XImage_filter Ximage_filter;
    XImage_filter_Config *Ximage_filterPtr;
    int threshold;

    // Look Up the device configuration
    Ximage_filterPtr = XImage_filter_LookupConfig(0);
    if (!Ximage_filterPtr){
        fprintf(stderr, "XImage_filter configuration failed.\n");
        return(-1);
    }

    // Initialize the Device
    int Xlap_status = XImage_filter_CfgInitialize(&Ximage_filter, Ximage_filterPtr);
    if (Xlap_status != XST_SUCCESS){
        fprintf(stderr, "Could not Initialize XImage_filter\n");
        return(-1);
    }

    // image_filter rows, cols set
    XImage_filter_Set_cols(&Ximage_filter, (u32)800);
    XImage_filter_Set_rows(&Ximage_filter, (u32)600);

    // first shreshold set
    printf("\n\rfirst threshold = ");
    scanf("%d", &threshold);
    XImage_filter_Set_threshold(&Ximage_filter, (u32)threshold);

    // axis_switch_1, 1to2 ,Select M01_AXIS
    // Refer to http://marsee101.blog19.fc2.com/blog-entry-3177.html
    Xil_Out32((XPAR_CAMERA_INTERFACE_AXIS_SWITCH_1_BASEADDR+0x40), 0x80000000); // disable
    Xil_Out32((XPAR_CAMERA_INTERFACE_AXIS_SWITCH_1_BASEADDR+0x44), 0);
    Xil_Out32((XPAR_CAMERA_INTERFACE_AXIS_SWITCH_1_BASEADDR), 0x2); // Commit registers

    // fastx filter AXIS Start
    XImage_filter_Start(&Ximage_filter);
    XImage_filter_EnableAutoRestart(&Ximage_filter);

    // axis_switch_0, 2to1, Select S01_AXIS
    // Refer to http://marsee101.blog19.fc2.com/blog-entry-3177.html
    Xil_Out32((XPAR_CAMERA_INTERFACE_AXIS_SWITCH_0_BASEADDR+0x40), 0x1);
    Xil_Out32((XPAR_CAMERA_INTERFACE_AXIS_SWITCH_0_BASEADDR), 0x2); // Commit registers

    // threshold set
    while(1){
        printf("\n\rthreshold = ");
        scanf("%d", &threshold);
        if (threshold == 999)
            break;
        
        XImage_filter_Set_threshold(&Ximage_filter, (u32)threshold);
    }

    return(0);
}


Tera Term を起動して、ZYBO とシリアル経由で接続した。シリアルの設定は 115200 bps, 8 bits, 1 stop bit, local echo にした。
73c6e165.png


いろいろと threshold を変更してやってみた。999 を入力するとアプリケーションが終了する。

threshold = 2 の場合の画像を下に示す。
c77b0c4c.jpg


threshold = 5 の場合
393b42d9.jpg


threshold = 10 の場合
5d11d87a.jpg


threshold = 20 の場合
53b4d581.jpg


threshold = 40 の場合
751205e0.jpg


threshold = 60 の場合
22425a28.jpg


threshold = 80 の場合
7f58fe0b.jpg


このように、FASTX コーナー検出を threshold を変更して、リアルタイムに 行うことができた。但し、残念だが今のところのカメラの fps は 5 fps だ。回路を変更して、15 fps にしたいと思う。

FASTX コーナー検出IP は 280 MHz まで動作するというレポートが出ているので、HD 解像度の 148.5 MHz も問題なくできると思う。そのようにすればHD解像度で、60 fps のFASTX コーナー検出ができると思う。

↑このページのトップヘ