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パケットを生成するためのバッファです.

で,合成して,ホスト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ディスクに吐き出すメソッド,です.

とか.

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

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

3. ちなみに

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

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

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

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

シェアする

  • このエントリーをはてなブックマークに追加

フォローする