2010年09月23日

SDRAMの使い方(メモ)

中華PMPのメモリ換装用に16bit幅のSDRAMを確保した。換装すると 128Mbit の SDRAMが (いくつか)出てくる。

この SDRAM は、どういうことに使えるのだろう?

    プロセッサに付ける -- というのはとりあえずなし。外したわけだし。

    CPLD/FPGA に付ける -- まぁ基本これしかないのだが、FPGA でプロセッサを作るというのはとりあえずなし。理由は上記とおなじような感じがするから。

プロセッサでないものに付けた場合、なにができるか考えてみたのだが、フレームバッファのように定期的に出力するものか、ビデオキャプチャや ロジアナのように定期的に取り込むものしか思いつかなかった。

ここでは、ロジアナを想定して 定期的に取り込めるものなのか検討してみることにする。

    16bit 幅 128Mb SDRAMだから、8M 個もサンプリングできてしまう。こんな 大量にデータを採取できたとして何に役立つのか? という疑問はある。でも まぁデータ量が多いほうが高級そうだから良いのだ。

    あと、うまく作れれば 最高で 166M sps なわけだが、これで充分なのだろうか?

    高速ADC をつなげればオシロも作れる。2ch 欲しいから ADC は 8bit しか選択できない。8bit 80M sps なら秋月で 400円で買える AD9283BRS-80 がある。デジキーで買える あまり高価でない 8bit のものは、ADC08100 , AD9283 で 100Msps 1000円ぐらいのクラス。 無理をしても 200Msps の ADC08200 (1500円ぐらい) が上限。-- まぁ充分といえよう。

    ロジアナとして使った時はどうだろう? FULL スピードの USB でも 48MHz なら充分そうだし、普通の電子工作なら 数十 MHz までで充分なはず。PC 関係の機器は高速すぎてどうせ無理。USB でも HIGH スピードなら 480 bps だし。

    そういえば USB 解析するなら 64 バイトのパケット 100 個分採取するとして 6400 x 8 x 4 で 200K 個ぐらいサンプリングできたら良いかも知れない。-- 余裕があるのは良いことなのだ。

    追記: うまく作れず 166MHz品でも 最高周波数は、133 MHz になった。

まずは、SDRAM は、どういう風に使うものなのかお勉強。

教科書として、128Mb 16bit幅 の SDRAM W9812G6JH のデータシート(pdf)を使う。-- 余ってくる SDRAM がこれなのだ。

参考資料は、XAPP851(日本語,pdf)。-- XAPP851 は、日本語なのが嬉しい。DDR の説明だが SDRAM と全然違うわけでもないので参考になりそう。

コマンド



SDRAM は、クロックの↑で動作する。このタイミングでの /RAS /CAS /WE の組み合わせで動作を指示する。コマンドは以下の 8 つ。

    /RAS /CAS /WE
    LOAD MODE REGISTER L L L
    AUTO REFRESH L L H (Auto refresh or Self refresh)
    PRECHARGE L H L (Deactive row)
    ACTIVE L H H (Select bank / Active row)
    WRITE H L L (Select bank/col , start write)
    READ H L H (Select bank/col , start read)
    BURST TERMINATE H H L
    NOP H H H

おおざっぱに言うと、MODE REGISTER で動作モードを設定。ACTIVE で row(上位アドレス)を設定し、READ/WRITE で col(下位アドレス)とバンクを設定して、READ/WRITE を開始する。... ということらしい。

BURST TERMINATE というのは、連続動作を止めることで、XAPP851 には記載されていない。

たとえば 128Mbit 16bit 幅 SDRAM の場合、row は A0-A11 の 12bit , col は A0-A8 の 9bit 。合計 21bit で 2M のアドレスがある。バンクが 4 つ、16bit 幅だから 16MB (128M bit) 。

モードレジスタは、A0-A11 の 12bit で指定する。



バンクとは何かというと、独立したメモリ。... 4つのメモリがあって、同時に動作させることが出来る。ただしコマンドは同時に 1 つしか指定できないから、クロックをずらして動作させることになる。あと、バンクは独立した信号線 BA0-BA1 で指定する。

READ は、コマンドで指定してから数クロック後にデータが取得できる。 1 回の READ コマンドで、MODE REGISTER で設定したバースト長分のデータが読み込める。シーケンシャルモードでは、1 ページの範囲(= col で指定できる範囲 x bank)で BURST TERMINATE を発行するまで連続して読み込むことも出来る。(最後まで読むと オフセット 0 に戻る。そこで ROW を 切り替えないといけないので途切れることになり 今回の目的には使えない)

バースト長は、1/2/4/8 。

複数のデータの読み込みを複数のバンクで(勝手に)行うと データバスが競合してしまう。競合しないようにコマンドを組み立てないといけない。

