FC2カウンター FPGAの部屋 秋月電子カメラモジュールOV5642を使う4(AXI-Stream Data FIFO のシミュレーション)
FC2ブログ

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

FPGAの部屋

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

秋月電子カメラモジュールOV5642を使う4(AXI-Stream Data FIFO のシミュレーション)

秋月電子カメラモジュールOV5642を使う3(OV5642インターフェースIPの検討)”の続き。

前回は、OV5642の信号を取り込むOV5642インターフェースIP を検討した。その結果、AXI-Stream Data FIFO とOV5642 の画像データを受け取るVivado HLS のIP の組み合わせで行くことにした。今回は、AXI-Stream Data FIFO が使い物になるかどうか?HDL シミュレーションをしてみよう。

Vivado 2018.2 でUltra96 のボード・ファイルを使用して test1 プロジェクトを作成した。
その中でブロック・デザインを作成し、AXI-Stream Data FIFO をAdd IP した。
OV5642_12_181205.png

ブロック・デザインのVerilog HDL ラッパー・ファイルを作成した。
Verilog HDL ラッパー・ファイルのdesign_1_wrapper.v を示す。

//Copyright 1986-2018 Xilinx, Inc. All Rights Reserved.
//--------------------------------------------------------------------------------
//Tool Version: Vivado v.2018.2 (lin64) Build 2258646 Thu Jun 14 20:02:38 MDT 2018
//Date        : Tue Dec  4 21:21:23 2018
//Host        : masaaki-H110M4-M01 running 64-bit Ubuntu 18.04.1 LTS
//Command     : generate_target design_1_wrapper.bd
//Design      : design_1_wrapper
//Purpose     : IP block netlist
//--------------------------------------------------------------------------------
`timescale 1 ps / 1 ps

module design_1_wrapper
   (M_AXIS_0_tdata,
    M_AXIS_0_tready,
    M_AXIS_0_tuser,
    M_AXIS_0_tvalid,
    S_AXIS_0_tdata,
    S_AXIS_0_tready,
    S_AXIS_0_tuser,
    S_AXIS_0_tvalid,
    axis_data_count_0,
    axis_rd_data_count_0,
    axis_wr_data_count_0,
    m_axis_aclk_0,
    m_axis_aresetn_0,
    s_axis_aclk_0,
    s_axis_aresetn_0);
  output [7:0]M_AXIS_0_tdata;
  input M_AXIS_0_tready;
  output [0:0]M_AXIS_0_tuser;
  output M_AXIS_0_tvalid;
  input [7:0]S_AXIS_0_tdata;
  output S_AXIS_0_tready;
  input [0:0]S_AXIS_0_tuser;
  input S_AXIS_0_tvalid;
  output [31:0]axis_data_count_0;
  output [31:0]axis_rd_data_count_0;
  output [31:0]axis_wr_data_count_0;
  input m_axis_aclk_0;
  input m_axis_aresetn_0;
  input s_axis_aclk_0;
  input s_axis_aresetn_0;

  wire [7:0]M_AXIS_0_tdata;
  wire M_AXIS_0_tready;
  wire [0:0]M_AXIS_0_tuser;
  wire M_AXIS_0_tvalid;
  wire [7:0]S_AXIS_0_tdata;
  wire S_AXIS_0_tready;
  wire [0:0]S_AXIS_0_tuser;
  wire S_AXIS_0_tvalid;
  wire [31:0]axis_data_count_0;
  wire [31:0]axis_rd_data_count_0;
  wire [31:0]axis_wr_data_count_0;
  wire m_axis_aclk_0;
  wire m_axis_aresetn_0;
  wire s_axis_aclk_0;
  wire s_axis_aresetn_0;

  design_1 design_1_i
       (.M_AXIS_0_tdata(M_AXIS_0_tdata),
        .M_AXIS_0_tready(M_AXIS_0_tready),
        .M_AXIS_0_tuser(M_AXIS_0_tuser),
        .M_AXIS_0_tvalid(M_AXIS_0_tvalid),
        .S_AXIS_0_tdata(S_AXIS_0_tdata),
        .S_AXIS_0_tready(S_AXIS_0_tready),
        .S_AXIS_0_tuser(S_AXIS_0_tuser),
        .S_AXIS_0_tvalid(S_AXIS_0_tvalid),
        .axis_data_count_0(axis_data_count_0),
        .axis_rd_data_count_0(axis_rd_data_count_0),
        .axis_wr_data_count_0(axis_wr_data_count_0),
        .m_axis_aclk_0(m_axis_aclk_0),
        .m_axis_aresetn_0(m_axis_aresetn_0),
        .s_axis_aclk_0(s_axis_aclk_0),
        .s_axis_aresetn_0(s_axis_aresetn_0));
endmodule


次に、design_1_wrapper.v をシミュレーションするファイル axis_data_fifo_tb.v を作成した。

// axis_data_fifo_tb.v
// 2018/12/04 by marsee
//

`timescale 1ns / 1ps

