EXPARTAN-6T>SATAサンプルデザイン

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モードでのセクタリードを行います。
1セクタ単位で読み出すので比較的低速です。

引数

SECNUMにはセクタ番号を指定します。
COUNTは読み出したいセクタ数です。
COUNTが省略された場合は1セクタが読み出されます。

piord 0 100

図3 PIOセクタリードコマンドの実行結果

 

PIOモード・セクタ・ライトコマンド

表2 PIOセクタライトコマンドの書式

書式

piowr SECNUM COUNT TYPE

機能

PIOモードでのセクタライトを行います。
1セクタ単位で書き込むので比較的低速です。

引数

SECNUMにはセクタ番号を指定します。
COUNTは書き込みたいセクタ数です。
COUNTが省略された場合は1セクタに書き込みます。

TYPEは書き込まれるデータの種類を表し、
 [seq | seq2 | seq4 | rand | zero | file filename]の中から選択します。

seqは1バイト単位でカウントアップする数列です。
seq2は2バイト単位でカウントアップする数列です。
seq4は4バイト単位でカウントアップする数列です。
randは乱数列です。
zeroはすべてをゼロで埋め尽くします。
fileを指定した場合は、ファイルから読み出したデータを書き込みます。

piowr 0 rand
piowr 100 file test.txt

図4 PIOセクタライトコマンドの実行結果

 

DMAモード・セクタ・リード

表3 DMAセクタリードコマンドの書式

書式

dmard SECNUM COUNT

機能

DMAモードでのセクタリードを行います。

引数

SECNUMにはセクタ番号を指定します。
COUNTは読み出したいセクタ数です。
COUNTが省略された場合は1セクタが読み出されます。

dmard 0 100

図5 DMAセクタリードコマンドの実行結果

 

DMAモード・セクタ・ライトコマンド

表4 DMAセクタライトコマンドの書式

書式

dmawr SECNUM COUNT TYPE

機能

DMAモードでのセクタライトを行います。

引数

SECNUMにはセクタ番号を指定します。
COUNTは書き込みたいセクタ数です。
COUNTが省略された場合は1セクタに書き込みます。

TYPEは書き込まれるデータの種類を表し、
 [seq | seq2 | seq4 | rand | zero | file filename]の中から選択します。

seqは1バイト単位でカウントアップする数列です。
seq2は2バイト単位でカウントアップする数列です。
seq4は4バイト単位でカウントアップする数列です。
randは乱数列です。
zeroはすべてをゼロで埋め尽くします。
fileを指定した場合は、ファイルから読み出したデータを書き込みます。

dmawr 0 16 seq4
dmawr 100 file test.txt

図6 DMAセクタライトコマンドの実行結果

 

電源管理コマンド

表5 電源管理コマンドの書式

書式

power STATE

機能

HDD/SSDの電源状態を調べます。

引数

STATEには、{idle | standby | sleep | check}の何れかを指定します。
idleが指定された場合には、アイドル状態(すぐに動作できる状態)に遷移します。
standbyが指定された場合には、スタンバイ状態(低消費電力状態)に遷移します。
sleepが指定された場合には、スリープ状態(最も低い電力状態)に遷移します。スリープ状態から復帰するにはハードウェアリセットを行う必要があります。
checkが指定された場合は、現在の電源状態を調べます

power sleep
power check

図7 電源管理コマンドの実行結果

リセットコマンド

表6 リセットコマンドの書式

書式

reset [hard | srst | command]

機能

HDD/SSDのリセットを行います。

引数

hardが指定された場合はハードウェアリセットシーケンスを実行します。
srstが指定された場合はSRSTビットをONにしたパケットを送信し、リセットを行います。
commandが指定された場合は、リセットコマンドを送信します。
リセットコマンドを実装していないHDD/SSDの場合は失敗してエラーを返します。

reset srst

図8 リセットコマンドの実行結果

シークコマンド

表7 シークコマンドの書式

書式

seek SECNUM

機能

HDDのヘッドを目的のセクタに移動します。

引数

SECNUMにはセクタ番号を指定します。

seek 1234

図9 シークコマンドの実行結果

ランダムテストコマンド

表8 ランダムテストコマンドの書式

書式

test [dma]

機能

ランダムなセクタを読み書きし、内容を照合します。

引数

dmaが指定された場合は、DMAモードで読み書きします。

test
test dma

図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の出力
clk150m_oの2倍速

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] 出力 デバッグ出力

 


© 2015 TokushuDenshiKairo Inc. All rights reserved