WB_SDHC - Wishbone SDHC コントローラ
Language
Contents
Parent article: Wishbone コンポーネント
Wishbone SDHC Controller コンポーネント (WB_SDHC) は、Secure Digital (SD)、または Secure Digital High-Capacity (SDHC) storage デバイス(物理的な FPGA デバイスの外部にある)と効率的に通信するためにホストプロセッサを有効にするインターフェースを提供します。通信は、シングルビットのコマンドバスを使用してコントロールする 4 ビットパラレルデータバスです。
WB_SDHC は、Altium Designer で利用できる 32 ビットプロセッサで使用できます。
特徴
- レジスタに基づいたインターフェースを通してコマンドを送信
- FIFO ベースのインターフェースを通してコマンド応答を受信
- 32-bit DMA インターフェースを通してブロック的なデータを送信
- 同じ DMA インターフェースを通して複数のブロック的なデータを受信
- SD の最大クロックスピードはシステム周波数の 1/4 です
- 6.25MByte/s の最大転送スピード(50MHzのシステムクロックに基づいた)
- ファイルシステムを通す最大 Read/Write スピード(TSK3000A を使用して 50MHz でテストしました):
- Read: 5.7MByte/s(使用した SD/SDHC カードに依存)
- Write: 4.5MByte/s(使用した SD/SDHC カードに依存)
- コマンドとデータインターフェース間の CRC
- Wishbone-compliant
利用可能
SDHC Controller コンポーネントは、OpenBus System ドキュメントをアクティブにし OpenBus Palette パネルの Peripherals の項目にあります。
WB_SDHC コンポーネントは、回路図ドキュメントをアクティブにし、インストールフォルダ \Library\Fpga
に保存されている FPGA Peripherals (Wishbone) の統合ライブラリ (FPGA Peripherals (Wishbone).IntLib
) にあります。
ピンの説明
以下のピンの説明は 回路図で使用した時の WB_SDHC コンポーネントについてです。OpenBus System で同じ信号がありますが、抽象的な性質のシステムによりピンレベルの Wishbone インターフェースを非表示にします。外部のインターフェースの信号は、OpenBus System を参照するために使用した親シートシンボルに関連したシートエントリとして利用できます。
現在、作業中です
操作概要
以下の項目では、ターゲットの SD/SDHC コードと通信するための基本的な方法を概説します。
カードの検出と削除
Status レジスタの 2 ビットは、カードを挿入、または変更したかどうか確認するために利用できます:
- ビット 0 は、入力ピン SD_DETECT の状態を反映します。それは、挿入したカードがある場合、1 です。
- ビット 2 は、カードを取り出した場合に設定されます。それは、ソフトウェアからビットへ '1' を書き込むまで '1' のままです。このように、このビットを設定する場合、SD カードを使用する前に再初期化する必要があります。
送信するコマンド
コマンドは、常に 48 ビットからなります。それは、開始ビット('0')、方向ビット (host to card: '1')、6 コマンドビット、32 argument ビット、7 ビット CRC や 停止ビット ('1') を含みます。
コマンドを送信するには以下を行います:
- コマンドを CMD_TXCMD レジスタへ書き込みます
- argument をCMD_TXARG レジスタへ書き込みます
- Control レジスタで CMD_TXENABLE ビットを設定します
- CMD_TXENABLE ビットが Status レジスタから消えるまで待ちます
- CMD_TXBUSY ビットが Status レジスタから消えるまで待ちます
応答の受信
応答は、48、または 136 ビットからなり CRC を含めることができます。常に、方向ビット ('0' も) を開始ビット ('0') で開始し、停止ビット ('1') で終了します。
確実に応答を受信するには、以下のように、送信を設定すると同時に応答を受け取りたいことを示す必要があります:
- コマンドを CMD_TXCMD レジスタへ書き込みます
- argument を CMD_TXARG レジスタへ書き込みます
- CMD_RXSIZE レジスタで応答バイト(CRC 以外)を書き込みます
- Control レジスタで CMD_TXENABLE と CMD_RXENABLE ビットを設定します
- CMD_TXENABLE ビットが Status レジスタから消えるまで待ちます
- CMD_TXBUSY ビットが Status レジスタから消えるまで待ちます
- レシーバのタイムアウトを設定します
- タイムアウトが経過しなかった時、FIFO をチェックし応答をメモリへコピーします。希望の全てのバイトを得た場合、停止します
- タイムアウト、busy、rxempty、CRC をチェックします
メッセージを 136 ビットまで含めることができても、FIFO は 16 バイトを保存するのに十分な大きさです。長いメッセージの 17 バイト目は常に、payload の CRC を含み、WB_SDHC によって削除されます。
送信データ
データ送信は、シングルブロックモードのみで可能です。しかし、SD カードプロトコルは、連続して個々のブロックを送信するために使用できるマルチブロック書き込みコマンドを実行します。 single_block_write
コマンドを使用してデータを送信する必要はありません。
データを送信するには、write_single_block
コマンド (SDMEM コマンド 24) を送信し、通常通り応答を待ちます。それから以下を行います:
- ブロックサイズを SD カード(バイト)の物理的なブロックサイズへ設定します
- データをメモリに保存する場所へ DMA アドレスを設定します
- Control レジスタで DAT_TXENABLE ビットを設定します
- Status レジスタから削除するために DAT_TXENABLE を待ちます
- Status レジスタから削除するために DAT_TXBUSY を待ちます
- overrun と CRC エラーをチェックします
もし、複数のブロックを送信したい場合、ステップ1と2を実行してステップ3から6まで繰り返すより、write_multiple_block
コマンド (SDMEM コマンド 25) を送信し応答を待ちます。それから、transmission_stop
コマンド (SDMEM コマンド 12) を送信します。
送信するデータはカードに従います。新しい read-、または write-cycle を開始する前に、DAT_READY をチェックします。
受信データ
データを受け取る準備ができたら、以下を行う必要があります:
- バッファアドレス(外部メモリ内にある必要があります)を DAT_MEMADR レジスタへ書き込みます
- DAT_BLKSIZE レジスタで、SD カードの物理的なブロックサイズを書き込みます
- DAT_RXSIZE レジスタで、受け取りたいバイト数を書き込みます
- Control レジスタで、DAT_RXENABLE を設定してデータレシーバを与えます
- 送信して、data read コマンド (SDMEM: cmd17、または cmd18) への応答を待ちます
- データタイムアウトを設定します
- タイムアウトが経過せず、Status レジスタの DAT_RXBUSY が設定されていない時、待ちます
- DAT_RXBUSY を設定した場合、それが消えるのを待ちます(そうでないと、タイムアウトエラーとなります)
- 複数のブロックを読んでいる場合、停止メッセージを送ります
- データ CRC と DMA タイムアウト ステータスビットをチェックします
DMA インターフェース
DMA インターフェースは、32 ビット wishbone-compliant マスターバスからなります。それは、20 アドレスビット (19..0) あり、下位 2 ビットは '0' に固定されます。このように、読み込み、書き込みは常に word-wide(MEM_SEL_O[3..0] は '1' に固定されます)で 32 ビットです。コアは、メモリアクセスが big endian であることを想定します。このように、最初にホスト転送へのカードは MEM_DAT_O[31..28] に書き込まれます。2 番目に MEM_DAT_O[27..24] に書き込まれます。これと同調して、カード(MEM_DAT_I[31..28] は最初に送信するために含める必要があります)へ送信するためのデータを準備している時、ホストは big endian 形式を書き込む必要があります。
レジスタインターフェース
Main article: WB_SDHC - Accessible Internal Registers
アドレス | 名称 | 関数 |
---|---|---|
0000 (00h) | CDIV | 10 ビットクロック分周期 |
0001 (01h) | CTRL | コントロールレジスタ |
0010 (02h) | STAT | ステータスレジスタ |
0011 (03h) | CMD_TXCMD | Command transmitter command code |
0100 (04h) | CMD_TXARG | Command transmitter argument |
0101 (05h) | CMD_RXSIZE | コマンドレシーバサイズ |
0110 (06h) | CMD_RXFIFO | コマンドレシーバ FIFO |
0111 (07h) | DAT_BLKSIZE | データブロックサイズ(バイト) |
1000 (08h) | DAT_RXSIZE | データ転送サイズ |
1001 (09h) | DAT_MEMADR | Read/Write 用の DMA アドレス |
1111 (0Fh) | VERSION_INFO | バージョンと設定 |
ソフトウェア プラットフォームサポート
WB_SDHC は、Software Platform でサポートされます。ペリフェラルの全てのレジスタは per_sdhc.h
で記述され、デバイスドライバは drv_sdhc.c
と drv_sdhc.h
で利用できます。そのインターフェースの記述については、オンライン資料をご覧ください。ドライバは、必要に応じて posix Block Device I/O システムへ接続します。このように、posix ファイルシステムを直接、サポートします。
関連したデザインインターフェース コンポーネント
以下の表は、デザインインターフェース コンポーネント(以下へ挿入された SD/SDHC メモリへアクセス、SD/SDHC メモリと通信するために port-plugin ライブラリから配置できる)を要約したものです:
- NanoBoard 3000 シリーズの User FPGA でアクセスできる SD Card リーダー (port-plugin ライブラリ:
FPGA NB3000 Port-Plugin.IntLib
)。
- NanoBoard NB2 (port-plugin ライブラリ:
FPGA PB02 Port-Plugin.IntLib
に取り付けられた Mass Storage ペリフェラルボード(PB02)上にある SD Card リーダー。
Component Symbol | Component Name | Description |
---|---|---|
| SDHC | Secure Digital (SD) カードリーダーへ接続するために、また挿入された SD、または SDHC を書き込み、読み込むためにこのコンポーネントを配置します。 |
リソースの使用
コアは、現在、Xilinx Spartan3 でおおよそ 761 LUTs, 8 デュアルポート 16x1D RAMs と 456 レジスタビットを取り入れます。
サンプルデザイン
SDHC Controller ペリフェラルを使用したサンプルデザインは、以下の Altium Designer のインストールフォルダに含まれています:
sdhc_memory_card.PrjFpg
–\Examples\Soft Designs\Storage\SDHC Memory Card
フォルダに保存されています。