あと、PRECHARGE 。これは? Deactive row -- close のようなものらしい。ちなみに、READ/WRITE のときに、A10 を H にすると AUTO PRECHARGE モードになって、明示的に PRECHARGE コマンドを発行しなくて良くなる。

READの概要


READ は、

  • 1. ACTIVE コマンド (ROW と BANK を指定)
  • 2. READ コマンド (COL と BANK を指定)
  • 3. BUERST RERMINATE (シーケンシャルモードのみ)

の手順。ACTIVE コマンドを発行したら、数クロック後に READ コマンドを発行できるようになる。READ コマンドを発行したら 数クロック(CAS レイテンシ)後に(バースト長分連続で)データが出てくる。

バースト長ずらして、違うバンクに対して READ を行うことで途切れなくデータを読み出せる。

シーケンシャルモードのとき、BUERST TERMINATE を指定してもすぐには止められない。次のクロックが最後のデータ。

    今回は使わない想定だが、フレームバッファでは使えるかも知れない。COL 9bit(512) x 4 bank = 2048 の 16bit データが 連続で出てくる。

WRITEの概要


WRITE は、

  • 1. ACTIVE コマンド (ROW と BANK を指定)
  • 2. WRITE コマンド (COL と BANK を指定)
  • 3. PRECHARGE コマンド

の手順。WRITE コマンドのときに、最初のデータを指定し、以降バースト長分連続でデータを指定する。データを書き終わったら PRECHAGE コマンドを発行。数クロック後に、次の ROW を指定できるようになる。

あと、REFRESH をどうするか考えなくてはならないが、だいたいはこんなところ。

    使っていないときは、オートリフレッシュモードにしておくのが良さそう。

連続取り込みの設計



8 クロックを 1 周期として考え、バースト長 2 で次のようにすれば良いのではないか?


0 BA0 WRITE BA0 DATA
1 BA0 DATA BA2 ACTIVE
2 BA1 WRITE BA1 DATA
3 BA1 DATA BA3 ACTIVE
4 BA2 WRITE BA2 DATA
5 BA2 DATA BA0 ACTIVE
6 BA3 WRITE BA3 DATA
7 BA3 DATA BA1 ACTIVE

このシーケンスだと、BA0 に注目して見ると WRITE から ACTIVE まで 5 クロック、ACTIVE から WRITE まで 3 クロックある。
これで、SDRAM の仕様を満たすかチェックしないといけないが、OK なら メモリ分連続で書き込むことができる。



    これは、Write のタイミングの一部。tRCD (RAS to CAS delay time) を満たせば良いらしい。データシートでは、166MHz品 が 15ns , 133MHz品 が 20ns。最高周波数で、3 clock 必要。(OK)



    これも、Write のタイミングの一部(CL2)。tWR(Write Recovery time) と tRP(Prechage to Active Command period) を満たす必要がある。tWR は2 clock 。tRP は、166MHz品 で 15ns, 133MHz品で 20ns (最高クロックで 3 クロック) 。-- こういう条件があるから CL3 しか高クロックでは使えない。

    合計 5 クロックだから OK. .. じゃなかった。最後のデータを 書いてからだから 6 クロックになってしまう。

    5 クロックにしないと成り立たないから、最高クロックが 133MHz になる。Write で CL2/CL3 は関係ないと思うが 133MHz に落とすなら CL2 にできるから CL2 にすることにする。

    あと tRC (ROW cycle time - Active to Active Command Period) という条件があり 166MHz品で 60ns 。133MHz 8 クロック(60ns)はぎりぎり OK。



    ついでに READ のタイミング。これも図は CL2 。

    最後のデータの次から ACTIVE を発行できると理解すれば良いようだ。

最高クロックは分かったが、最低クロックはどれぐらいだろう?

    いちいち ACTIVE で ROW を指定しているわけだから、下位アドレスに ROW をもってくれば、最短で一巡できる。一巡したら COL をインクリメントするとして... 一巡する時間を リフレッシュの条件を満たすようにする。

    • W9812G6 は、COL 9 bit ROW 12 bit x 4bank x16bit の128Mb SDRAM。2M x 4 x 2byte = 16MB 。
    • 8 クロックで 1 セットだが、この間 同じ ROW値なのに注意。
    • メモリ全部は使わないという設計なら、最低周波数は落とせる

    4096 の ROW を 一巡するのを 64ms 以内にする。この条件から 512K Hz が最低クロック。(ちなみに このクロックなら 8 秒間 持つ。)

