Intel Serial Flash Memory S33 制御モジュール のバックアップソース(No.1)

更新

[[公開メモ]]

* シリアルROMを使った FPGA のコンフィグレーション [#u433174a]

現在、Spartan 3A DSP 1800A Starter Platform を使って計測を行う予定でごりごり開発をしています。

このボードには FPGA のコンフィグレーション用に Intel (現 Numonyx) の S33 
というフラッシュROMが載っているため、当然のようにこれを使いたくなるのですが、
(というか、JTAG 以外のコンフィグレーション方法はこれしかない?)
ROMへのコンフィグレーションデータの書き込みをするためには、
そのためのIPを自分で書かなければならないようで、
苦労した経過をまとめようと思います。

* iMPACT が対応していない? [#d8e6a4ad]

ISE には iMPACT というソフトが入っていて、通常、開発段階ではこのソフトを使って JTAG 
経由で FPGA のコンフィグレーションを行います。

さらに、iMPACT は FPGA のコンフィグレーション用ポートに繋がれたシリアルフラッシュ
ROM への書き込み機能を持っています。

ですから、本来であれば iMPACT を使えば自分でフラッシュROMアクセスのためのIPを
書く必要はないはずだったのですが・・・

今回、実際に iMPACT で書き込もうという段になって気づいたことには、
2010-05-27 の時点での最新版である ISE 12.1 に付属の iMPACT M.53d は、
Spartan 3A DSP 1800A Starter Platform に載っている Numonyx S33 
というチップに対応していないようなのです。

iMPACT のマニュアルによれば Spartan 3A DSP 
経由での書き込みをサポートしているのは以下のデバイスのみで、
実際、iMPACT の Select Attached SPI/BPI ダイアログでも
これ以外のデバイスが一覧に出てきません。

|Numonyx|M25P, M25PE, M45PE|
|Atmel|AT45DB (Rev B, C, and D) |
|Spansion|S25FL032P, S25FL064P, S25FL129P|

Xilinx の forum でも色々書かれていました。~
http://tinyurl.com/393se3s

もし iMPACT で書き込めるのであれば以下の内容はあまり役に立たないのですが、
iMPACT を使って書く方法を自力で発見できなかったので、
しかたなく以下の方針で IP を作りました。

** 書き込めないことはないらしい [#aa9c8a68]

どうやら、FPGA 経由ではなく J10 経由で書き込む方法はあったみたいです。

http://forums.xilinx.com/t5/Xilinx-Boards-and-Kits/spartan-3a-dsp-direct-spi-programming-problem/m-p/21689

試してませんが、こっちの方が楽なのかもしれません。

* Intel S33 について [#v3d1a38d]

現在は Numonyx から供給されているそうです。

データシート:~
http://www.numonyx.com/Documents/Datasheets/314822_S33_Discrete_DS.pdf

今回使う範囲での特徴としては、
- 動作クロックは 68 MHz 以下
- 容量は 64 Mbit = 8 Mbyte
- フラッシュROMなので、書き込み前に消去が必要
- データ消去は64kバイトのセクター毎に行える
- データ書き込みは256バイトのページ毎に行う
- メモリブロックはそれぞれ独立に 100,000 回の書き換えができる
- バルク消去コマンドでチップ全体を消去できる
- 消去や書き込み後はデバイスがビジーになるので、終わるまで次の操作ができない
- 読み出しにはアドレス境界の制限はなく、指定アドレスから順にいくらでも読み出せる
- 読み出しで最終アドレスを越えると、また先頭アドレスからデータ読み出しが続く
- コマンド間は 100 ns あける

とのことです

* アドレス [#s2db9787]

アドレスは常に3バイトで指定します。

64 Mbit は 8 Mbyte で、0x000000 - 0x7fffff までのアドレスを取ります。

セクタは64kバイトなので、各セクタの先頭アドレスは 0x??0000 となります。

ページは256バイトなので、各ページの先頭アドレスは 0x????00 となります。

* コマンド [#kd2bf975]

デバイスにコマンドを送るには、S# ラインを下げた後、
クロックの立ち上がりエッジに同期して以下のデータをやりとりします。

+ 1バイトのコマンド
+ [3バイトのアドレス]
+ [ダミーバイト]
+ [読み書きされるデータ]

([ ] 内はコマンドによりあったり無かったりします)

各バイトは MSB から LSB の順に、クロックの立ち上がりで読み取られます。

コマンドは S# を下げている間だけ有効で、S# を上げると終了します。

データの書き込み、ベリファイ、読み出しを行うのに最低限必要なのは以下のコマンドです。

- Read SR
- Fast Read Data Bytes
- Write Enable
- (Write Disable)
- Sector Erase
- Page Program
- (Clear SR Fail Flags)

* ステータスレジスタの読み出し [#lb26f24e]

消去や書き込みコマンドを送るとデバイスがビジーになるので、
次の操作を行う前にビジー状態が終わるのを待たなければなりません。

このために必要なのがステータスレジスタの読み出しです。

Read SR コマンド (0x05) を送ると、それから S# を上げるまでの間、
デバイスはステータスレジスタの値を送り続けます。

ステータスレジスタのビット 0 がビジーフラグなので、
通常の使い方では書き込み又は消去のコマンドを送った後、
Read SR 0x05 を送り、ビット 0 が 1 の間 S# を下げっぱなしにしておいて、
1 になったら S# を上げて終了する形になります。

https://cacoo.com/diagrams/Id8obrsafby7nBIA

* データの読み出し [#l2e0e89a]

Counter: 14636 (from 2010/06/03), today: 4, yesterday: 2