------------------------------------------------------------------------ RitsIzm AXI4 Lite to AXI4 Data Stream Interface for Low Speed Stream I/F, Register I/F, Signal I/F 立命いずみ研 AXI4 Lite Bus と AXI4 Data Stream の接続ライブラリ 中低速ストリーム型、レジスタ型、シグナル型のインターフェース用 (C)T.Izumi , Oct. 2015. All rigts reserved. ------------------------------------------------------------------------ 【特徴】 ・プロセッサにストリームインターフェースを接続するモジュール ・AXI Lite をプロセッサに接続する ・AXI4 Data Stream 送出ふたつ受入ふたつ装備している (1) Write Port 0 (AXI Lite -> Direct -> AXIS Master 0) (2) Write Port 1 (AXI Lite -> FIFO -> AXIS Master 1) (3) Read Port 0 (AXI Lite <- Direct <- AXIS Slave 0) (4) Read Port 1 (AXI Lite <- FIFO <- AXIS Slave 1) ・次のモードからインターフェースの方を選択できる。 Mode 3 ... FIFO を介したストリーム型 Mode 2 ... 直接接続のストリーム型 Mode 1 ... レジスタ型 Mode 0 ... 接続しない(外す) ・目的用途と推奨するインターフェースモジュール ◇レジスタ型 Xilinx GPIO または rizm_axilite_fifo ◇シグナリング型(同期、待ち合わせ、トリガリング) rizm_axilite_fifo ◇中低速ストリーム型 rizm_axilite_fifo ◇高速ストリーム型 Xilinx DMA ◇メモリ型 Xilinx Memory, Xilinx DMA ・割込みは未実装、搭載を検討中 ・クロックの乗り換えは出入口に非同期FIFOを挟むことで対処されたし 【ハードウェアの説明】 Verilog で記述されている。このままIPとして使うことができる。 ・モジュール名 rizm_axilite_fifo ・設定可能なパラメタ パラメタ名、デフォルト値、意味・機能 M0MD = 3; // M0 mode M0DW = 8; // data width of M0 out M1AW = 3; // address width of M0 FIFO (=log2(SZ)) M1SZ = 8; // depth of M0 FIFO (actual size = SZ+4) M1MD = 3; // M1 mode M1DW = 8; // data width of M1 out M1AW = 3; // address width of M1 FIFO (=log2(SZ)) M1SZ = 8; // depth of M1 FIFO (actual size = SZ+4) S0MD = 3; // S0 mode S0DW = 8; // data width of S0 in S0AW = 3; // address width of S0 FIFO (=log2(SZ)) S0SZ = 8; // depth of S0 FIFO (actual size = SZ+4) S1MD = 3; // S0 mode S1DW = 8; // data width of S1 in S1AW = 3; // address width of S1 FIFO (=log2(SZ)) S1SZ = 8; // depth of S1 FIFO (actual size = SZ+4) ※SZ=pow(2,AW)でなければならない ・入出力信号 方向、ビット幅、信号名、意味・機能 [Clock, Reset] input s_axi_aclk; // AXI Lite クロック input s_axi_aresetn; // AXI Lite リセット [AXI Lite] … 詳細はAXIの仕様書・解説資料を参照のこと input [AXIAW-1:0] s_axi_awaddr; input s_axi_awvalid; output s_axi_awready; input [31:0] s_axi_wdata; input [3:0] s_axi_wstrb; input s_axi_wvalid; output s_axi_wready; output [1:0] s_axi_bresp; output s_axi_bvalid; input s_axi_bready; input [AXIAW-1:0] s_axi_araddr; input s_axi_arvalid; output s_axi_arready; output [31:0] s_axi_rdata; output [1:0] s_axi_rresp; output s_axi_rvalid; input s_axi_rready; [AXI Data Stream, Master 0] … プロセッサから書き込み、外部から読み出し output [M0DW-1:0] m0_axis_tdata; // データ output m0_axis_tvalid; // データ有効 input m0_axis_tready; // データ受入可 output [0:0] m0_axis_ravail; // 読み出し可能なデータ数 [AXI Data Stream, Master 1] … プロセッサから書き込み、外部から読み出し output [M1DW-1:0] m1_axis_tdata; // データ output m1_axis_tvalid; // データ有効 input m1_axis_tready; // データ受入可 output [M1AW:0] m1_axis_ravail; // 読み出し可能なデータ数 [AXI Data Stream, Slave 0] … 外部から書き込み、プロセッサから読み出し input [S0DW-1:0] s0_axis_tdata; // データ input s0_axis_tvalid; // データ有効 output s0_axis_tready; // データ受入可 output [0:0] s0_axis_wavail; // 書き込み可能なデータ数 [AXI Data Stream, Slave 1] … 外部から書き込み、プロセッサから読み出し input [S1DW-1:0] s1_axis_tdata; // データ input s1_axis_tvalid; // データ有効 output s1_axis_tready; // データ受入可 output [S1AW:0] s1_axis_wavail; // 書き込み可能なデータ数 【ソフトウェアの説明】 ・Memory Mapped I/O を直接アクセスして使用する ・Xilinx SDK では xparameters.h でベースアドレスがマクロで定義される 例 XPAR_RIZM_AXILITE_FIFO_0_BASEADDR ・アドレス空間 BASEADDR+0x00 ... M0 data データ書き込み BASEADDR+0x04 ... M0 busy 書き込み可否、1でビジー(full) BASEADDR+0x08 ... M0 avail 書き込み可能なデータ数 BASEADDR+0x10 ... M1 data データ書き込み BASEADDR+0x14 ... M1 busy 書き込み可否、1でビジー(full) BASEADDR+0x18 ... M1 avail 書き込み可能なデータ数 BASEADDR+0x20 ... S0 data データ読み出し BASEADDR+0x24 ... S0 busy 読み出し可否、1でビジー(empty) BASEADDR+0x28 ... S0 avail 読み出し可能なデータ数 BASEADDR+0x30 ... S1 data データ読み出し BASEADDR+0x34 ... S1 busy 読み出し可否、1でビジー(empty) BASEADDR+0x38 ... S1 avail 読み出し可能なデータ数 ※ready=~busy, ready=(avail>0)?1:0; ・使用例1 while ((*w0busy_p)==1) { delay(); } (*wdata_p)=data; ・使用例2 n=(*r1avail_p); for (i=0;i