ソフテックでは今まで組み込みソフトウェア開発のご依頼を多数いただき、マイコンを使用したシステム開発も数多く行ってきました。最近のマイコンシステムは、プログラムの大規模化に伴い、大容量のROM、RAMを必要とするものが増えてきました。マイコン自体も、外部接続ROM、RAMのコントローラ、インタフェースを多数標準搭載する機種が増え、これらを使用する機会は多くなっていると感じます。
今回はマイコンシステムの基礎知識として、特にマイコンによるSRAM(static random access memory)、SDRAM(synchronous dynamic random access memory)制御について簡単に説明したいと思います。
(1) 特徴
・ コマンドなどの概念がなく、アクセス制御がシンプル
・ リフレッシュ(Refresh)、プリチャージ(Precharge)などの操作が不要
・ 多くのマイコンでインタフェースを標準搭載
SRAMの制御に関しては、アドレスバス、データバス以外で使用する制御線が少なく、アクセス制御が簡単かつ高速であることが特徴と言えます。
(2) 端子
16ビットバスのSRAMを例に、各端子の機能について下表に説明します。(マイコンと接続する端子に限定)端子名はメーカーにより多少の違いがあります。
| 端子 |
名称 |
機能 |
| A0 〜 An |
Address |
アドレス入力。RAMサイズによりアドレス線の数nは異なります。一般的には、n = 16〜20です。(16ビットバスの場合、n=16のときはRAMサイズ2Mb、n=20のときはRAMサイズ32Mbとなります) |
| DQ0 〜 DQ15 |
Data input/output |
データ入出力。8ビットバスの場合はDQ7までとなります。 |
| CS# |
Chip select |
デバイスのセレクト信号。本信号がアサート(assert、負論理の場合Low入力)されている期間のみ、他の信号線の入力が有効となります。 |
| WE# |
Write enable |
デバイスへの書き込み許可信号。本信号がアサートされている期間は、ライトサイクルであると認識されます。その逆に、ネゲート(negate、負論理の場合High入力)期間中は、リードサイクルとなります。 |
| OE# |
Output enable |
デバイスからのデータ出力許可信号。本信号がアサートされている期間は、デバイス(SRAM)からのデータ出力が許可されます。通常、本端子はマイコンのRD#端子と接続されます。 |
| LB# |
Lower byte Select |
下位バイトのセレクト信号。本信号がアサートされた状態でリード/ライトを行ったとき、データバスの下位バイトが有効となります。ネゲート期間中は、下位バイトが無効となります。 |
| UB# |
Upper byte Select |
上位バイトのセレクト信号。本信号がアサートされた状態でリード/ライトを行ったとき、データバスの上位バイトが有効となります。ネゲート期間中は、上位バイトが無効となります。 |
|
| 表1. SRAM端子機能 |
(3) リード/ライト時のタイミングチャート
SRAMへのリード/ライトアクセス時におけるタイミングチャート例を下図に示します。マイコン内蔵のSRAMインタフェースには、一般的にプログラマブルウェイト(Programmable
Wait)の挿入機能が具備されています。バスクロックが早すぎて、ノンウェイト(通常、2ステートアクセス)時にSRAM推奨のアクセスタイムを守れない場合は、ウェイトサイクルを挿入してアクセス時間を延ばす必要があります。
 |