取り込んだデータを取ってくるのはどうしよう。

    AT90USB162(or Mega32u2) を使うとすれば SPI 経由で取り込むことになる。スループットは 200K byte/sec ぐらい。

    これだと最低クロックの条件を満たせないから、途中でリフレシュしないといけない。

      SPI インターフェイスを付けるとして、どうコマンドを発行するか設計しなければならないわけだが、どうせほとんどの時間は IDLE になる。

      (セルフリフレッシュとは別に)、READ 処理のシーケンスにオートリフレッシュを入れれば良いのだろう。

    HIGH speed 対応で パラレル インターフェイスが使える FTDI FT2232H を使うなら 平均 512KHz (1MB/sec) で取り込むのは楽勝だろう。これなら最低クロック クリアのための工夫はいらない。

クロックの切り替えはどうすれば良いのだろう。

    FPGA なら FIFO を作れるから 1 セット分 8 x 16bit 溜ったら 書き込めば良い... それなら途切れないように取り込む必要もなくなる。

    でも、それじゃ、CPLD で作れる可能性がなくなって面白くない。

    ちょっと考えてみたい。

      セルフリフレッシュモードに移行したら、クロックを止められる。

      取り込みも READもしていない時は、 セルフリフレッシュモードに移行することにして、その間にクロックを切り替えれば良さそうだ。


消費電流はどれぐらい?

  • 最初に見たのは W9812G6IH operating current は、166MHz品 120mA, 133MHz品 100mAとなっているのだが、オートリフレッシュでは、これより多い 166MHz品 200mA, 133MHz品 190mA 。
    取り込み中は、PRECHAGE しまくりだから 中間ぐらいのはず。

  • W9812G6JH では、166MHz品で operating current 70mA、オートリフレッシュ 60mA と随分減っている。ただ手持ちは どちらでもない W9812G6PH -- 情報がないので良くわからないのだ。

  • 256Mb/512Mb だと 容量に比例はしないものの もっと増える。
     - 512Mb のリフレッシュは 400mA ぐらい。

  • セルフリフレッシュモードでは、2mA 。

SDRAM の信号線



    ちょっと 他の目的で作ったピンアサインの図を流用。
    これは、512Mb の SDRAM 。128Mb x16 は、A12 だけ NC。


    10 PB16 DCS(SDRAM) → CS#
    11 PB17 RAS(SDRAM) → RAS#
    12 PB18 CAS(SDRAM) → CAS#
    13 PB19 SDWE(SDRAM)/BUFD → WE#
    14 PB20 WE0(SDRAM) → DQML
    15 PB21 WE1(SDRAM) → DQMU
    16 PB24 CKO(SDRAM) → CLK
    17 PB25 CKE(SDRAM) → CKE

    D0-D15 → D0-D15
    A0-A12 → A0-A12
    A13 → BA0
    A14 → BA1


    これは、中華PMP で実際に配線している信号の例

    信号線の本数だけを問題にすると、データ線 16本以外に 23 本。
    DQML/DQMU は共通にでき -1, A12 は 128Mb x16 SDRAM では NC なので -1。
    FPGA(/CPLD) と接続する線は、37本。

FPGA(/CPLD) は何を使う?

    0.5mm ピッチ 100pin の VQ100 の XC3S50A/XC3S200A などはどうだろう? 値段は思ったより安く 50A で 528円。200A でも 1229円。

      Spartan-3A ファミリデータシート(日本語,pdf)を見ると SPI FLASH でも コンフィグできるようだ。詳細は UG332(日本語,pdf)で、見ると M25P をサポートしているが、SST25L/SST25V/MX25/A25L なども使える。これらは A25L080の使い方なんて記事を書いたぐらいで、入手済み (最近も SST25VF032B を 単価 230円で購入)。
       - READ(03h)/FAST READ(0Bh) のコマンド体系なら OK らしい。
       - 必要な容量は、50A が 512kbit 200A が 2Mbit。
       - Spartan-3E も 使えて 100E が 1Mbit/250E が 2Mbit -- だだしちょっと仕様が違う。
      そういえば、以前 RSコンポーネンツのセールで、M25P05(512Kbit) を 単価 20 円で購入していた。テストにしか使えないと思っていたが 50A なら使える!
       - ただし最高クロックは低く 20MHz (SST25VF032B は、READ 25MHz/FAST READ 80MHz)

      本題とは関係ないのだが、付録 FPGA ボードなどは、core 電圧用に 安価な レギュレータを使っている。中華PMP では (3.3V はレギュレータだが) core 電圧用は、バッテリー駆動することもあり例外なく 電圧下降型 DC/DC コンバータ。

      ちょっと 1.8V 用を調べてみたのだが、外付けダイオードが不要な同期整流タイプは、 Torex XC9236 , Fairchild FAN5307 , Semtech SC189 が見つかった。
      いずれもピン配置は同じで

         (1) Vin Lx (5)
      (2) GND
      (3) EN Vout (4)

      自作するならこういうのを使ってみるのも良いかも知れない。

    DWM 付録だといろいろある。が、付録は再入手が難しいかも。



    ちょっと高いがマルツで互換品が販売されているものもある。

    • MFPGA-SPAR3E Spartan-3E(XC3S250E-4VQG100C) ボード 5250円。
       - DWM 2007年7月号付録基板互換
       - XCF02SVO20C搭載済み、80 ピン基板用ピンヘッダー[40ピン×2列]、3端子レギュレータ LM317T、50V 10μF電解コンデンサ(各1個ずつ添付)
    • MFPGA-CYCLONE CYCLONE(EP1C3T100C8N) ボード 5250円。
       - 上記の CYCLONE版
       - EPCS1搭載済み、80 ピン基板用ピンヘッダー[40ピン×2列]、3端子レギュレータ LM317T、50V 10μF電解コンデンサ(各1個ずつ添付)

    できたらそういうものを選択したほうが無難かも知れない。

    あるいは、今でも買える 【FPGA超入門】ディジタル・デザイン・テクノロジNo.1 (LatticeXP2) 2979円 とか。



    あと安いのは、オプティマイズの MAX2 CPLD ボードとMAX2 mini。なんと 1600円(mini 1500円) -- CPLDだからコンフィグROM も不要。FIFO を使わないならこれでも作れるはず。

      実は Cool Runner II 64マクロセル x2 で作れないかと思っている。それは無理かも知れないのだが、これなら作れるだろう。

      mini は、PIC32ボード (2300円) とスタックして使う設計らしい。



    ちなみに、SDRAM が載るピッチ変換ボードは、秋月の AE-SOP-56 200円。

