« XILINXのPlatform USBを自分のプログラムからコントロールする | トップページ | また新しいスタッフが入りました »

2014.05.07

Artix-7で作るUSB3.0 CMOSカメラでAXI-Interconnectを使ってみた

Artix-7版USB3.0 CMOSイメージセンサ取り込み装置で、CoreGenの生成するAXI Interconnectを使ってみました。

数か月前にもCoreGenのAXI-Interconnectに挑戦してみたのですが、その時はAXI Interconnectが動かずそのままになっていました。

今回、久しぶりにチャレンジしてみたのですが、最初はs_axi_arreadyがずっとLのまま動かなかった(つまり下位デバイスのReadの準備ができた状態にならない)のですが、CoreGenの設定でINTERCONNECT_ACLKを10000psにして、

Axiic_1

次の画面でIs Aclk Asyncをチェックしたら動くようになりました。

Axiic_2

どちらが効いているのかは不明です。

さて、CoreGenで生成したAXI-Interconnectに、USB FX3コントローラと、カメラモジュールと、DDR3メモリコントローラをつなぎます。

	
inst_axi_ic : axi_ic PORT MAP (
    INTERCONNECT_ACLK => axiclk,
    INTERCONNECT_ARESETN => axiresetn,
    S00_AXI_ARESET_OUT_N => open,
    S00_AXI_ACLK => axiclk,
    S00_AXI_AWID => usb_axi_awid(0 downto 0),
    S00_AXI_AWADDR => usb_axi_awaddr,
    S00_AXI_AWLEN => usb_axi_awlen,
    S00_AXI_AWSIZE => usb_axi_awsize,
    S00_AXI_AWBURST => usb_axi_awburst,
    S00_AXI_AWLOCK => usb_axi_awlock(0),
    S00_AXI_AWCACHE => usb_axi_awcache,
    S00_AXI_AWPROT => usb_axi_awprot,
    S00_AXI_AWQOS => usb_axi_awqos,
    S00_AXI_AWVALID => usb_axi_awvalid,
    S00_AXI_AWREADY => usb_axi_awready,
    S00_AXI_WDATA => usb_axi_wdata,
    S00_AXI_WSTRB => usb_axi_wstrb,
    S00_AXI_WLAST => usb_axi_wlast,
    S00_AXI_WVALID => usb_axi_wvalid,
    S00_AXI_WREADY => usb_axi_wready,
    S00_AXI_BID => usb_axi_bid(0 downto 0),
    S00_AXI_BRESP => usb_axi_bresp,
    S00_AXI_BVALID => usb_axi_bvalid,
    S00_AXI_BREADY => usb_axi_bready,
    S00_AXI_ARID => usb_axi_arid(0 downto 0),
    S00_AXI_ARADDR => usb_axi_araddr,
    S00_AXI_ARLEN => usb_axi_arlen,
    S00_AXI_ARSIZE => usb_axi_arsize,
    S00_AXI_ARBURST => usb_axi_arburst,
    S00_AXI_ARLOCK => usb_axi_arlock(0),
    S00_AXI_ARCACHE => usb_axi_arcache,
    S00_AXI_ARPROT => usb_axi_arprot,
    S00_AXI_ARQOS => usb_axi_arqos,
    S00_AXI_ARVALID => usb_axi_arvalid,
    S00_AXI_ARREADY => usb_axi_arready,
    S00_AXI_RID => usb_axi_rid(0 downto 0),
    S00_AXI_RDATA => usb_axi_rdata,
    S00_AXI_RRESP => usb_axi_rresp,
    S00_AXI_RLAST => usb_axi_rlast,
    S00_AXI_RVALID => usb_axi_rvalid,
    S00_AXI_RREADY => usb_axi_rready,
    S01_AXI_ARESET_OUT_N => open,
    S01_AXI_ACLK => axiclk,
    S01_AXI_AWID => cam_axi_awid(0 downto 0),
    S01_AXI_AWADDR => cam_axi_awaddr,
    S01_AXI_AWLEN => cam_axi_awlen,
    S01_AXI_AWSIZE => cam_axi_awsize,
    S01_AXI_AWBURST => cam_axi_awburst,
    S01_AXI_AWLOCK => cam_axi_awlock(0),
    S01_AXI_AWCACHE => cam_axi_awcache,
    S01_AXI_AWPROT => cam_axi_awprot,
    S01_AXI_AWQOS => cam_axi_awqos,
    S01_AXI_AWVALID => cam_axi_awvalid,
    S01_AXI_AWREADY => cam_axi_awready,
    S01_AXI_WDATA => cam_axi_wdata,
    S01_AXI_WSTRB => cam_axi_wstrb,
    S01_AXI_WLAST => cam_axi_wlast,
    S01_AXI_WVALID => cam_axi_wvalid,
    S01_AXI_WREADY => cam_axi_wready,
    S01_AXI_BID => cam_axi_bid(0 downto 0),
    S01_AXI_BRESP => cam_axi_bresp,
    S01_AXI_BVALID => cam_axi_bvalid,
    S01_AXI_BREADY => cam_axi_bready,
    S01_AXI_ARID => cam_axi_arid(0 downto 0),
    S01_AXI_ARADDR =>cam_axi_araddr,
    S01_AXI_ARLEN => cam_axi_arlen,
    S01_AXI_ARSIZE => cam_axi_arsize,
    S01_AXI_ARBURST => cam_axi_arburst,
    S01_AXI_ARLOCK => cam_axi_arlock(0),
    S01_AXI_ARCACHE => cam_axi_arcache,
    S01_AXI_ARPROT => cam_axi_arprot,
    S01_AXI_ARQOS => cam_axi_arqos,
    S01_AXI_ARVALID => cam_axi_arvalid,
    S01_AXI_ARREADY => cam_axi_arready,
    S01_AXI_RID => cam_axi_rid(0 downto 0),
    S01_AXI_RDATA => cam_axi_rdata,
    S01_AXI_RRESP => cam_axi_rresp,
    S01_AXI_RLAST => cam_axi_rlast,
    S01_AXI_RVALID => cam_axi_rvalid,
    S01_AXI_RREADY => cam_axi_rready,
    M00_AXI_ARESET_OUT_N => open,
    M00_AXI_ACLK => axiclk,
    M00_AXI_AWID => ddr_axi_awid,
    M00_AXI_AWADDR => ddr_axi_awaddr,
    M00_AXI_AWLEN => ddr_axi_awlen,
    M00_AXI_AWSIZE => ddr_axi_awsize,
    M00_AXI_AWBURST => ddr_axi_awburst,
    M00_AXI_AWLOCK => ddr_axi_awlock(0),
    M00_AXI_AWCACHE => ddr_axi_awcache,
    M00_AXI_AWPROT => ddr_axi_awprot,
    M00_AXI_AWQOS => ddr_axi_awqos,
    M00_AXI_AWVALID => ddr_axi_awvalid,
    M00_AXI_AWREADY => ddr_axi_awready,
    M00_AXI_WDATA => ddr_axi_wdata,
    M00_AXI_WSTRB => ddr_axi_wstrb,
    M00_AXI_WLAST => ddr_axi_wlast,
    M00_AXI_WVALID => ddr_axi_wvalid,
    M00_AXI_WREADY => ddr_axi_wready,
    M00_AXI_BID => ddr_axi_bid,
    M00_AXI_BRESP => ddr_axi_bresp,
    M00_AXI_BVALID => ddr_axi_bvalid,
    M00_AXI_BREADY => ddr_axi_bready,
    M00_AXI_ARID => ddr_axi_arid,
    M00_AXI_ARADDR => ddr_axi_araddr,
    M00_AXI_ARLEN => ddr_axi_arlen,
    M00_AXI_ARSIZE => ddr_axi_arsize,
    M00_AXI_ARBURST => ddr_axi_arburst,
    M00_AXI_ARLOCK => ddr_axi_arlock(0),
    M00_AXI_ARCACHE => ddr_axi_arcache,
    M00_AXI_ARPROT => ddr_axi_arprot,
    M00_AXI_ARQOS => ddr_axi_arqos,
    M00_AXI_ARVALID => ddr_axi_arvalid,
    M00_AXI_ARREADY => ddr_axi_arready,
    M00_AXI_RID => ddr_axi_rid,
    M00_AXI_RDATA => ddr_axi_rdata,
    M00_AXI_RRESP => ddr_axi_rresp,
    M00_AXI_RLAST => ddr_axi_rlast,
    M00_AXI_RVALID => ddr_axi_rvalid,
    M00_AXI_RREADY => ddr_axi_rready
  );

・・長い! ぐちゃーっと同じようなものを延々と書きます。

その後もで紆余曲折あったけど動きました。

ノートPCにArtix-7 CMOSイメージセンサをつないでお出かけしましょう。

Axicmoscam

神田川の風景を撮影してみました。本当は2048×1536で撮影したのですが、このブログは横1600までしか対応していないようなので、1600×1200にリサイズしています。

Axicmoscamkandagawa

デジカメ並みに綺麗です。 こんなカメラが自作できてしまう。やはりUSB3.0とArtix-7は面白い。

8bitで屋外を撮影しようとすると、明るいところと暗いところが出てしまって、色深度が足りないですね。

|

« XILINXのPlatform USBを自分のプログラムからコントロールする | トップページ | また新しいスタッフが入りました »

コメント

コメントを書く



(ウェブ上には掲載しません)




« XILINXのPlatform USBを自分のプログラムからコントロールする | トップページ | また新しいスタッフが入りました »