OpenCoresのSATAコントローラで遊んでみた

技術紹介

パソコンでは普通に使っていて馴染み深いSATAなディスクですが,FPGAから使おうと思うと,なんだか敷居が高い気がする…と,ずっと指をくわえていたのですが,OpenCoresにコントローラがコミットされているのを見つけたので,試してみました.

ちなみに,試してみたのは,Serial ATA Host Bus Adapter Core for Virtex 6 です.

0. 準備

OpenCoresのコアはVirtex-6を想定して作ってあるようなので,ML605で実験することにします.

しかし,ML605にはSATAコネクタがありません.

UCFファイルをみてみるとOpenCoresの人は,FMCからRocket I/Oを引き出しているようですが,たとえば,Avnetから購入するようなボードだと7万円くらいします.

手軽なRocket I/OといえばPCIe!!

ということで,aitendoで250円でうっているソケットを使って適当に接続してみました.(社長が動くんじゃない?って言ってたし…)

Exif_JPEG_PICTURE

接続部分をアップで撮影したのが,次の写真.デザインゲートウェイの変換基板を参考に直列にコンデンサを入れてみました.

Exif_JPEG_PICTURE

1. とりあえず,動かしてみる

MicroBlazeで動作させるように作っているようですが,面倒なのでコアの入出力ポートに外からUDPでアクセスできるようにして動作を確認してみることにします.

モジュールの構成図は,こんな感じ.

sata_test_overview

DPパケット化する部分は,JavaRockで,↓のようにかけますね.

あ,objっていうのが,sata_coreに対応するJavaRock上のインスタンスで,send_bufがUDPパケットを生成するためのバッファです.

private int get_status(){
  int i = 0;
 if(obj.ready_for_cmd == true){ send_buf[i] = 1; }else{ send_buf[i] = 0; }
  i++;
  if(obj.sata_core_full == true){ send_buf[i] = 1; }else{ send_buf[i] = 0; }
  i++;
  if(obj.sata_core_empty == true){ send_buf[i] = 1; }else{ send_buf[i] = 0; }
  i++;
  send_buf[i] = obj.sata_dout;
  i++;
  send_buf[i] = obj.sata_timer;
  i++;
  return i;
}

で,合成して,ホストPCからコアにアクセスしてみると

_2013-03-06_21.18.44

2. もっとSATAる!!

とりあえず,動作することが確認できたので,あとはアプリケーションで使うだけ!

ちなみに,SATAコントローラとのデータのやり取りはFIFOで

  • sata_din_weをアサートしているときクロックが立ち上がる度にsata_dinがFIFOにつっこまれる
  • sata_dout_reをアサートしているときクロックの立ち上がる度にsata_doutからデータが出力される

という使い方になっています.

…Javaでは書きづらいよ.

というわけで,ここだけVHDLで書いて,Javaからはメモリアクセスに見えるようにしました.

配列アクセスでSATAコントローラとデータをやり取りできます.

objがsata_coreに対応するインスタンスで,recv_bufがUDPパケットとして受信したペイロードです.つまり,これは,受信したパケットをSATAディスクに吐き出すメソッド,です.

private int set_data(int offset, int len){
  if(obj.push_to_fifo_busy == true){ return 0; }
  if(obj.sata_core_full == true){ return 0; }
  int length = len;
  if(length > 1024){ length = 1024; }
  for(int i = 0; i > length; i++){
    obj.inbuf[i] = recv_buf[i+offset];
  }
  obj.push_to_fifo_req = true;
  obj.push_to_fifo_req = false;
  return length;
}

とか.

フラグ操作が,ちょっとJavaっぽくないですか?まあ,許してください.

というわけで,SATAにFPGAでアクセスできるようになったので,いろいろ試してみたいと思います.

3. ちなみに

配線がへぼいのか,何かわかりませんが,SATAを選ぶようです.

会社にあったSATAディスクでは

  • Intel SSD 330 Series (60GB)
  • Fujitsu MHZ2250BS G2 (250GB)
では,SATAのリンクの確立と動作の確認ができましたが,
  • Fujitsu MHV2040BS
  • Western Digital WD600BD
  • SAMSUNG SP0411C/R

ではリンクが確立できず…残念.

コメント

タイトルとURLをコピーしました