SDメモリーカードをつなげて FPGAでお手軽ストレージ

特集
SPI 通信コアを実装
第5章
入門 FPGA 評価ボード DE0 と MicroBoard で試せる!
SD メモリーカードをつなげて
FPGA でお手軽ストレージ
横溝 憲治
Kenji Yokomizo
高速大容量ストレージとしては SATA 接続のハード・ディスクが有効ですが,そこまでの容量は必要としない
用途も多いでしょう.容量は数百 M バイト程度でかまわないので,より手軽に接続制御できるストレージとして,
デジタルカメラなどでおなじみの SD カードがあります.ここでは OpenCores で公開されている SPI 通信を使った
SD メモリーカード用 IP コアを使って,FPGA から SD メモリーカードへのアクセス方法を紹介します.
1.SD カードの基礎知識
● 使用するのは SD 規格のカード
SD メモリーカードは,カードの容量の増大に合わ
せて SD,SDHC,SDXC と規格が用意されてきまし
た.アクセス方法は規格によって少し違っています.
今回の利用する IP コアは SD 規格が対象で,SDHC と
SDXC 規格のカードは対象外になります.
SD メモリーカードの通信方式にはパラレル転送
モードと SPI 通信を使う SPI モードが用意されていま
す.前者の利用にはライセンスが必要なので,ライセ
ンスが不要の後者を選択することになります.カード
の形状は SD,miniSD,microSD がありますが,アク
セス方法はどの形状でも同じです.
● SPI 通信の概要
SPI 通信は SCLK(Serial Clock),MISO(Master In
Slave Out),MOSI(Master Out Slave In),SS(Slave
Select)の 4 本の信号を使ったシリアル通信です.SD
メ モ リ ー カ ー ド のSPI モ ー ド 以 外 に, シ リ ア ル
EEPROM や A-D/D-A コンバータなどの通信に広く採
用されています.
SD メモリーカード用 IP コアを使う場合は IP コアが
3.3V
マスタ
FPGA
IPコア
spiCS_n
spiClkOut
spiDataOut
spiDataIn
図1
SS_n
SCLK
MOSI
MISO
スレーブ
SDメモリー
カード
DATA3
CLK
CMD
DATA0
SD メモリーカードの配線接続
SD メモリーカードの SS 信号は負論理(0 でセレクト)なのでサンプル回
路では信号名を SS_n としている.
56
第5章
SPI 通信をコントロールしてくれるので,ここでは詳
細には触れず概略のみ紹介します.図 1 は SPI モード
で SD メモリーカードにアクセスする場合の配線で
す.FPGA がマスタで,SD メモリーカードがスレー
ブになります.SCLK はクロックでマスタが出力しま
す.MOSI は マ ス タ か ら の 送 信 デ ー タ,MISO は ス
レーブからの送信データです.SS 信号はスレーブデ
バイスのセレクト信号でマスタが出力します.SD メ
モリーカードの SS 信号は負論理なので今回のサンプ
ル回路では信号名を SS_n としてあります.
● SPI 通信モード
SPI 通信は待機時の SCLK の値とデータ・ラッチの
タイミングの組み合わせで四つのモード(表 1)があり
ます.SD メモリーカードの SPI 通信は MODE0 で動
作します.図 2 は SD メモリーカードの SPI 通信の波
形です.SS_n が 1 から 0 に変化するとアクセスが開始
します.MODE0 なので送信データが先行して送信さ
れ,その後にクロックが立ち上がり,受信側でデータ
をラッチします.その後にクロックが立ち下がったら
送信データの次のビットを出力します.クロックが停
止して SS_n が 1 になると転送終了です.
● SPI コマンド
SD メモリーカードのコントロールは SPI コマンド
を使用します.表 2 は IP コアで使用する SPI コマンド
で,図 3 は SPI コマンドとレスポンスのフォーマット
です.SPI コマンドは 6 バイトで構成されています.1
バイト目の先頭 2 ビットはスタート・コードで 01 が入
ります.残り 6 ビットはコマンド・インデックスでコ
マンドが指定されます.2 〜 5 バイト目にはコマンド
の引数,6 バイト目は CRC 演算結果が 7 ビット入り,
最後に終了ビットとして 1 を 1 ビット送信します.
SD メモリーカードは SPI コマンドを受信するとコ
マンド・レスポンスを返信します.IP コアを利用す
る場合は,IP コアが転送種類に応じて SPI コマンドを
自動で送信してくれるので,コマンドの内容を指定す
SD メモリーカードをつなげて FPGA でお手軽ストレージ