FC2カウンター FPGAの部屋 カメラ・インターフェース用AXI4-Stream IPの作製1(仕様の検討)
fc2ブログ

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

FPGAの部屋

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

カメラ・インターフェース用AXI4-Stream IPの作製1(仕様の検討)

カメラ、ビデオ表示カスタムIPを AX4-Stream に変更2(カメラ・インターフェースIP)”で仕様を検討したカメラ・インターフェース用のAXI4-Stream IPを作製しようと思う。(カテゴリをAXI4-Stream IPの作製に変更しました)
(AXI4-Streamでは、仕様上、TVALIDはTREADYを待ってはダメだという指摘を受けたので、カメラ・インターフェース用AXI4-Stream IPの仕様を変更します。教えて頂いた ikvzm さんありがとうございました。)

下にカメラ・インターフェース用のAXI4-Stream IPの仕様を示す。

1.カメラ・インターフェース用AXI4-Stream IPは、FIFOを持たない。FIFOはAXI VDMA の C_S2MM_LINEBUFFER_DEPTH (”LogiCORE IP AXI Video Direct Memory Access v5.04a Product Guide PG020 December 18, 2012”の86ページの”C_S2MM_LINEBUFFER_DEPTH”参照)でFIFO深度を決定できるFIFOを使用する。つまり、AXI VDMAの s2mm_buffer_full がアサートされたらデータ転送が間に合わずにエラーということだ。これは、カメラからくるデータの転送速度は決まっているので、これ以下のストリーム転送しか出来ない場合は当然エラーとなる。

1.改 カメラ・インターフェース用AXI4-Stream IPは同期FIFOを持ち、少なくとも同期FIFOがEMPTYでなくなった状態まで、カメラ・データが溜まった後で、TVALIDをアサートする。

2.1.の前提があるので、AXI4-Stream のTREADY の途中でのディアサートは想定しない。最初にカメラのフレームを転送する最初には、TREADY を確認しアサートされていたら、AXI4-Stream でカメラのフレームの画像データを転送する。TREADY がアサートされていない場合は、そのフレームはAXI4-Stream で転送しない。

2.改 同期FIFOを入れることになったので、AXI4-Stream のTREADY の途中でのディアサートにも問題なく対応できる。ただし、待てる範囲はFIFOの容量による。

3.AXI VDMAの s_axis_s2mm_aclk は入力で、カメラ・インターフェース用のAXI4-Stream IPからクロックを入力することができる。カメラからのPCLKを入力することで、カメラ・インターフェース用のAXI4-Stream IPのクロックドメインはPCLKの1つとすることができる。

4.カメラからのデータはRGB565 なので、2クロックで1つのピクセルデータが転送される。よって、AXI4-Stream のTVALID のアサートは s_axis_s2mm_aclk の2クロックについて1回となる。


・最初に、”AR# 37425 12.3 EDK、12.3 ISE - カスタム AXI IP コアの作成方法”から ar37425.zip をダウンロードする。

・ar37425.zip を解凍して、ar37425/axi_stream フォルダをテンプレートとして、カメラ・インターフェース用のAXI4-Stream IP (mt9d111_inf_axi_stream.vhd) を作る。
mt9d111_inf_axi_stream.vhd の entity を下に示す。(2013/06/01:修正)

entity mt9d111_inf_axi_stream is
  generic(
        -- Master AXI Stream Data Width
        C_M_AXIS_DATA_WIDTH : integer range 8 to 1024 := 24
    );
  port (
        s2mm_aclk    : out std_logic;
        s2mm_prmry_reset : in std_logic;
        s2mm_fsync        : out std_logic;

        -- Master Stream Ports
    --    m_axis_aresetn : out std_logic;
        m_axis_tdata   : out std_logic_vector(C_M_AXIS_DATA_WIDTH-1 downto 0);
        m_axis_tstrb   : out std_logic_vector((C_M_AXIS_DATA_WIDTH/8)-1 downto 0);
        m_axis_tvalid  : out std_logic;
        m_axis_tready  : in  std_logic;
        m_axis_tlast   : out std_logic;
        
        init_done        : in std_logic; -- PS部の初期化終了
        
        -- MT9D111 Camera Interface
        pclk_from_pll    : in    std_logic;    -- PLLからMT9D111のxck に出力するクロック
        pclk            : in     std_logic;    -- MT9D111からのピクセルクロック入力
        xck                : out    std_logic;    -- MT9D111へのピクセルクロック出力
        href            : in     std_logic;
        vsync            : in    std_logic;
        cam_data        : in    std_logic_vector(7 downto 0);
        standby            : out    std_logic;    -- STANDBY出力(ディスエーブル、0固定)
        pfifo_overflow    : out    std_logic;    -- pfifo overflow
        pfifo_underflow    : out    std_logic    -- pfifo underflow
    );

end mt9d111_inf_axi_stream;


これで、カメラ・インターフェース用のAXI4-Stream IPを作っていこうと思う。クロックドメインを変換する非同期FIFOは実装しないので、比較的簡単に実装できそうだ。
  1. 2013年05月29日 05:02 |
  2. AXI4-Stream IPの作製
  3. | トラックバック:0
  4. | コメント:4

コメント

AXI4-Stream Hand Shake

あれ? AXI4-Stream では、マスターは TVALID をアサートする前に TREADY のアサートを待ってはならないという仕様だった気がします。

IHI0051A_amba4_axi4_stream_v1_0_protocol_spec.pdf
「2.2.1 Hand Shake Process」に次のような記述があります。

A master is not permitted to wait until TREADY is asserted before asserting TVALID.
Once TVALID is asserted it must remain asserted until the handshake occurs.
A slave is permitted to wait for TVALID to be asserted before asserting the corresponding
TREADY.

間違ってたらごめんなさい。

  1. 2013/05/30(木) 02:00:27 |
  2. URL |
  3. ikwzm #-
  4. [ 編集 ]

ありがとうございました

今回、AXI4-Streamの仕様書はあまり読まない状態で作り始めているので、ご指摘いただいて、ありがとうございました。
カメラ・インターフェース用AXI4-Stream IPの仕様を変更しました。また何か間違っていましたら、ご指摘ください。よろしくお願いします。
  1. 2013/05/30(木) 03:47:10 |
  2. URL |
  3. marsee #f1oWVgn2
  4. [ 編集 ]

AXI VDMA の s2mm_buffer_almost_full が使えるかも

TREADY のアサートを待って転送を開始するのは AXI4-Stream の仕様上問題がありますが、AXI VDMA には s2mm_buffer_almost_full という信号が出力されているので、これをつかって転送の開始/中断を制御するといいかもしれません。
  1. 2013/05/30(木) 19:07:41 |
  2. URL |
  3. ikwzm #-
  4. [ 編集 ]

前の仕様はFIFOを持たない仕様では、カメラ・インターフェース用AXI4-Streamでの転送の中断はカメラ・データの喪失を意味します。つまり、s2mm_buffer_almost_full で制御しようとしても制御できないということになると思います。
FIFOを持っている場合も、s2mm_buffer_almost_fullのアサートで中断はできますが、FIFOがフルになってしまえば、やはりカメラ・データがなくなってしまいます。
つまり、AXI VDMAでは、Memory Map側がストリーム側よりも転送が速いことが前提になっているのだと思います。そういう想定で作っています。
カメラのフレームが途中でおかしくなると画面が乱れると思います。
  1. 2013/05/31(金) 05:32:27 |
  2. URL |
  3. marsee #f1oWVgn2
  4. [ 編集 ]

コメントの投稿


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

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