以前このブログでSDR -SDRAMコントローラIPを作り、Spartan3E、Cyclone 3 (DE0)、 Lattice XP2に実装してみた。今回はそのコントローラをMachXO2に実装した。 このブログではメモリコントローラを作成することが多い気がするが、別にメモリコントローラが好きで好きでたまらないという訳でもないし、この分野の専門家でも無く、大容量の記憶領域を得ようとするとどうしてもFPGA外付けのメモリが必要になってしまうのでしょうがない。今回、MachXO2に実装しようとしているのも、目的はMachXO2 Breakout Boardを使ってロジアナもどき(なんちゃってロジアナ)を作りたいからだ。 GPIB IPの動作確認をしている時にバスの全信号を観測したいことが多々あったので、next themeとしてなんちゃってロジアナの作成をやってみることにした。
Breakout BoardへのSDR-SDRAMの実装は以前と同様のやり方で行った。
ちなみに、このBreakout BoardはCommunication Boxに組み込んだ物とは別の個体である。
Breakout Boardは予備の意味もあって3枚程所有している。
使用したSDRAMはISSIの128Mb(16MB) SDRAMでデータ幅は16bitである。
この基板のJ3, J5コネクタの信号は差動信号も考慮した配線になっている。
今回作るのはロジアナで想定している測定対象はGP-IBバス等の不平衡信号ではあるのだが、このJ3,J5の信号を信号入力用ポートとして使えば、色々と想定外の使い方の可能性も出てくる。このため、SDRAM用の信号はJ3,J5とは反対側のJ2,J4の端子を使用している。
RTLの方は以前作成したSDRAMCに若干の変更を加えている。
・ DDR2-SDRAMC等ではシミュレーションのために入出力バッファにSTA(静的タイミング解析)で得た伝搬遅延時間を加えているのだが、以前作成したSDRAMCではそれを行っていなかったので今回から加えることにした。 信号端をバッファモジュールに切り出した。
例えば、入出力バッファ(iobuf)は以下の様に記述している。
上位モジュール ... データ系
上位モジュール ... アドレス、コマンド系
iobufのソースをみて判る通り、モジュール内の遅延時間パラメータの値は0.0としている。SDRAMCはFPGAのハードマクロを使用していないので、各社のFPGAにも容易に実装できる。実際、以前のSDRAMC IP作成時にはXilinx Spartan3E、Altera Cyclone 3、 Lattice XP2に実装して動かした。なので、このモジュール内で特定の遅延時間を書いてしまうと、デバイスや実装が変わる度にその値を書き換えることになってしまい旨くない。そこで、モジュール内の値は0.0とし、テストベンチ側でdefparam文で実際の値を設定するようにした。
これ以外の変更点として、SDRAMの容量を64Mbから512Mbまで対応するようにした。
このSDRAMCを2種類のアーキテクチャで実装してみた。
1つ目
合成は成功、タイミングもMetした。
zumi32にメモリ R/Wチェックプログラムをロードして48時間程走らせてみたが問題なかった。
2つ目は、LFSRによるメモリR/Wモジュールの構成で、DDR3 SDRAMCの時に作ったやつの32bitバス版を作成した。
こちらも合成も成功した。
動作している様子
PC側のプログラムからFPGA内部のpass カウンタとfail カウンタの値をポーリングして表示している。FAIL_Cの値はゼロなのでエラーは検出されていない。
このアーキテクチャでSDRAMの駆動周波数を150MHzにして合成してみたところ、1つだけタイミングエラーとなった。
DRAM_CLK端子の最小パルス幅が9.614nsの為、これを越える周波数は設定できないようである。
無理やりコンフィグデータを生成し、FPGAにプログラムして動かしてみたところ結果は以下の様になった。
まったく駄目という訳ではなく、暫く動いてからFAILする。
ということで、このデバイスでSDRAMを動かす場合は100MHz当たりが上限と考えたほうが良さそうである。少なくとも、私のデザインでは。
0 件のコメント:
コメントを投稿