!AXI/JavaRock JavaRockでAXIにアクセスするコアを書きたいな,と思いながら 手がまわっていなかったのですが,ようやく着手. とりあえず,ということで, * 読み書き用それぞれのバッファを用意 * 読み書き制御用に,それぞれstart/busyを用意 * startの立ち上がりで処理を開始し,処理中はbusyがアサートされる という安直な方法で実装してみました. "" こんなコード↓でAXIにアクセスできます. import net.wasamon.javarock.rt.*; @javarockhdl public class AXITest{ private final AXI_M axi = new AXI_M(); private void sleep(int v){ for(int i = 0; i < v; i++){ ; } return; } @auto public void run(){ axi.write_addr = 0x20001000; axi.write_len = 128; axi.read_addr = 0x20000000; axi.read_len = 128; while(true){ axi.read_start = false; axi.read_start = true; while(axi.read_busy == true){ ; } for(int i = 0; i < 128; i++){ axi.out[i] = axi.in[i]; } axi.write_start = false; axi.write_start = true; while(axi.write_busy == true){ ; } sleep(100); } } } ちなみに,AXI空間の0x20000000は, PCIe越しでホストPCのメインメモリの512M番地にマッピングしています. つまり,上のコードは,512M〜512M+511番地のデータ(128DWORD分)を, 512M+0x1000〜512M+0x1000+511番地にコピーするもの,です. "" AXIな口は,EDKのAXI EXTERNAL MASTER CONTROLLERを使って引き出すことを想定して, AXIトランザクションを行うプリミティブをVHDLで実装. {{ref axi_m_prim.vhd}} WREADYがずっと立ちっぱなしならブロックRAMからバーストでデータ読むんだけどな... "" ちなみに,AXIクロックとアプリクロックが違うことが考えられるので, 読み書きのクロックが独立したブロックRAMを使っています. {{ref simpledualportram_dual_clk.vhd}} "" あわせて,これとJavaRockを接続するためのブリッジも記述. {{ref AXI_M.java}} {{ref vhdl_axi_m_iface.vhd}} "" 今は32bit幅アクセスだけど,AXI側は128bit幅アクセスくらいにしてもいいかも. "" あと,本当はFIFOでデータの授受をしたいんだけど, Javaのコードとクロック単位でデータ送受信しなきゃいけないFIFOアクセスを うまく組み合わせる方法を思いついていないんだよなあ.