| 図1. SRAMリード/ライト アクセスタイミング例(3ステートアクセス) |
(4) マイコン内蔵SRAMインタフェース使用時の注意点
マイコン内蔵のSRAMインタフェースを使用する場合は、CS#、OE#、WE#などの制御線をユーザーが意識して操作する必要はありません。SRAMインタフェース関連のレジスタ設定にのみ注意すればよいことになります。一般的には、以下のようなレジスタ設定が必要です。
・ SRAM接続端子の機能設定(制御線用の端子が兼用端子となっている場合など)
・ SRAMを接続するエリアとデータバス幅の設定
・ プログラマブルウェイトの挿入設定
先のタイミングチャートでも説明したプログラマブルウェイトの挿入設定ですが、レジスタの初期設定では安全のため、ウェイト数が最大に設定されている場合があります。SRAMに限った話ではありませんが、初期設定のままで使用してしまうと無駄なウェイトサイクルが発生し、マイコンCPUの性能を十分に引き出せませんので、必ずSRAMのマニュアルを参照し、ウェイト数の最適化を行ってください。
(1) 特徴
・ クロック同期動作
・ 制御信号の組み合わせによるコマンド動作
・ 複数バンク構成
・ モードレジスタを内蔵 [CAS#レーテンシ(※1)、バースト長(※2)の設定などが可能]
・ リフレッシュ、プリチャージ操作が必要
SDRAMは、クロックに同期して高速に制御が可能なDRAMです。SRAMに比べると、制御線の数が多く、かつコマンドによる制御が必要となるため、操作はだいぶ複雑です。また、DRAMの構造上、データ保持のために、リフレッシュ、プリチャージと呼ばれる操作が必要となります。プリチャージはメモリアクセス時に失った電荷を再充電するための操作、リフレッシュは放電で失った電荷を定期的に再充電するための操作です。
(2) 端子
64MビットSDRAM(1M × 16ビット × 4バンク)を例に各端子の機能について以下に説明します。(マイコンと接続する端子に限定)端子名はメーカーにより多少の違いがあります。
| 端子 |
名称 |
機能 |
| CLK |
Clock |
クロック入力。SDRAMはCLKの立ち上がりエッジで入力信号を取り込みます。 |
| CKE |
Clock enable |
クロックイネーブル信号。本信号がアサートされている期間のみ、クロックが有効となります。 |
| A0 〜 A11 |
Address |
アドレス入力。カラムアドレスとロウアドレスを入力します。また、A10はAP(Auto Precharge)信号として使用されます。 |
| BA0 〜 BA1 |
Bank select address |
バンク入力。バンクのアドレスを指定します。接続端子は、使用するマイコンにより異なりますが、
アドレスバスのA13とA14を接続する場合が多いようです(A1〜A12はカラム/ロウアドレス入力に使用)。 |
| DQ0 〜 DQ15 |
Data input/output |
データ入出力。 |
| CS# |
Chip select |
デバイスのセレクト信号。本信号がアサートされている期間のみ、他の信号線の入力が有効となります。 |
| WE# |
Write enable |
主にデバイスへの書き込み許可信号として使用し、本信号がアサートされている期間は、ライトサイクルであると認識されます。
また、プリチャージコマンド発行の際にも本信号をアサートする必要があります。 |
| RAS# |
Row address strobe |
主にロウアドレス指定信号として使用し、本信号のアサート期間に入力されたアドレスがロウアドレスとなります。
また、プリチャージコマンド発行の際にも本信号をアサートする必要があります。 |
| CAS# |
Column address strobe |
主にカラムアドレス指定信号として使用し、本信号のアサート期間に入力されたアドレスがカラムアドレスとなります。 |
| LDQM# |
Lower data input/output Mask |
下位バイトのセレクト信号。本信号がアサートされた状態でリード/ライトを行ったとき、データバスの下位バイトが有効となります。
ネゲート期間中は、下位バイトが無効となります。 |
| UDQM# |
Upper data input/output Mask |
上位バイトのセレクト信号。本信号がアサートされた状態でリード/ライトを行ったとき、データバスの上位バイトが有効となります。
ネゲート期間中は、上位バイトが無効となります。 |
|
| 表2. SDRAM端子機能 |
(3) SDRAM制御コマンドとモードレジスタ
SDRAMは、SRAMとは異なり、コマンドによる制御を必要とします。コマンドは、主にRAS#、CAS#、WE# など各制御信号のHigh/Lowの組み合わせで構成されます。SDRAM制御におけるコマンド一覧を下表に示します。表に示したコマンドは標準的なもので、このほかにデバイス固有のコマンドを持つ場合があります。マイコン内蔵のSDRAMインタフェースでは、下記コマンドのうち、一部のコマンドのみを使用して動作する場合がほとんどです。
| コマンド |
CKE |
CS# |
RAS# |
CAS# |
WE# |
AP |
説明 |
モードレジスタ設定
(MRS) |
H |
L |
L |
L |
L |
H/L |
SDRAMのモードレジスタを設定します。設定値はA0〜A11に入力します。(表4参照) |
バンクアクティブ
(ACTV) |
H |
L |
L |
H |
H |
H/L |
バンクアドレス(BA0〜BA1)とロウアドレス(A0〜A11)を取り込みます。 |
プリチャージ
(PRE) |
H |
L |
L |
H |
L |
L |
バンクアドレス(BA0〜BA1)で指定されたバンクに対してプリチャージを行います。 |
全バンクプリチャージ
(PALL) |
H |
L |
L |
H |
L |
H |
全バンクに対してプリチャージを行います。 |
リード
(READ) |
H |
L |
H |
L |
H |
L |
カラムアドレス(A0〜A7)を取り込み、リード動作を開始します。 |
オートプリチャージ付きリード
(READA) |
H |
L |
H |
L |
H |
H |
カラムアドレス(A0〜A7)を取り込み、リード動作を開始します。
リード動作終了後には、自動的にプリチャージが行われます。 |
ライト
(WRIT)
|
H |
L |
H |
L |
L |
L |
カラムアドレス(A0〜A7)を取り込み、ライト動作を開始します。 |
オートプリチャージ付きライト
(WRITA)
|
H |
L |
H |
L |
L |
H |
カラムアドレス(A0〜A7)を取り込み、ライト動作を開始します。
ライト動作終了後には、自動的にプリチャージが行われます。 |
リフレッシュ
(REF) |
H |
L |
L |
L |
H |
X |
リフレッシュ動作を実行します。 |
セルフリフレッシュ
(SELF)
|
L |
L |
L |
L |
H |
X |
セルフリフレッシュ動作を実行します。
CKEがLowの間、セルフリフレッシュ動作が継続します。 |
バーストスト
(BST) |
H |
L |
H |
H |
L |
X |
バーストアクセス動作を終了させます。 |
NOP
|
H |
L |
H |
H |
H |
X |
ノーオペレーション。 |
|
| H: High 、L: Low 、X: Don’t care |
| 表3. SDRAMコマンド一覧 |
SDRAMへのアクセスを開始する際、まず初めにモードレジスタの設定を行う必要があります。モードレジスタは、モードレジスタ設定コマンド(MSR)を発行し、アドレスバスからレジスタ設定値を入力することで書き換え可能です。モードレジスタ設定値の一覧を下表に示します。設定値はJEDEC(Joint Electron Device Engineering Council)により標準化されているため、どのメーカーでも共通ですが、上位アドレス(A7〜)はオプション設定とされており、メーカー固有の設定が必要なものもあります。
| 端子 |
設定 |
説明 |
|
A11
A10
|
(予約) |
オプション。通常00を設定します。 |
| A9 |
ライトモード |
オプション。ライト時のバースト動作を設定します。
0:バーストライト(Burst Write)設定
1:シングルライト(Single Write)設定 |
|
A8
A7
|
動作モード |
オプション。通常00を設定します。 |
A6
A5
A4 |
#CASレーテンシ |
リードコマンドを入力してから、データが出力されるまでのレーテンシ値を設定します。
000:予約
001:予約
010:2
011:3
1xx:予約 |
| A3 |
バーストタイプ |
バーストアクセス時におけるアドレス信号のインクリメント方式を設定します。
0:シーケンシャルアクセス(Sequential Access)
1:インターリーブアクセス(Interleave Access) |
|
A2
A1
A0
|
バースト長 |
バーストアクセス時のデータ長を設定します。
000:1(シングル転送)
001:2
010:4
011:8
100:予約
101:予約
110:予約
111:フルページ(A3=0のときのみ) |
|
| 表4. モードレジスタ設定値 |
(4) リード/ライト時のタイミングチャート
SDRAMへのリード/ライトアクセス時におけるタイミングチャート例を下図に示します。
SDRAMアクセスで気をつけなければならない点の一つに、プリチャージ操作があります。SDRAMの場合、一般的に、同一バンクかつ異なるロウアドレスに対し、続けてリード/ライトアクセスを行う際にはプリチャージ操作が必要となります。リード/ライトアクセス後、プリチャージを行わずに同一バンクへのアクセスやリフレッシュ操作を行うと、データ化けを起こす場合があります。
下図のタイミングチャートでは、同一バンクアクセスの際にプリチャージコマンドを発行する場合の制御手順を示しています。
 |
図2. SDRAM シングルリード/ライトアクセスタイミング
|
|
(同一バンク、オートプリチャージなし、CAS#レーテンシ2) |
これに対し、プリチャージコマンドを使用せずにオートプリチャージ付きリード/ライトを発行する方法もあります。(下図参照)この場合、リード/ライト終了後にデバイス内部で自動的にプリチャージが実行されるため、プリチャージコマンドの入力サイクルを省略することができます。
 |
図3. SDRAMシングルリード/ライトアクセスタイミング
|
|
(同一バンク、オートプリチャージ、CAS#レーテンシ2) |
ここで説明したタイミングチャートは一例です。マイコン内蔵のSDRAMインタフェースを使用する場合、マイコンによってそのアクセスの手順には、かなりの違いがあります。オートプリチャージや全バンクプリチャージ(PALL)を使用するもの、プリチャージを使用するものでも、そのタイミングに個性があったりします。
(5) マイコン内蔵SDRAMインタフェース使用時の注意点
SRAMと同様に、マイコン内蔵のSDRAMインタフェースを使用する場合は、ユーザーが意識して制御線を操作する必要はありません。一般的には、SDRAMインタフェースに関連する以下のようなレジスタ設定が必要になります。
・ SDRAM接続端子の機能設定(制御線用の端子が兼用端子となっている場合など)
・ SDRAMを接続するエリアとデータバス幅の設定
・ プログラマブルウェイトの挿入設定
・ SDRAMモードレジスタの設定
・ リフレッシュサイクル(Refresh Cycle)の設定
SRAMと異なる点としては、まず、”モードレジスタの設定”があります。先にも説明したとおり、使用するデバイスに応じてCAS#レーテンシやバースト長を設定します。CAS#レーテンシについては、ほとんどのマイコンでレーテンシ値’2’、’3’の動作をサポートしていますが、バースト長については’1’固定となっている場合も多いため、マイコンのマニュアルを参照して適切に設定する必要があります。
リフレッシュサイクルについても、SDRAMのデータシートを参照し、規定のサイクルを設定します。一般的には、リフレッシュサイクル(タイマのタイムアップ周期)のみ設定すれば、自動的にリフレッシュコマンド(REF)が出力されるようになります。(実際には、PALL+REFの形で出力される場合が多いようです)また、マイコンによっては自身のスリープ(スタンバイ)動作に合わせて、SDRAMをセルフリフレッシュモードに遷移させる機能を具備しているものもあります。
組み込みソフトウェア開発でマイコンに関わったことのある人であれば、SRAMやSDRAMはまず間違いなく一度は触ったことがあると思います。しかし、ここで説明したようなデバイス制御の方法など、詳しくは知らない方も意外と多いのではないでしょうか?マイコンシステムにおいて、これらSRAM、SDRAMインタフェースを含むバスコントローラ周りの設計は、システムの動作速度を左右する重要な部分であり、知っていて損はない知識だと思います。
ここに取り上げた内容は、SRAM、SDRAM制御のごく一部を取り上げた内容になりますので、実際の運用に際しては、マイコンのハードウェアマニュアルやデバイスのデータシートを熟読されることをお勧めします。