FC2カウンター FPGAの部屋 ZedBoard Linux のフレームバッファにカメラ画像を表示7(AXI4バスをChipScopeで観測)
FC2ブログ

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

FPGAの部屋

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

ZedBoard Linux のフレームバッファにカメラ画像を表示7(AXI4バスをChipScopeで観測)

前回、カメラ画像のディスプレイ表示がおかしかったので、AXI4バスにChipScope AXI Monitor を入れてAXI4バスの波形を観察することにした。

XPSプロジェクトで、Bitmap Display Controller (bitmap_disp_cntrler_axi_master_0) とCamera Controller (mt9d111_inf_axi_master_0) に chipscope_axi_monitor を挿入した。chipscope_icon_0 も追加した。
ZedBoard_Linux_56_130208.png

Portsタブの接続を下に示す。
ZedBoard_Linux_57_130208.png

ISEでインプリメント後、ハードウェアをSDKにエクスポートして、ZedBoardをコンフィグして、ソフトウェアを起動した。
Chipscope Pro Analyzer を立ちあげて、AXI4バスの波形を観測した。
まずは、Bitmap Display Controller から下に示す。
ZedBoard_Linux_58_130209.png

波形的には問題ない。

次に、Camera Controller の波形を示す。
ZedBoard_Linux_59_130209.png

バースト長が長すぎる。アドレス転送部分を拡大してみた。
ZedBoard_Linux_60_130209.png

アドレスが0x2FB03AD0 で上限値を超えてしまっている。明らかにおかしい。もう一度トリガを掛けてみた。
ZedBoard_Linux_61_130209.png

アドレスは0xE028B550 だった。ぐるっとアドレスが回ってしまっている。
ZedBoard_Linux_61_130209.png

このアドレスはおかしい。アドレスを生成する部分は、mt9d111_cam_cont.v の124行目辺りにある。それを下に示す。

    // addressの生成
    always @(posedge aclk) begin
        if (areset) begin
            if (UPSIDE_DOWN==0) // 正常、それ以外は上下反転
                paddr_reg <= DISPLAY_START_ADDRESS;
            else // 上下反転
                paddr_reg <= DISPLAY_END_ADDRESS;
        end else begin
            if (pfifo_rd_en) begin
                if (UPSIDE_DOWN==0) // 正常
                    paddr_reg <= paddr_reg + 32'd8;
                else // 上下反転
                    paddr_reg <= paddr_reg - 32'd8;
            end else if (addr_rst_cs==ADDR_RST) begin    // frame_valid が0になって、pfifoにデータが無くなった時にアドレスをクリア
                if (UPSIDE_DOWN==0) // 正常、それ以外は上下反転
                    paddr_reg <= DISPLAY_START_ADDRESS;
                else // 上下反転
                    paddr_reg <= DISPLAY_END_ADDRESS;
            end
        end
    end
    assign paddr = paddr_reg;


上のリストで、pfifo_rd_en が1の時にアドレスをインクリメントしている。pfifo_rd_en は、上のモジュールの mt9d111_inf_axi_master.vhd で M_AXI_WREADY が入っていた。

    mt9d111_cam_cont_i : mt9d111_cam_cont generic map(
        DISPLAY_START_ADDRESS    => C_DISPLAY_START_ADDRESS,
        UPSIDE_DOWN                => C_UPSIDE_DOWN
    )port map(
        aclk                => ACLK,
        areset                => reset,
        pclk                => pclk,
        preset                => preset,
        pclk_from_pll        => pclk_from_pll,
        xclk                => xck,
        line_valid            => href,
        frame_valid            => vsync,
        cam_data            => cam_data,
        standby                => standby,
        paddr                => M_AXI_AWADDR,
        pfifo_rd_en            => M_AXI_WREADY,
        pfifo_dout            => M_AXI_WDATA,
        pfifo_empty            => pfifo_empty,
        pfifo_almost_empty    => pfifo_almost_empty,
        pfifo_rd_data_count    => pfifo_rd_data_count,
        pfifo_overflow        => pfifo_overflow,
        pfifo_underflow        => pfifo_underflow
    );


M_AXI_WREADY はいつも1なので、これではバグってしまう。ZedBoard用CMOSカメラ回路で正常動作していたのが不思議だ。たぶん、M_AXI_WREADY がアサートされるのが、M_AXI_WVALIDが1の時だけだったのだろうか?

mt9d111_inf_axi_master.vhd のmt9d111_cam_cont.v のインスタンス部分の記述を下のように変更した。

    pfifo_rd_en <= M_AXI_WREADY and wvalid;
    mt9d111_cam_cont_i : mt9d111_cam_cont generic map(
        DISPLAY_START_ADDRESS    => C_DISPLAY_START_ADDRESS,
        UPSIDE_DOWN                => C_UPSIDE_DOWN
    )port map(
        aclk                => ACLK,
        areset                => reset,
        pclk                => pclk,
        preset                => preset,
        pclk_from_pll        => pclk_from_pll,
        xclk                => xck,
        line_valid            => href,
        frame_valid            => vsync,
        cam_data            => cam_data,
        standby                => standby,
        paddr                => M_AXI_AWADDR,
        pfifo_rd_en            => pfifo_rd_en,
        pfifo_dout            => M_AXI_WDATA,
        pfifo_empty            => pfifo_empty,
        pfifo_almost_empty    => pfifo_almost_empty,
        pfifo_rd_data_count    => pfifo_rd_data_count,
        pfifo_overflow        => pfifo_overflow,
        pfifo_underflow        => pfifo_underflow
    );

  1. 2013年02月09日 05:51 |
  2. ZedBoard
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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