PIC32MXと23LC512をSQIモードで接続
2014年5月10日
Microchipの8ピンSRAMの23LC512は、65536バイトの容量を持つSRAMで、通常はSPI接続で使用する。最高速度が20 MHzであるが、1バイトの読み書き共に、32クロックを要するから、1.6μ秒(0.625 MHz相当)を要することになる。MicrochipのAN1277を見ると、実際にはその1.5倍ほど、2.4μ秒(0.42 MHz相当)ぐらいかかるようだ。この速度では、拙作のKM-Z80 miniの外部メモリーとしては、使えない。
一方、23LC512には、4本のデーターラインを平行して扱う、SQIモードというのがあるので、コレを使えば、4倍速で接続できるようだ。実際、どれぐらいの速度で読み書きできるようになるのか、試してみた。
回路図は以下の通り。ただし、石はPIC32MX120F032B-50Iを使用。抵抗はすべてゼロΩで、キャパシタはすべてセラミックで19・20ピンに繋がっている物は10μF、その他は0.1μFの容量。 UART-OUTには、9600 bpsでシリアル接続を行なう。以前作成した、LPC810用のUSB-シリアル変換器を使った。
テストプログラム(記事の最後でダウンロードが可能)では、まず読み書きの速度を測定。次に65536バイトに乱数表を書き込み、続けて65536バイトの乱数表を読み出し、それらの値が一致することを確認。さらに、ランダムなアドレスに書き込み・読み出しを行なって、同じ値が読み出されるかを確認した。実行結果は、以下の通り。
50 MHz以下の速度での使用を想定しているが、PICをオーバークロックさせて72 MHzまで上げてみても、エラー無く動作することを確認した。1バイトの読み出しは55クロックで、書き込みは46クロックで行える。読み書きの速度は、PICの速度にもよるが、48 MHzで動作せたとすると、それぞれ、1.1μ秒、1.0μ秒となる。
KM-Z80において、Z80 CPUが2 MHzの速度で動いている場合、NOP命令(命令の読み込みに1バイト)の実行に2μ秒であるが、上記SRAM接続で読み込みに1.1μ秒かかっているのは、かなりぎりぎりの線のように思われる。ただし、sequencial readが出来るので、例えば4バイトを一度に読み込んでキャッシュに入れておけば、これの実行はPICが97クロック(2.0μ秒)で済むので(1バイト余分に読み込むのは、14クロック余分にかかるだけ)、何とかなりそうな気がする。
使い方は、sram.hをインクルードし、init_sram()の実行の後に、read_sram8(addr,data)とwrite_sram8(addr.data)を使うだけの簡単なものに仕上がった。
ver 0.5.2は、ここからダウンロードできます。ライセンスは、パブリックドメインとします。
一方、23LC512には、4本のデーターラインを平行して扱う、SQIモードというのがあるので、コレを使えば、4倍速で接続できるようだ。実際、どれぐらいの速度で読み書きできるようになるのか、試してみた。
回路図は以下の通り。ただし、石はPIC32MX120F032B-50Iを使用。抵抗はすべてゼロΩで、キャパシタはすべてセラミックで19・20ピンに繋がっている物は10μF、その他は0.1μFの容量。 UART-OUTには、9600 bpsでシリアル接続を行なう。以前作成した、LPC810用のUSB-シリアル変換器を使った。
テストプログラム(記事の最後でダウンロードが可能)では、まず読み書きの速度を測定。次に65536バイトに乱数表を書き込み、続けて65536バイトの乱数表を読み出し、それらの値が一致することを確認。さらに、ランダムなアドレスに書き込み・読み出しを行なって、同じ値が読み出されるかを確認した。実行結果は、以下の通り。
50 MHz以下の速度での使用を想定しているが、PICをオーバークロックさせて72 MHzまで上げてみても、エラー無く動作することを確認した。1バイトの読み出しは55クロックで、書き込みは46クロックで行える。読み書きの速度は、PICの速度にもよるが、48 MHzで動作せたとすると、それぞれ、1.1μ秒、1.0μ秒となる。
KM-Z80において、Z80 CPUが2 MHzの速度で動いている場合、NOP命令(命令の読み込みに1バイト)の実行に2μ秒であるが、上記SRAM接続で読み込みに1.1μ秒かかっているのは、かなりぎりぎりの線のように思われる。ただし、sequencial readが出来るので、例えば4バイトを一度に読み込んでキャッシュに入れておけば、これの実行はPICが97クロック(2.0μ秒)で済むので(1バイト余分に読み込むのは、14クロック余分にかかるだけ)、何とかなりそうな気がする。
使い方は、sram.hをインクルードし、init_sram()の実行の後に、read_sram8(addr,data)とwrite_sram8(addr.data)を使うだけの簡単なものに仕上がった。
ver 0.5.2は、ここからダウンロードできます。ライセンスは、パブリックドメインとします。