パソコンでは普通に使っていて馴染み深い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円でうっているソケットを使って適当に接続してみました.(社長が動くんじゃない?って言ってたし…)
接続部分をアップで撮影したのが,次の写真.デザインゲートウェイの変換基板を参考に直列にコンデンサを入れてみました.
1. とりあえず,動かしてみる
MicroBlazeで動作させるように作っているようですが,面倒なのでコアの入出力ポートに外からUDPでアクセスできるようにして動作を確認してみることにします.
モジュールの構成図は,こんな感じ.
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からコアにアクセスしてみると
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)
- Fujitsu MHV2040BS
- Western Digital WD600BD
- SAMSUNG SP0411C/R
ではリンクが確立できず…残念.
コメント