あと本気でロジアナを作るなら クロック生成 とか レベル変換も考えないといけないが、ここでは SDRAM 周りの話題に留めるつもり。実際の回路(含 VHDL)については(進展があれば)別記事にする。

追記: SRAM のように使えるか?

    SDRAM を ランダムアクセスするとしたら、どれぐらいの速度になるのだろう?

    CL3/CL2 で何クロック必要なのか見積もってみよう。

    • WRITE

      COMMAND BUS WAIT-REASON
      0 ACTIVE
      1 IDLE tRCD
      2 IDLE tRCD
      3 WRITE DATA
      4 IDLE tWR
      5 IDLE(AP)
      6 IDLE tRP
      7 IDLE tRP
      8 (次の)ACTIVE

      CL3 だと 8クロック かかる。( CL2 だと 6 クロック。)
    • READ

      COMMAND BUS WAIT-REASON
      0 ACTIVE
      1 IDLE tRCD
      2 IDLE tRCD
      3 READ
      4 IDLE(AP) (CAS Latancy)
      5 IDLE (CAS Latancy)
      6 IDLE DATA
      7 (次の)ACTIVE

      CL3 だと 7クロック かかる。( CL2 だと 5 クロック。)

    実を言うと tRC/tRFC (Row cycle time/Refresh cycle time - Refresh/Active to Refresh/Active Command Period) という条件があって 166MHz品で 60 ns だそうだ。

    結局 tRC/tRFC の条件のほうが厳しいので、

    • 166MHz CL3 で 60 ns (10 クロック)
    • 133MHz CL3 で 60 ns (8 クロック)
    • 100MHz CL2 で 60 ns (6 クロック)

    リフレッシュサイクルを定期的にいれないといけないが、概ね SRAM 程度の速度で使えることになる。-- 10ns とかの 高速 SRAM 並は全然無理。

      FPGA上 の (キャッシュがない)CPU 用メモリとして使う場合、CPU のメモリクロックは最大 16.6 MHz になってしまう。( しかも、リフレッシュのために時々止まるのが前提。)

      AVR のようなアーキテクチャで プログラム用メモリ+RAM に使うとすれば、最大 16.6 MHz で時々 1 クロック止まるものになる。しかも RAM は常に 1 WAITがはいる。

      止めないようにするには、FLASHアクセス と RAMアクセス(or リフレッシュ)を時分割するしかなく CPU クロックが 8.3 MHz まで落ちる。

    SDRAM が得意なのは、バースト転送。無限長なら 10ns 毎にデータを書けるし、(検証してないが)読める。

    常に 連続した 8 つのデータ を読み書きするなら、上記 +7 クロックで済む。

    • 166MHz CL3 で 90 ns (15 クロック)
    • 133MHz CL2 で 97.5 ns (13 クロック)
       - 133MHz でも tRC の条件 に引っかからない

    この前提だと、4倍前後のスループットになる。
    SDRAM を付けるなら、CPU の方も L1 キャッシュ付きにしたいところ。
posted by すz at 18:11| Comment(0) | TrackBack(0) | CPLD
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/40758669
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック