SATAリンク層の受信部分の作成
SATAのリンク層を作成しています。
受信したデータの中から各種プリミティブを抽出する回路を作るわけですが、厄介なのはCONTプリミティブというやつです。CONTを受信したら前のプリミティブを受信したことにしなければなりません。また、ALIGNプリミティブは無視してリンク層では関与しないようにします。
このようにして、プリミティブとPureDataをデコードする回路を作りました。
そして、受信したプリミティブに応じてリンク層ステートマシンを動かし、相手からのデータを待ち受けるようにします。相手がX_RDYを送ってきたらR_RDYを、SOFが来たらR_IPを、EOFでR_OKを送ります。
このようにして適切な応答を返すと、1フレームがうまく受け取れます。

フレームの中のデータはスクランブルがかけられているので、それをデコードする回路を作ります。
スクランブルの初期値は8D76D2C2で、データを受け取るたびに68B3261F、6C4308A5、54D35234、0295558A、1BBE1ABB・・と変化していきます。この生成式はXORの塊です。
受信したデータに、このスクランブルの系列をXORしてやると、本来のデータが復元できます。

最初に受信した6DWordのパケットは、スクランブル解除すると、34005001 01000000 00000000 01000000 00000000 952405DCでした。最後の952405DCというのはCRCです。
34というのがパケットのタイプを示すもので、Register Device to Hostというコマンドを示します。50というのはステータスのようで、正常のときにこの値になるみたいです。
次はCRCをチェックする回路と、フレームを送信する回路を作ろうと思います。
| 固定リンク


コメント