SATAのコアを開発しています
4月ごろにちょっと始めたSATAのIPコアですが、本格的に開発することになりました。
納期は9月中旬だと思っていたのに、8月末になってしまいました。
というわけで突貫工事で開発中です。
今日は物理層がリンクアップするまでができました。
EXPARTAN-6Tには、ホスト用とデバイス用の2つのSATAコネクタがあります。
なので、IPコアもデバイスモード(ハードディスクをエミュレートするモード)とホストモード(マザーボードをエミュレートするモード)の両方を一緒に開発します。
IPコアをデバイスモードにし、パソコンのSATAコネクタにEXPARTAN-6Tのデバイス用のSATAコネクタをつなぎ、波形をキャプチャしてみました。
最初にデバイス初期化時の波形を見てみます。
まず、デバイス(EXPARTAN-6T)からCOMINITというリセット信号を送信し、ホストPCからのCOMWAKEを待ちます。その後、COMWAKEを送信します。

そうしたらAlignプリミティブやSyncプリミティブを送信して、リンクアップ完了です。

SATAでは32bit単位で送受信します。最初の1バイトがK符号ならばプリミティブといって制御用の符号になり、全部がD符号ならば純粋なデータとなります。
プリミティブには、
・ALIGN(K28.5 D10.2 D10.2 D27.3) クロック再同期や弾性バッファの調整に使われる
・SYNC(K28.3 D21.4 D21.5 D21.5) アイドル状態
・CONT(K28.3 D10.5 D25.4 D25.4) 直前のプリミティブを繰り返すときに使う
・X_RDY(K28.3 D21.5 D23.1 D23.1) フレーム送信の開始要求
・SOF(K28.3 D21.5 D23.2 D23.2) フレームの開始
など、全部で18種類ほどあります。
物理層で使うのはALIGNだけです。
次に、IPコアをホストモードにしたときの波形です。
EXPARTAN-6Tに、適当なハードディスクをつないで準備完了です。
デバイスからのCOMINIT(リセット要求)を受信したら、COMWAKEを送信します。デバイスから返事のCOMWAKEを受信したら、ALIGNプリミティブを待ちます。
リンクアップするときには、デバイス(ここではHDD)から、ALIGNプリミティブとSYNCプリミティブが送られてきます。その後、CONTプリミティブが送られてきます。
SATAでは同じ信号が連続して送られてEMI放射が増加することを嫌います。そのためデータにはスクランブルがかけられることになっていますが、プリミティブにはスクランブルがかけられないので、同じプリミティブを連続して送る場合にはCONTプリミティブとJunkデータを使って代替してもよいことになっています。
つまり、SYNC SYNC SYNC SYNC SYNC ・・・の代わりに、SYNC CONT Junk Junk Junk ・・・としてもよいということです。Junkデータにはスクランブルがかかるので、同じ符号が連続して送られることがなくなります。
ややこしいうえに、ユーザには特にメリットがない仕様です。
だからCONTが来たら直前のプリミティブの連続と解釈しなければなりません。
リンクアップしてしばらくすると、X_RDYというプリミティブとCONTが送られてきました。

X_RDYは、「何か送りたいデータがあるんだけど」という意味です。これもCONTプリミティブを使っています。
これに対してホストがR_RDYで応答すれば、次のデータを送ってきてくれるようになるのでしょう。
SATAではハードディスクのほうからX_RDYを送ることで、最初の通信が始まるということがわかりました。ホストのほうからは特に何も送信しないようです。
| 固定リンク



コメント