# DMA
## jelly_buffer_manager
DMAなどに自動で割り当てるバッファを管理するコア
## jelly_buffer_allocator
jelly_buffer_manager からソフトウェアがバッファ割り当てを受ける場合のインターフェースモジュール
## jelly_dma_stream_write
### 概要
N次元構造の Stream から AXI4 メモリバスへとして書き込みを行う。
書き込み先のバッファ制御と、データの書き込み側とを独立性高く扱いつつ、メモリアクセス効率を保つことを目的に設計を行っている。
内部にFIFOバッファを有しており、バッファに準備できたサイズ分のみ一気に書き込みを行う為、利用側はバス効率を気にせずにゆっくりデータを書き込むことも可能である。
CPUからのレジスタ状態変化や割り込みは、内部FIFOの残量に無関係にAXI4バスへのメモリアクセスが完了した段階で発生するため、データ書き込み側とは独立して、書き込みバッファの確保と解放を効率的に実施可能である。
N次元構造を各次元の first と last で表す。特に last を利用して 不足データをパディングしたり、余分データをカットしたりできる。また DMA 非動作時に Streama の ready をアサートして、データをスキップする機能がある。
### レジスタ仕様
アドレスはWISHBONEのワードアドレス。
レジスタ幅や初期値は parameter 指定で変更可能。
| register name |addr|R/W|size|description |
|:------------- |:--:|:-:|:--:|:-----------------------------|
|CORE_ID |0x00|RO | 32 | core ID |
|CORE_VERSION |0x01|RO | 32 | core verion |
|CORE_CONFIG |0x03|RO | 32 | サポート次元数(Nの値) |
|CTL_CONTROL |0x04|RW | 4 | bit[0]:有効化
bit[1]:パラメータ更新予約(自動クリア)
bit[2]:ワンショット転送
bit[3] 自動アドレス取得有効 |
|CTL_STATUS |0x05|RO | 1 | 動作中に1となる |
|CTL_INDEX |0x07|RO |INDEX_WIDTH| 新規パラメータ反映毎にインクリメント
|IRQ_ENABLE |0x08|RW | 1 | 1でIQR有効 |
|IRQ_STATUS |0x09|RO | 1 | 現在のIQR保留状態 |
|IRQ_CLR |0x0a|WO | 1 | 1を書き込むと保留IRQクリア |
|IRQ_SET |0x0b|WO | 1 | 1を書き込むと保留IRQセット |
|PARAM_AWADDR |0x10|RW |AXI4_ADDR_WIDTH| 転送アドレス(非自動割り当て時)|
|PARAM_AWOFFSET |0x18|RW |AXI4_ADDR_WIDTH| 転送アドレスオフセット|
|PARAM_AWLEN_MAX|0x1c|RW |AXI4_LEN_WIDTH| AXI4バスでの1回の最大転送サイズから1を引いたもの)
|PARAM_AWLEN0 |0x20|RW |AWLEN0_WIDTH |0次元目の転送量からAWLEN_OFFSETを引いた値|
|PARAM_AWLEN1 |0x24|RW |AWLEN1_WIDTH |1次元目の転送長らAWLEN_OFFSETを引いた値|
|PARAM_AWSTEP1 |0x25|RW |AWSTEP1_WIDTH|1次元目の転送ステップ(バイト単位)|
|PARAM_AWLEN2 |0x28|RW |AWLEN2_WIDTH |2次元目の転送長らAWLEN_OFFSETを引いた値|
|PARAM_AWSTEP2 |0x29|RW |AWSTEP2_WIDTH|2次元目の転送ステップ(バイト単位)|
|PARAM_AWLEN3 |0x2c|RW |AWLEN3_WIDTH |3次元目の転送長らAWLEN_OFFSETを引いた値|
|PARAM_AWSTEP3 |0x2d|RW |AWSTEP3_WIDTH|3次元目の転送ステップ(バイト単位)|
|PARAM_AWLEN4 |0x30|RW |AWLEN4_WIDTH |4次元目の転送長らAWLEN_OFFSETを引いた値|
|PARAM_AWSTEP4 |0x31|RW |AWSTEP4_WIDTH|4次元目の転送ステップ(バイト単位)|
|PARAM_AWLEN5 |0x34|RW |AWLEN5_WIDTH |5次元目の転送長らAWLEN_OFFSETを引いた値|
|PARAM_AWSTEP5 |0x35|RW |AWSTEP5_WIDTH|5次元目の転送ステップ(バイト単位)|
|PARAM_AWLEN6 |0x38|RW |AWLEN6_WIDTH |6次元目の転送長らAWLEN_OFFSETを引いた値|
|PARAM_AWSTEP6 |0x39|RW |AWSTEP6_WIDTH|6次元目の転送ステップ(バイト単位)|
|PARAM_AWLEN7 |0x3c|RW |AWLEN7_WIDTH |7次元目の転送長らAWLEN_OFFSETを引いた値|
|PARAM_AWSTEP7 |0x3d|RW |AWSTEP7_WIDTH|7次元目の転送ステップ(バイト単位)|
|PARAM_AWLEN8 |0x30|RW |AWLEN8_WIDTH |8次元目の転送長らAWLEN_OFFSETを引いた値|
|PARAM_AWSTEP8 |0x31|RW |AWSTEP8_WIDTH|8次元目の転送ステップ(バイト単位)|
|PARAM_AWLEN9 |0x44|RW |AWLEN9_WIDTH |9次元目の転送長らAWLEN_OFFSETを引いた値|
|PARAM_AWSTEP9 |0x45|RW |AWSTEP9_WIDTH|9次元目の転送ステップ(バイト単位)|
|WSKIP_EN |0x70|RW |1 |DMA停止時にStreamをスキップする|
|WDETECT_FIRST |0x72|RW |N |s_wfirstの検出するbitを1にする|
|WDETECT_LAST |0x73|RW |N |s_wlastの検出するbitを1にする|
|WPADDING_EN |0x74|RW |1 |データ不足時にパディングを行う|
|WPADDING_DATA |0x75|RW |WDATA_WIDTH |パディング時のデータ|
|WPADDING_STRB |0x76|RW |WSTRB_WIDTH |パディング時のストローブ|
### 動作説明
CTL_CONTROL の bit0 が1の時にN次元構造のデータの読出しを行い、各次元の先頭末尾で対応するbit位置のフラグを立てたデータを出力することが可能である。
CTL_CONTROL の bit2 に1を立てない限りは、繰り返し同じ動作を行う。CTL_CONTROL の bit2 に1を立てた場合は次回転送完了で、bit0は自動クリアされて停止する。
CTL_CONTROL の bit1 を立てると 1の時は繰り返しのタイミングでパラメータのみ動的に更新することが可能である。パラメータ更新と同時に CTL_CONTROL の bit1 は自動クリアされる。
内部的にシャドーレジスタを有しており、そちらにコピーされる為、動作中もパラメータレジスタは書き換えてかまわない。
割り込みは、1回の転送が終わる毎に発生する。パラメータの更新予約をしていた場合は、ここで更新が行われるため、さらに新しいバッファの割り当てなどをこのタイミングで行うことが可能である。
### parameter 設定
デフォルト値から変更する必要のある可能性のあるものだけ記載する。
| parameter name |description |
|:------------------ |:-----------------------------|
|N | 次元数 (1~10) |
|BYTE_WIDTH | 1バイトのbit数|
|WB_ASYNC | WISHBONEバスとAXIバスが非同期か|
|WB_ADR_WIDTH | WISHBONEバスのアドレス幅(8以上) |
|WB_DAT_WIDTH | WISHBONEバスのデータ幅 |
|WB_SEL_WIDTH | WISHBONEバスのバイト選択の幅 |
|HAS_WFIRST | s_wfirst信号を備える |
|HAS_WLAST | s_wlast信号を備える |
|WASYNC | WriteDataのストリームバスとAXIバスが非同期か|
|WDATA_WIDTH | 書き込むストリームのデータ幅 |
|WSTRB_WIDTH | 書き込むストリームのストローブ幅 |
|AXI4_ID_WIDTH | AXI4のID幅 |
|AXI4_ADDR_WIDTH | AXI4のADDR幅 |
|AXI4_DATA_SIZE | AXI4のデータサイズをlog2で指定(0:8bit, 1:16bit, 2:32bit, ...) |
|AXI4_LEN_WIDTH | AXI4の awlen の幅 |
|AXI4_QOS_WIDTH | AXI4の awqos の幅 |
|AXI4_AWID | AXI4の awid の値(固定値) |
|AXI4_AWLOCK | AXI4の awlock の値(固定値) |
|AXI4_AWCACHE | AXI4の awcach の値(固定値) |
|AXI4_AWPROT | AXI4の awprot の値(固定値) |
|AXI4_AWQOS | AXI4の awqos の値(固定値) |
|AXI4_AWREGION | AXI4の awregion の値(固定値) |
|INDEX_WIDTH | INDEXレジスタの幅 |
|AWLEN_OFFSET | 転送サイズのオフセット(1を指定すると転送サイズから1引いた値を設定) |
|AWLEN0_WIDTH | 0次元目の転送量指定幅 |
|AWLEN1_WIDTH | 1次元目の転送量指定幅(N >=2 の時のみ) |
|AWLEN2_WIDTH | 2次元目の転送量指定幅(N >=3 の時のみ) |
|AWLEN3_WIDTH | 3次元目の転送量指定幅(N >=4 の時のみ) |
|AWLEN4_WIDTH | 4次元目の転送量指定幅(N >=5 の時のみ) |
|AWLEN5_WIDTH | 5次元目の転送量指定幅(N >=6 の時のみ)|
|AWLEN6_WIDTH | 6次元目の転送量指定幅(N >=7 の時のみ)|
|AWLEN7_WIDTH | 7次元目の転送量指定幅(N >=8 の時のみ)|
|AWLEN8_WIDTH | 8次元目の転送量指定幅(N >=9 の時のみ)|
|AWLEN9_WIDTH | 9次元目の転送量指定幅(N >=10 の時のみ)|
|ARSTEP1_WIDTH | 1次元目の転送ステップ量指定幅(N >=2 の時のみ)|
|ARSTEP2_WIDTH | 2次元目の転送ステップ量指定幅(N >=3 の時のみ)|
|ARSTEP3_WIDTH | 3次元目の転送ステップ量指定幅(N >=4 の時のみ)|
|ARSTEP4_WIDTH | 4次元目の転送ステップ量指定幅(N >=5 の時のみ)|
|ARSTEP5_WIDTH | 5次元目の転送ステップ量指定幅(N >=6 の時のみ)|
|ARSTEP6_WIDTH | 6次元目の転送ステップ量指定幅(N >=7 の時のみ)|
|ARSTEP7_WIDTH | 7次元目の転送ステップ量指定幅(N >=8 の時のみ)|
|ARSTEP8_WIDTH | 8次元目の転送ステップ量指定幅(N >=9 の時のみ)|
|ARSTEP9_WIDTH | 9次元目の転送ステップ量指定幅(N >=10 の時のみ)|
|BYPASS_GATE | 出力の整形ゲートをバイパス(アライメント無し/フラグ無し)|
|BYPASS_ALIGN | AXI4の4kアライメント処理をバイパス|
|WDETECTOR_ENABLE | wチャネルのフラグ検出を利用する(パディング時必須) |
|ALLOW_UNALIGNED | バスサイズのアライメントに合わないアクセスを許す|
|CAPACITY_WIDTH | 内部でキューイングする転送量のbit幅(一度にDAMに予約する転送サイズがAXI4バス側の転送量に換算して総和が保持できるbit幅) |
|WFIFO_PTR_WIDTH | wチャネルのFIFOバッファのポインタ幅(サイズのlog2となる) FIFOサイズ以上の転送は出来ないので注意|
|WFIFO_RAM_TYPE | wチャネルのFIFOバッファのタイプ。"block" で BRAM, "distributed" で分散RAMを利用する |
### ポート仕様
本モジュールのポートの各信号は以下の通り。
| port name |I/O |size |description |
|:------------- |:--:|:---------------:|:-----------------------------|
|endian | I | 1 | エンディアン(0:little, 1:big) |
|s_wb_rst_i | I | 1 | WISHBONEバス リセット |
|s_wb_clk_i | I | 1 | WISHBONEバス クロック |
|s_wb_adr_i | I | WB_ADR_WIDTH | WISHBONEバス アドレス |
|s_wb_dat_i | I | WB_DAT_WIDTH | WISHBONEバス 書き込みデータ |
|s_wb_dat_o | O | WB_DAT_WIDTH | WISHBONEバス 読み出しデータ |
|s_wb_we_i | I | 1 | WISHBONEバス 読み書き選択 |
|s_wb_sel_i | I | WB_SEL_WIDTH | WISHBONEバス バイトセレクト |
|s_wb_stb_i | I | 1 | WISHBONEバス ストローブ |
|s_wb_ack_o | O | 1 | WISHBONEバス アクノリッジ |
|out_irq | O | 1 | IRQ信号(レベル割り込み) |
|buffer_request | O | 1 | バッファ割り当て要求 |
|buffer_release | O | 1 | バッファ解放 |
|buffer_addr | I | AXI4_ADDR_WIDTH | バッファアドレス |
|s_wresetn | I | | Write Stream バス リセット |
|s_wclk | I | | Write Stream バス クロック |
|s_wdata | I | WDATA_WIDTH | Write Stream バス データ |
|s_wstrb | I | WSTRB_WIDTH | Write Stream バス ストローブ |
|s_wfirst | I | N | Write Stream バス 各次元の先頭フラグ |
|s_wlast | I | N | Write Stream バス 各次元の末尾フラグ |
|s_wvalid | I | | Write Stream バス valid信号 |
|s_wready | O | | Write Stream バス ready信号 |
|m_aresetn | I | | AXI4 バス リセット(負論理) |
|m_aclk | I | | AXI4 バス クロック |
|m_axi4_awid | I | AXI4_ID_WIDTH | AXI4 バス awid 信号 |
|m_axi4_awaddr | I | AXI4_ADDR_WIDTH | AXI4 バス awaddr 信号 |
|m_axi4_awlen | I | AXI4_LEN_WIDTH | AXI4 バス awlen 信号 |
|m_axi4_awsize | I | 3 | AXI4 バス awsize 信号 |
|m_axi4_awburst | I | 2 | AXI4 バス awburst 信号 |
|m_axi4_awlock | I | 1 | AXI4 バス awlock 信号 |
|m_axi4_awcache | I | 4 | AXI4 バス awcache 信号 |
|m_axi4_awprot | I | 2 | AXI4 バス awprot 信号 |
|m_axi4_awqos | I | AXI4_QOS_WIDTH | AXI4 バス awqos 信号 |
|m_axi4_awregion | I | 4 | AXI4 バス awregion 信号 |
|m_axi4_awvalid | I | 1 | AXI4 バス awvalid 信号 |
|m_axi4_awready | O | 1 | AXI4 バス awready 信号 |
|m_axi4_wdata | I | AXI4_DATA_WIDTH | AXI4 バス wdata 信号 |
|m_axi4_wstrb | I | AXI4_STRB_WIDTH | AXI4 バス wstrb 信号 |
|m_axi4_wlast | I | 1 | AXI4 バス wlast 信号 |
|m_axi4_wvalid | I | 1 | AXI4 バス wvalid 信号 |
|m_axi4_wready | O | 1 | AXI4 バス wready 信号 |
|m_axi4_bid | O | AXI4_ID_WIDTH | AXI4 バス bid 信号 |
|m_axi4_bresp | O | 2 | AXI4 バス bresp 信号 |
|m_axi4_bvalid | O | 1 | AXI4 バス bvalid 信号 |
|m_axi4_bready | I | 1 | AXI4 バス bready 信号 |
endian は 動的に変更することは想定していないので注意。バス幅変換が作用した場合に動作が変わる。
## jelly_dma_stream_read
### 概要
(まだデバッグ中、writeもセットで開発中)
AXI4 メモリバスからN次元読み出して Stream を出力する。
読出し先のバッファ制御と、読出しデータの利用側とを独立性高く扱いつつ、メモリアクセス効率を保つことを目的に設計を行っている。
内部にFIFOバッファを有しており、バッファ溢れしない分量のみを読み出し管理する為、利用側はデータ利用に先立って起動しておけば、後は読み出し制御とは独立してデータを取り出して利用するのみでよい。
CPUからのレジスタ状態変化や割り込みは、内部FIFOの残量に無関係にAXI4バスへのメモリアクセスが完了した段階で発生するため、データ読出し側とは独立して、読み出しバッファの解放と、次の読出しバッファのアロケートを効率的に先行実施可能である。
(データの完了を知りたい場合は、データを利用する側のコアから完了割り込みを受けるべきである)。
### レジスタ仕様
アドレスはWISHBONEのワードアドレス。
レジスタ幅や初期値は parameter 指定で変更可能。
| register name |addr|R/W|size|description |
|:------------- |:--:|:-:|:--:|:-----------------------------|
|CORE_ID |0x00|RO | 32 | core ID |
|CORE_VERSION |0x01|RO | 32 | core verion |
|CORE_CONFIG |0x03|RO | 32 | サポート次元数(Nの値) |
|CTL_CONTROL |0x04|RW | 4 | bit[0]:有効化
bit[1]:パラメータ更新予約(自動クリア)
bit[2]:ワンショット転送
bit[3] 自動アドレス取得有効 |
|CTL_STATUS |0x05|RO | 1 | 動作中に1となる |
|CTL_INDEX |0x07|RO |INDEX_WIDTH| 新規パラメータ反映毎にインクリメント
|IRQ_ENABLE |0x08|RW | 1 | 1でIQR有効 |
|IRQ_STATUS |0x09|RO | 1 | 現在のIQR保留状態 |
|IRQ_CLR |0x0a|WO | 1 | 1を書き込むと保留IRQクリア |
|IRQ_SET |0x0b|WO | 1 | 1を書き込むと保留IRQセット |
|PARAM_ARADDR |0x10|RW |AXI4_ADDR_WIDTH| 転送アドレス(非自動割り当て時)|
|PARAM_AROFFSET |0x18|RW |AXI4_ADDR_WIDTH| 転送アドレスオフセット|
|PARAM_ARLEN_MAX|0x1c|RW |AXI4_LEN_WIDTH| AXI4バスでの1回の最大転送サイズから1を引いたもの)
|PARAM_ARLEN0 |0x20|RW |ARLEN0_WIDTH |0次元目の転送量からARLEN_OFFSETを引いた値|
|PARAM_ARLEN1 |0x24|RW |ARLEN1_WIDTH |1次元目の転送長らARLEN_OFFSETを引いた値|
|PARAM_ARSTEP1 |0x25|RW |ARSTEP1_WIDTH|1次元目の転送ステップ(バイト単位)|
|PARAM_ARLEN2 |0x28|RW |ARLEN2_WIDTH |2次元目の転送長らARLEN_OFFSETを引いた値|
|PARAM_ARSTEP2 |0x29|RW |ARSTEP2_WIDTH|2次元目の転送ステップ(バイト単位)|
|PARAM_ARLEN3 |0x2c|RW |ARLEN3_WIDTH |3次元目の転送長らARLEN_OFFSETを引いた値|
|PARAM_ARSTEP3 |0x2d|RW |ARSTEP3_WIDTH|3次元目の転送ステップ(バイト単位)|
|PARAM_ARLEN4 |0x30|RW |ARLEN4_WIDTH |4次元目の転送長らARLEN_OFFSETを引いた値|
|PARAM_ARSTEP4 |0x31|RW |ARSTEP4_WIDTH|4次元目の転送ステップ(バイト単位)|
|PARAM_ARLEN5 |0x34|RW |ARLEN5_WIDTH |5次元目の転送長らARLEN_OFFSETを引いた値|
|PARAM_ARSTEP5 |0x35|RW |ARSTEP5_WIDTH|5次元目の転送ステップ(バイト単位)|
|PARAM_ARLEN6 |0x38|RW |ARLEN6_WIDTH |6次元目の転送長らARLEN_OFFSETを引いた値|
|PARAM_ARSTEP6 |0x39|RW |ARSTEP6_WIDTH|6次元目の転送ステップ(バイト単位)|
|PARAM_ARLEN7 |0x3c|RW |ARLEN7_WIDTH |7次元目の転送長らARLEN_OFFSETを引いた値|
|PARAM_ARSTEP7 |0x3d|RW |ARSTEP7_WIDTH|7次元目の転送ステップ(バイト単位)|
|PARAM_ARLEN8 |0x30|RW |ARLEN8_WIDTH |8次元目の転送長らARLEN_OFFSETを引いた値|
|PARAM_ARSTEP8 |0x31|RW |ARSTEP8_WIDTH|8次元目の転送ステップ(バイト単位)|
|PARAM_ARLEN9 |0x44|RW |ARLEN9_WIDTH |9次元目の転送長らARLEN_OFFSETを引いた値|
|PARAM_ARSTEP9 |0x45|RW |ARSTEP9_WIDTH|9次元目の転送ステップ(バイト単位)|
### 動作説明
CTL_CONTROL の bit0 が1の時にN次元構造のデータの読出しを行い、各次元の先頭末尾で対応するbit位置のフラグを立てたデータを出力することが可能である。
CTL_CONTROL の bit2 に1を立てない限りは、繰り返し同じ動作を行う。CTL_CONTROL の bit2 に1を立てた場合は次回転送完了で、bit0は自動クリアされて停止する。
CTL_CONTROL の bit1 を立てると 1の時は繰り返しのタイミングでパラメータのみ動的に更新することが可能である。パラメータ更新と同時に CTL_CONTROL の bit1 は自動クリアされる。
内部的にシャドーレジスタを有しており、そちらにコピーされる為、動作中もパラメータレジスタは書き換えてかまわない。
割り込みは、1回の転送が終わる毎に発生する。パラメータの更新予約をしていた場合は、ここで更新が行われるため、さらに新しいバッファの割り当てなどをこのタイミングで行うことが可能である。
### parameter 設定
デフォルト値から変更する必要のある可能性のあるものだけ記載する。
| parameter name |description |
|:------------------ |:-----------------------------|
|N | 次元数 (1~10) |
|WB_ASYNC | WISHBONEバスとAXIバスが非同期か|
|RASYNC | ReadDataのストリームバスとAXIバスが非同期か|
|BYTE_WIDTH | 1バイトのbit数|
|BYPASS_GATE | 出力の整形ゲートをバイパス(アライメント無し/フラグ無し)|
|BYPASS_ALIGN | AXI4の4kアライメント処理をバイパス|
|ALLOW_UNALIGNED | バスサイズのアライメントに合わないアクセスを許す|
|HAS_RFIRST | s_rfirst信号を備える |
|HAS_RLAST | s_rlast信号を備える |
|AXI4_ID_WIDTH | AXI4のID幅 |
|AXI4_ADDR_WIDTH | AXI4のADDR幅 |
|AXI4_DATA_SIZE | AXI4のデータサイズをlog2で指定(0:8bit, 1:16bit, 2:32bit, ...) |
|AXI4_LEN_WIDTH | AXI4の arlen の幅 |
|AXI4_QOS_WIDTH | AXI4の arqos の幅 |
|AXI4_ARID | AXI4の arid の値(固定値) |
|AXI4_ARLOCK | AXI4の arlock の値(固定値) |
|AXI4_ARCACHE | AXI4の arcach の値(固定値) |
|AXI4_ARPROT | AXI4の arprot の値(固定値) |
|AXI4_ARQOS | AXI4の arqos の値(固定値) |
|AXI4_ARREGION | AXI4の arregion の値(固定値) |
|S_RDATA_WIDTH | 読み出したストリームのデータ幅 |
|CAPACITY_WIDTH | 内部でキューイングする転送量のbit幅(一度にDAMに予約する転送サイズがAXI4バス側の転送量に換算して総和が保持できるbit幅) |
|ARLEN_OFFSET | 転送サイズのオフセット(1を指定すると転送サイズから1引いた値を設定) |
|WB_ADR_WIDTH | WISHBONEバスのアドレス幅(8以上) |
|WB_DAT_WIDTH | WISHBONEバスのデータ幅 |
|WB_SEL_WIDTH | WISHBONEバスのバイト選択の幅 |
|INDEX_WIDTH | INDEXレジスタの幅 |
|ARLEN0_WIDTH | 0次元目の転送量指定幅 |
|ARLEN1_WIDTH | 1次元目の転送量指定幅(N >=2 の時のみ) |
|ARLEN2_WIDTH | 2次元目の転送量指定幅(N >=3 の時のみ) |
|ARLEN3_WIDTH | 3次元目の転送量指定幅(N >=4 の時のみ) |
|ARLEN4_WIDTH | 4次元目の転送量指定幅(N >=5 の時のみ) |
|ARLEN5_WIDTH | 5次元目の転送量指定幅(N >=6 の時のみ)|
|ARLEN6_WIDTH | 6次元目の転送量指定幅(N >=7 の時のみ)|
|ARLEN7_WIDTH | 7次元目の転送量指定幅(N >=8 の時のみ)|
|ARLEN8_WIDTH | 8次元目の転送量指定幅(N >=9 の時のみ)|
|ARLEN9_WIDTH | 9次元目の転送量指定幅(N >=10 の時のみ)|
|ARSTEP1_WIDTH | 1次元目の転送ステップ量指定幅(N >=2 の時のみ)|
|ARSTEP2_WIDTH | 2次元目の転送ステップ量指定幅(N >=3 の時のみ)|
|ARSTEP3_WIDTH | 3次元目の転送ステップ量指定幅(N >=4 の時のみ)|
|ARSTEP4_WIDTH | 4次元目の転送ステップ量指定幅(N >=5 の時のみ)|
|ARSTEP5_WIDTH | 5次元目の転送ステップ量指定幅(N >=6 の時のみ)|
|ARSTEP6_WIDTH | 6次元目の転送ステップ量指定幅(N >=7 の時のみ)|
|ARSTEP7_WIDTH | 7次元目の転送ステップ量指定幅(N >=8 の時のみ)|
|ARSTEP8_WIDTH | 8次元目の転送ステップ量指定幅(N >=9 の時のみ)|
|ARSTEP9_WIDTH | 9次元目の転送ステップ量指定幅(N >=10 の時のみ)|
|RFIFO_PTR_WIDTH | rチャネルのFIFOバッファのポインタ幅(サイズのlog2となる) FIFOサイズ以上の転送は出来ないので注意|
|RFIFO_RAM_TYPE | rチャネルのFIFOバッファのタイプ。"block" で BRAM, "distributed" で分散RAMを利用する |
### ポート仕様
本モジュールのポートの各信号は以下の通り。
| port name |I/O |size |description |
|:------------- |:--:|:---------------:|:-----------------------------|
|endian | I | 1 | エンディアン(0:little, 1:big) |
|s_wb_rst_i | I | 1 | WISHBONEバス リセット |
|s_wb_clk_i | I | 1 | WISHBONEバス クロック |
|s_wb_adr_i | I | WB_ADR_WIDTH | WISHBONEバス アドレス |
|s_wb_dat_i | I | WB_DAT_WIDTH | WISHBONEバス 書き込みデータ |
|s_wb_dat_o | O | WB_DAT_WIDTH | WISHBONEバス 読み出しデータ |
|s_wb_we_i | I | 1 | WISHBONEバス 読み書き選択 |
|s_wb_sel_i | I | WB_SEL_WIDTH | WISHBONEバス バイトセレクト |
|s_wb_stb_i | I | 1 | WISHBONEバス ストローブ |
|s_wb_ack_o | O | 1 | WISHBONEバス アクノリッジ |
|out_irq | O | 1 | IRQ信号(レベル割り込み) |
|buffer_request | O | 1 | バッファ割り当て要求 |
|buffer_release | O | 1 | バッファ解放 |
|buffer_addr | I | AXI4_ADDR_WIDTH | バッファアドレス |
|s_rresetn | I | | Read Stream バス リセット |
|s_rclk | I | | Read Stream バス クロック |
|s_rdata | O | S_RDATA_WIDTH | Read Stream バス データ |
|s_rfirst | O | N | Read Stream バス 各次元の先頭フラグ |
|s_rlast | O | N | Read Stream バス 各次元の末尾フラグ |
|s_rvalid | O | | Read Stream バス valid信号 |
|s_rready | I | | Read Stream バス ready信号 |
|m_aresetn | I | | AXI4 バス リセット(負論理) |
|m_aclk | I | | AXI4 バス クロック |
|m_axi4_arid | O | AXI4_ID_WIDTH | AXI4 バス arid 信号 |
|m_axi4_araddr | O | AXI4_ADDR_WIDTH | AXI4 バス araddr 信号 |
|m_axi4_arlen | O | AXI4_LEN_WIDTH | AXI4 バス arlen 信号 |
|m_axi4_arsize | O | 3 | AXI4 バス arsize 信号 |
|m_axi4_arburst | O | 2 | AXI4 バス arburst 信号 |
|m_axi4_arlock | O | 1 | AXI4 バス arlock 信号 |
|m_axi4_arcache | O | 4 | AXI4 バス arcache 信号 |
|m_axi4_arprot | O | 2 | AXI4 バス arprot 信号 |
|m_axi4_arqos | O | AXI4_QOS_WIDTH | AXI4 バス arqos 信号 |
|m_axi4_arregion | O | 4 | AXI4 バス arregion 信号 |
|m_axi4_arvalid | O | 1 | AXI4 バス arvalid 信号 |
|m_axi4_arready | I | 1 | AXI4 バス arready 信号 |
|m_axi4_rid | I | AXI4_ID_WIDTH | AXI4 バス rid 信号 |
|m_axi4_rdata | I | AXI4_DATA_WIDTH | AXI4 バス rdata 信号 |
|m_axi4_rresp | I | 2 | AXI4 バス rresp 信号 |
|m_axi4_rlast | I | | AXI4 バス rlast 信号 |
|m_axi4_rvalid | I | | AXI4 バス rvalid 信号 |
|m_axi4_rready | O | | AXI4 バス rready 信号 |
endian は 動的に変更することは想定していないので注意。バス幅変換が作用した場合に動作が変わる。
## jelly_dma_fifo
外部メモリを利用した大サイズのFIFOを構成する
### レジスタ仕様
アドレスはWISHBONEのワードアドレス。
レジスタ幅や初期値は parameter 指定で変更可能。
| register name |addr|R/W|size|description |
|:--------------- |:--:|:-:|:--:|:-----------------------------|
| CORE_ID |0x00|RO | 32 | core ID |
| CORE_VERSION |0x01|RO | 32 | core verion |
| CTL_CONTROL |0x04|RW | 2 | bit[0]:有効化
bit[1]:パラメータ更新予約(自動クリア) |
| CTL_STATUS |0x05|RO | 1 | 動作中に1 |
| CTL_INDEX |0x06|RO |INDEX_WIDTH |新規パラメータ反映毎にインクリメント|
| PARAM_ADDR |0x08|RW |PARAM_ADDR_WIDTH |割り当てメモリの先頭アドレス |
| PARAM_SIZE |0x09|RW |PARAM_SIZE_WIDTH |割り当てメモリのサイズ |
| PARAM_AWLEN |0x10|RW |PARAM_AWLEN_WIDTH |書き込み側の最大awlen |
| PARAM_WSTRB |0x11|RW |PARAM_WSTRB_WIDTH |書き込み側のストローブ |
| PARAM_WTIMEOUT |0x13|RW |PARAM_WTIMEOUT_WIDTH|書き込み側のタイムアウト時間 |
| PARAM_ARLEN |0x14|RW |PARAM_ARLEN_WIDTH |書き込み側の最大arlen |
| PARAM_RTIMEOUT |0x17|RW |PARAM_RTIMEOUT_WIDTH|読み込み側のタイムアウト時間 |
基本的にメモリを割り当ててしまえば、ストリームデータに対して巨大なFIFOとしてふるまうモジュールである。
ただし、メモリバス幅がストリームバス幅より大きい場合、バス幅分のデータにならないと反対側のポートに転送されないので注意が必要である。
メモリ読み書きの両端でコア内にも小さなFIFOを持っており、データの揃った分しか書き込みコマンドを出さないし、FIFOの空き分しか読出しコマンドを出さないので、ストリーム側は特にメモリの事を気にせずにBRAMで構成したFIFOと似たように利用可能である。
レジスタにはタイムアウトレジスタを用意しており、データや空きが awlen/wrlen のサイズ揃わなくてもタイムアウトすれば転送を行う。タイムアウトしない範囲でなるべくデータを溜めてからバースト転送を行う事でメモリアクセス効率が向上する。
## jelly_dma_video_write
AXI4 Stream Video 書き込み用のDMA
jelly_dma_stream_write の N=3 のラッパーとして実装されている
### レジスタ仕様
アドレスはWISHBONEのワードアドレス。
レジスタ幅や初期値は parameter 指定で変更可能。
| register name |addr|R/W|size|description |
|:------------- |:--:|:-:|:--:|:-----------------------------|
|CORE_ID |0x00|RO | 32 | core ID |
|CORE_VERSION |0x01|RO | 32 | core verion |
|CORE_CONFIG |0x03|RO | 32 | サポート次元数(Nの値) |
|CTL_CONTROL |0x04|RW | 4 | bit[0]:有効化
bit[1]:パラメータ更新予約(自動クリア)
bit[2]:ワンショット転送
bit[3] 自動アドレス取得有効 |
|CTL_STATUS |0x05|RO | 1 | 動作中に1となる |
|CTL_INDEX |0x07|RO |INDEX_WIDTH| 新規パラメータ反映毎にインクリメント
|IRQ_ENABLE |0x08|RW | 1 | 1でIQR有効 |
|IRQ_STATUS |0x09|RO | 1 | 現在のIQR保留状態 |
|IRQ_CLR |0x0a|WO | 1 | 1を書き込むと保留IRQクリア |
|IRQ_SET |0x0b|WO | 1 | 1を書き込むと保留IRQセット |
|PARAM_ADDR |0x10|RW |AXI4_ADDR_WIDTH| 転送アドレス(非自動割り当て時)
|PARAM_OFFSET |0x18|RW |AXI4_ADDR_WIDTH| 転送アドレスオフセット|
|PARAM_AWLEN_MAX |0x1c|RW |AXI4_LEN_WIDTH| AXI4バスでの1回の最大転送サイズから1を引いたもの)
|PARAM_H_SIZE |0x20|RW |H_SIZE_WIDTH |水平サイズからSIZE_OFFSETを引いた値|
|PARAM_V_SIZE |0x24|RW |V_SIZE_WIDTH |垂直サイズからSIZE_OFFSETを引いた値|
|PARAM_LINE_STEP |0x25|RW |AXI4_ADDR_WIDTH|ライン単位の転送ステップ(バイト単位)|
|PARAM_F_SIZE |0x28|RW |F_SIZE_WIDTH |複数フレーム記録する倍のフレーム数からSIZE_OFFSETを引いた値|
|PARAM_FRAME_STEP|0x29|RW |AXI4_ADDR_WIDTH|フレーム単位の転送ステップ(バイト単位)|
|SKIP_EN |0x70|RW |1 |DMA停止時にStreamをスキップする|
|DETECT_FIRST |0x72|RW |3 |転送開始にtuserの検出する場合はbit[1]を1にする|
|DETECT_LAST |0x73|RW |3 |パディングの為にtlastの検出する場合はbit[0]を1にする|
|PADDING_EN |0x74|RW |1 |データ不足時にパディングを行う|
|PADDING_DATA |0x75|RW |WDATA_WIDTH |パディング時のデータ|
|PADDING_STRB |0x76|RW |WSTRB_WIDTH |パディング時のストローブ|
## jelly_dma_video_read
AXI4 Stream Video 読み出し用のDMA
| register name |addr|R/W|size|description |
|:------------- |:--:|:-:|:--:|:-----------------------------|
|CORE_ID |0x00|RO | 32 | core ID |
|CORE_VERSION |0x01|RO | 32 | core verion |
|CORE_CONFIG |0x03|RO | 32 | サポート次元数(Nの値) |
|CTL_CONTROL |0x04|RW | 4 | bit[0]:有効化
bit[1]:パラメータ更新予約(自動クリア)
bit[2]:ワンショット転送
bit[3] 自動アドレス取得有効 |
|CTL_STATUS |0x05|RO | 1 | 動作中に1となる |
|CTL_INDEX |0x07|RO |INDEX_WIDTH| 新規パラメータ反映毎にインクリメント
|IRQ_ENABLE |0x08|RW | 1 | 1でIQR有効 |
|IRQ_STATUS |0x09|RO | 1 | 現在のIQR保留状態 |
|IRQ_CLR |0x0a|WO | 1 | 1を書き込むと保留IRQクリア |
|IRQ_SET |0x0b|WO | 1 | 1を書き込むと保留IRQセット |
|PARAM_ADDR |0x10|RW |AXI4_ADDR_WIDTH| 転送アドレス(非自動割り当て時)|
|PARAM_OFFSET |0x18|RW |AXI4_ADDR_WIDTH| 転送アドレスオフセット|
|PARAM_ARLEN_MAX |0x1c|RW |AXI4_LEN_WIDTH| AXI4バスでの1回の最大転送サイズから1を引いたもの)
|PARAM_H_SIZE |0x20|RW |H_SIZE_WIDTH |水平サイズからSIZE_OFFSETを引いた値|
|PARAM_V_SIZE |0x24|RW |V_SIZE_WIDTH |垂直サイズからSIZE_OFFSETを引いた値|
|PARAM_LINE_STEP |0x25|RW |AXI4_ADDR_WIDTH|ライン単位の転送ステップ(バイト単位)|
|PARAM_F_SIZE |0x28|RW |F_SIZE_WIDTH |複数フレーム記録する倍のフレーム数からSIZE_OFFSETを引いた値|
|PARAM_FRAME_STEP|0x29|RW |AXI4_ADDR_WIDTH|フレーム単位の転送ステップ(バイト単位)|