SATAサンプルデザイン
サンプルデザインの概要
特電SATA IPコアを用いたFPGAのリファレンス・デザインとして、特電SATAサンプル・デザインを用意しています。
特電SATA IPコアに、本デザインで提供するホストラッパを被せることで、Parallel ATA(以下、PATAと略す)と同様の方式でSATAにインタフェースすることができるようになります。
当サンプル・デザインにはUSBとPATAを接続するインタフェースも含まれており、Windows PCからUSBを介してSATAデバイスに対してアクセスすることができるようになります。
つまり、USBからPATAを経由してSATAにアクセスすることができます。

図1 特電SATA IPコアとホストラッパ
ターゲットボードとの接続
? EXPARTAN-6Tの側面にあるSATAコネクタに、SATAデバイス(HDD,SSD等)を接続します。
? EXPARTAN-6TのUSBポートに、コントロール用のWindows PCに接続します。
? EXPARTAN-6Tの電源はDC5Vのアダプタを接続します。(基板上のジャンパJ3はオープンにする)
写真1 EXPARTAN-6TとHDD/SSDとの接続
サンプルデザインを動作させるための準備
最初に、下記のURLから無償評価版をダウンロードしてください。
SATA IPコア評価版とサンプルアプリ ダウンロード
EXPARTAN-6T上のSPIフラッシュROMに、上記のアーカイブの中にある"sata-expartan6t-050.bit"を書き込んでください。また、上記の「ターゲットボードとの接続」に従って、EXPARTAN-6Tとターゲットボードを接続し、電源を投入してください。
基板上のLED D1とD2が共に点灯すれば、準備は完了です。
サンプルデザインの使用方法
MS-DOSプロンプトを起動したら、添付されているsatatest.exeを起動してください。
HDD/SSDが接続されていてリンクアップが行われると、HDD/SSDのデバイス IDを取得して表示します。
図2 サンプルプログラムの起動画面
その後、
Enter a command (piord piowr dmard dmawr id reset help ...)
>
と表示されるので、以下のコマンドが使用可能になります。
piord,piowr,dmard,dmawr,power,reset,seek,test,id,init,stat,flush,diag
各コマンドの使用方法は以下のとおりです。
PIOモード・セクタ・リード
表1 PIOセクタリードコマンドの書式
|
書式 |
piord SECNUM COUNT |
|
機能 |
PIOモードでのセクタリードを行います。 |
|
引数 |
SECNUMにはセクタ番号を指定します。 |
|
例 |
piord 0 100 |
図3 PIOセクタリードコマンドの実行結果
PIOモード・セクタ・ライトコマンド
表2 PIOセクタライトコマンドの書式
|
書式 |
piowr SECNUM COUNT TYPE |
|
機能 |
PIOモードでのセクタライトを行います。 |
|
引数 |
SECNUMにはセクタ番号を指定します。 |
|
例 |
piowr 0 rand |
図4 PIOセクタライトコマンドの実行結果
DMAモード・セクタ・リード
表3 DMAセクタリードコマンドの書式
|
書式 |
dmard SECNUM COUNT |
|
機能 |
DMAモードでのセクタリードを行います。 |
|
引数 |
SECNUMにはセクタ番号を指定します。 |
|
例 |
dmard 0 100 |
図5 DMAセクタリードコマンドの実行結果
DMAモード・セクタ・ライトコマンド
表4 DMAセクタライトコマンドの書式
|
書式 |
dmawr SECNUM COUNT TYPE |
|
機能 |
DMAモードでのセクタライトを行います。 |
|
引数 |
SECNUMにはセクタ番号を指定します。 |
|
例 |
dmawr 0 16 seq4 |
図6 DMAセクタライトコマンドの実行結果
電源管理コマンド
表5 電源管理コマンドの書式
|
書式 |
power STATE |
|
機能 |
HDD/SSDの電源状態を調べます。 |
|
引数 |
STATEには、{idle | standby | sleep | check}の何れかを指定します。 |
|
例 |
power sleep |
図7 電源管理コマンドの実行結果
リセットコマンド
表6 リセットコマンドの書式
|
書式 |
reset [hard | srst | command] |
|
機能 |
HDD/SSDのリセットを行います。 |
|
引数 |
hardが指定された場合はハードウェアリセットシーケンスを実行します。 |
|
例 |
reset srst |
図8 リセットコマンドの実行結果
シークコマンド
表7 シークコマンドの書式
|
書式 |
seek SECNUM |
|
機能 |
HDDのヘッドを目的のセクタに移動します。 |
|
引数 |
SECNUMにはセクタ番号を指定します。 |
|
例 |
seek 1234 |
図9 シークコマンドの実行結果
ランダムテストコマンド
表8 ランダムテストコマンドの書式
|
書式 |
test [dma] |
|
機能 |
ランダムなセクタを読み書きし、内容を照合します。 |
|
引数 |
dmaが指定された場合は、DMAモードで読み書きします。 |
|
例 |
test |
図10 ランダムテストコマンドの実行結果
デバイスIDコマンド
表9 デバイスIDコマンドの書式
|
書式 |
id |
|
機能 |
DEVICE IDコマンドを発行し、セクタ数などのパラメータなどを取得します。 |
|
引数 |
なし |
|
例 |
id |
図11 デバイスIDコマンドの実行結果
初期化コマンド
表10 初期化コマンドの書式
|
書式 |
init |
|
機能 |
デバイスの初期化パラメータを設定します |
|
引数 |
なし |
|
例 |
init |
図12 初期化コマンドの実行結果
ステータスレジスタチェック
表11 ステータスレジスタチェックコマンドの書式
|
書式 |
stat |
|
機能 |
シャドウレジスタを読み出します。割り込みフラグもクリアされます。 |
|
引数 |
なし |
|
例 |
stat |
図13 ステータスレジスタチェックコマンドの実行結果
フラッシュコマンド
表12 フラッシュコマンドの書式
|
書式 |
flush |
|
機能 |
未書き込みのデータがあればディスクに書き込みます。 |
|
引数 |
なし |
|
例 |
flush |
図14 フラッシュコマンドの実行結果
自己診断コマンド
表13 自己診断コマンドの書式
|
書式 |
diag |
|
機能 |
HDD/SSDに内蔵された自己診断機能を実行します。 |
|
引数 |
なし |
|
例 |
diag |
図15 自己診断コマンドの実行結果
サンプルデザインの全体構造
このサンプル・デザインの全体構造を図16に示します。
サンプル・デザインは、SATAコア本体と、それをPATA互換にして使いやすくするためのPATA接続ロジック、そしてPHYから構成されます。これらをまとめたものをホストラッパと呼びます。
図16 当サンプルデザインの全体構成図
サンプル・デザインのトップ階層はmain.vhdで提供されます。サンプル・デザインにはホストラッパとUSB接続ロジックの2つのモジュールが含まれます。ホストラッパはVHDLで記述されたソースコードとして提供され、SATAトランシーバとSATA IPコアのインスタンシエーション、およびPATA接続ロジックから構成されます。
このSATAトランシーバは、XILINXの提供するCoreGeneratorを利用して作られたもので、Spartan-6のGTPを活用するモジュールです。このモジュールはソースコードとして提供されています。ユーザはソースコードを編集して、GTPトランシーバのパラメータを調整することができます。また、PATA接続ロジックはホストラッパ中にVHDLのソースコードで記述されています。SATA IPコアはネットリスト(satacore.ngc)で提供されます。
ユーザ・アプリケーションを作成する場合は、ホストラッパをインスタンシエートする形で作ります。ホストラッパのインタフェースはPATAと互換性のある信号を用意しているので、ユーザはホストラッパに対してPATA互換の信号を与えることにり、SATAデバイスにアクセスすることができるようになります。
論理合成ツールはXILINX ISE13.2(以降)を使用します。ISEは無償のWebPACKを使用することができます。
ホストラッパの入出力ポート
ホストラッパの入出力ポートの定義を次の表1に示します。
| 信号名 | バス幅 | 方向 | 説明 |
|---|---|---|---|
|
GTPの接続 |
|||
| refclkp_ip | 入力 | 150MHzの差動クロック入力 | |
| refclkn_ip | 入力 | 150MHzの差動クロック入力 | |
| rxp0_ip | 入力 | SATA0(ホスト)の受信信号 | |
| rxn0_ip | 入力 | SATA0(ホスト)の受信信号 | |
| rxp1_ip | 入力 | SATA1(デバイス)の受信信号 | |
| rxn1_ip | 入力 | SATA1(デバイス)の受信信号 | |
| txp0_op | 出力 | SATA0(ホスト)の送信信号 | |
| txn0_op | 出力 | SATA0(ホスト)の送信信号 | |
| txp1_op | 出力 | SATA1(デバイス)の受信信号 | |
| txn1_op | 出力 | SATA1(デバイス)の受信信号 | |
|
クロック、リセット等 |
|||
| clk75m_o | 出力 |
リカバリクロックを元にした75MHzの出力 |
|
| clk150m_o | 出力 |
リカバリクロックを元にした150MHzの出力 |
|
| Userclk_i | 入力 | ユーザ回路のクロック。PATAインタフェースはこのクロックに同期して動作する | |
| reset_I | 入力 | リセット入力(正論理) | |
| linkup_o | 出力 | 物理層のリンクアップを示す | |
|
Parallel ATA インタフェース |
|||
| pata_csn_I | [1:0] | 入力 | PATAのCS[1:0]#に相当 |
| pata_da_I | [2:0] | 入力 | PATAのDA[2:0]に相当 |
| pata_ddi_I | [15:0] | 入力 | ライトデータ。PATAのDD[7:0]に相当 |
| pata_ddo_o | [15:0] | 出力 | リードデータ。PATAのDD[7:0]に相当 |
| pata_ddir_o | 出力 | DDOからデータが出力される間は'1'になる | |
| pata_intrq_o | 出力 | PATAのINTRQに相当 | |
| pata_dmarq_o | 出力 | PATAのDMARQに相当 | |
| pata_dmackn_I | 入力 | PATAのDMAACK#に相当 | |
| pata_diorn_I | 入力 | PATAのDIOR#に相当 | |
| pata_diown_I | 入力 | PATAのDIOW#に相当 | |
| pata_iordy_o | 出力 | PATAのIORDYに相当 | |
| pata_resetn_I | 入力 | PATAのRESET#に相当するリセット入力(負論理) | |
|
SATAレジスタ (未実装) |
|||
| sata_scr0_o | 出力 | Statusレジスタの値 | |
| sata_scr1_o | 出力 | Errorレジスタの値 | |
| sata_scr1_clr_I | 入力 | エラーレジスタをクリアする | |
| sata_scr2_I | 入力 | Controlレジスタにセットしたい値 | |
| sata_scr2_wr_I | 入力 | コントロールレジスタを更新する | |
|
以下、デバッグ用の信号 (ATAレジスタへの直接アクセスを含む) |
|||
| sata_status_o | [7:0] | 出力 | 各種のステータス(詳細はソースコードを参照) |
| rtfr_int_o | 出力 | 受信した割り込みトリガ信号 | |
| piord_active_o | 出力 | PIO Data Inモードが動作中 | |
| piowr_active_o | 出力 | PIO Data Outモードが動作中 | |
| dmard_active_o | 出力 | DMA Data Inモードが動作中 | |
| dmawr_active_o | 出力 | DMA Data Outモードが動作中 | |
| rtfr_error_o | [7:0] | 出力 | 受信したERRORレジスタの内容 |
| rtfr_seccnt_o | [15:0] | 出力 | 受信したSectorCountレジスタの内容 |
| rtfr_secnum_o | [15:0] | 出力 | 受信したSectorNumberレジスタの内容 |
| rtfr_cyllow_o | [15:0] | 出力 | 受信したCylinderLowレジスタの内容 |
| rtfr_cylhigh_o | [15:0] | 出力 | 受信したCylonderHighレジスタの内容 |
| rtfr_devhead_o | [7:0] | 出力 | 受信したDevice/Headレジスタの内容 |
| rtfr_status_o | [7:0] | 出力 | 受信したStatusレジスタの内容 |
| rtfr_trnscnt_o | [15:0] | 出力 | 受信した転送カウント数(バイト単位) |
| debug_o | [15:0] | 出力 | デバッグ出力 |



















