トップ 一覧 Farm 検索 ヘルプ RSS ログイン

Diary/2013-8-8の変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
!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アクセスを
うまく組み合わせる方法を思いついていないんだよなあ.