module axis_data_fifo_tb;
    wire [7:0]M_AXIS_0_tdata;
    reg M_AXIS_0_tready;
    wire [0:0]M_AXIS_0_tuser;
    wire M_AXIS_0_tvalid;
    reg [7:0]S_AXIS_0_tdata;
    wire S_AXIS_0_tready;
    reg [0:0]S_AXIS_0_tuser;
    reg S_AXIS_0_tvalid;
    wire [31:0]axis_data_count_0;
    wire [31:0]axis_rd_data_count_0;
    wire [31:0]axis_wr_data_count_0;
    reg m_axis_aclk_0;
    reg m_axis_aresetn_0;
    reg s_axis_aclk_0;
    reg s_axis_aresetn_0;

    always #10 s_axis_aclk_0 = ~s_axis_aclk_0;
    always #5 m_axis_aclk_0 = ~m_axis_aclk_0;
    
    initial begin
        s_axis_aclk_0 = 1'b0;
        m_axis_aclk_0 = 1'b0;
        s_axis_aresetn_0 = 1'b0;
        m_axis_aresetn_0 = 1'b0;
        S_AXIS_0_tvalid = 1'b0;
        M_AXIS_0_tready = 1'b0;
        S_AXIS_0_tuser = 1'b1;
        
        // Wait 100 ns for global reset to finish
        #101;
        
        s_axis_aresetn_0 = 1'b1;
        m_axis_aresetn_0 = 1'b1;
        
        #100;
        S_AXIS_0_tvalid = 1'b1;
        
        #400;
        M_AXIS_0_tready = 1'b1;
        
        #400
        S_AXIS_0_tuser = 1'b0;
    
    end
    
    always @(posedge m_axis_aclk_0) begin
        if(s_axis_aresetn_0 == 1'b0) begin
            S_AXIS_0_tdata <= 8'd0;
        end else begin
            S_AXIS_0_tdata <= S_AXIS_0_tdata + 8'd1;
        end
    end
    
    design_1_wrapper design_1_wrapper_i (
        .M_AXIS_0_tdata(M_AXIS_0_tdata),
        .M_AXIS_0_tready(M_AXIS_0_tready),
        .M_AXIS_0_tuser(M_AXIS_0_tuser),
        .M_AXIS_0_tvalid(M_AXIS_0_tvalid),
        .S_AXIS_0_tdata(S_AXIS_0_tdata),
        .S_AXIS_0_tready(S_AXIS_0_tready),
        .S_AXIS_0_tuser(S_AXIS_0_tuser),
        .S_AXIS_0_tvalid(S_AXIS_0_tvalid),
        .axis_data_count_0(axis_data_count_0),
        .axis_rd_data_count_0(axis_rd_data_count_0),
        .axis_wr_data_count_0(axis_wr_data_count_0),
        .m_axis_aclk_0(m_axis_aclk_0),
        .m_axis_aresetn_0(m_axis_aresetn_0),
        .s_axis_aclk_0(s_axis_aclk_0),
        .s_axis_aresetn_0(s_axis_aresetn_0)
    );

endmodule


これで、論理シミュレーションを行った。結果を示す。
OV5642_10_181205.png

OV5642_11_181205.png

タイミングチャートで、S_AXIS_0_tvalid が 1 になったときに、S_AXIS_0_tready が 1 になるのがだいぶ遅れるようだ。これでは今回の用途では使い物にならない。。。

次に、OV5642 の画像データを受け取るVivado HLS のIP も試しに作ってみた。まだデータはおかしいがC/RTL 強調シミュレーションをしてみた。
OV5642_13_181205.png

C/RTL 強調シミュレーションの波形を示す。
OV5642_14_181205.png

cam_sig_TREADY が 1 になった後で、0 に戻っている部分があるので、やはり、Vivado HLS 単体でも使用できない。

以上の結果より、”秋月電子カメラモジュールOV5642を使う3(OV5642インターフェースIPの検討)”のスキームは使えないことがわかった。
次回以降は、mt9d111_inf_axis IP を修正して、OV5642 対応としたいとおもう。つまり、HDL を書いてOV5642 の画像データをAXI4-Stream に変換する。
  1. 2018年12月05日 04:25 |
  2. CMOSイメージセンサ
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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