ラベル SDRAMC の投稿を表示しています。 すべての投稿を表示
ラベル SDRAMC の投稿を表示しています。 すべての投稿を表示

2014年2月23日日曜日

SDRAMCのMachXO2への実装 2

前回、150MHzでSDRAMのクロック系でタイミングエラーが1つ出ていた。
この構成ではクロックと他の信号とのスキューを同程度にしたくて、IOBのODDRXEというDDRレジスタを介してクロック出力していたのだが、このやり方を止めてPLLの出力を直接ピンに出すようにしたところ、タイミングエラーは出なくなった。スキュー調整はPLLの位相設定で行う。

そこで、クロックの上限を探って見たところ、160MHzまではエラー無しで合成できた。

が、しかし、このデザイン(160MHz)をFPGAにロードして動作させてみると、FAILする。
よくよく考えてみれば、実装しているSDRAMのタイミングパラメータは-7 (143MHz)品なので、160MHzはスペックオーバーである。そこで、クロックを140MHzにしてみたところ動作した。また、改めて150MHzを試したところこれも動作した。SDRAMに供給するクロック(下図のCLKOS)の位相は270°にしている。

150MHzは143MHzに対して+4.9%の値なので、動作マージンの範囲なのかも知れない。

動作している様子を動画撮影して、100MHz時と比べてみた。
手前が100MHz動作、奥が150MHz動作である。

ということで、150MHzまでは動作した。  すばらしい!  → MachXO2


2014年2月19日水曜日

SDRAMCのMachXO2への実装

以前このブログで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当たりが上限と考えたほうが良さそうである。少なくとも、私のデザインでは。

2011年11月3日木曜日

SDRAMCのLattice XP2への実装 7

ようやく、ちゃんとした画が映るようになった。


ちゃんとした画がでるようにはなったのだが、Timing解析の結果ではクロック載せ替えの部分でSetup ErrorとHold Errorが若干ある。 これらはfalse pathやmulticycle path指定すればいいとは思うのだが、Diamondでの制約の付け方が資料を見たりもしているのだが、何かよく判らない。 また、RTLを編集してClock位相関係を変えて合成するとTiming Errorはまったく出なくなるのだが、実際の動作は画がでなかったり不安定になったりする。 Timing Error有りだと安定動作、Timing Error無しだと不安定という、よく判らない状態だ。

何んかもやもやした気分だが、SDRAMCの作成はこれで終了としようと思う。

ここまでのRTL一式はいつも通り、
http://www.hi-ho.ne.jp/bravo-fpga/
に置いた。

2011年10月31日月曜日

SDRAMCのLattice XP2への実装 6

一応、画も表示されるようにはなった。



ただし、見ての通りノイズのような線が入る。
そこで、UART経由でSDRAMの画像を吸い上げて見てみたのが下図である。(Cameraの前の人形はどかした。) これを見るとCamera→SDRAMの経路は問題なさそうだ。 まだVIF (line buffer)に問題があるのかも知れない。



考えてみると、去年もこれと似たようなことをしていたなぁ~
態々StarterKit等を使わなくても、本の付録基板でも同様のことはできるということか。

2011年10月30日日曜日

SDRAMCのLattice XP2への実装 5

半田付け作業は終わって動作確認を行っている。



最終的に、FPGAのSystem Architectureの方は下図の様にした。
MPIFを4 portに拡張して、UIF(uart)、CIF(camera)、VIF(vga)、CPU(zumi32)から、DRAMのAccessが出来るようにした。



Memory R/W は問題なさそうだが、SDRAM→VGAの経路に問題があるようでまともに表示されない。 zumiでMemory R/W check programを実行させた結果はOK。 CameraからSDRAMに取り込んだ画像をuart経由で読み出してppm に変換してViewerで確認した結果もOK。 uart経由で画像Dataを書込み、次に読み出して同様にppmに変換してViewerで確認した結果もOKだった。
しかし、vifをenableにしてVGAに出力させると画が出ない。
このvif moduleはDE0でのSDRAMCの動作確認でも使用した物なのでmodule自体に問題は無い筈なのだが??
FPGA内部の帯域も問題無い筈だ。FPGA内部は50MHz, 32bit busなので、50MHz x 4 = 200MByte/sec。 SDRAMはPage切り替えやRefreshがあるので現実的には70%程度として、200M x 0.7 = 140MByte/sec。 一方、vifはVGAでRGB565なので640 x 2 / 25usec = 51MByte/sec。 Cameraは15fpsなのでレートとしてはvifの約半分として合計で51M x 1.5 = 76.8 MByte/sec → 77MByte/sec としても140MByte/sec の半分程度だ。
以下のSimulation波形を見ても十分余裕があるのが判る。





したがって、帯域不足とかそういった問題ではない筈だ。
SDRAMの内容の代わりにColor Barを表示するようにしてみたら、こちらはちゃんと表示された。



したがって、半田付けが失敗している訳ではない。
line bufferか、SDRAMのburst readに問題があるのか?
Simulation上は問題なさそうなんだが。それにDE0での実績もあるし。
う~ん。。。

2011年10月27日木曜日

SDRAMCのLattice XP2への実装 4

電源とパスコンの実装も終わった。



後は部品面で水晶発信器を取り付けたり、若干改造したり・・・
もう一息。

2011年10月26日水曜日

SDRAMCのLattice XP2への実装 3

もう片方の半田付けも終わった。
後は3.3Vの電源とパスコンだ。 続きはまた明日。

2011年10月25日火曜日

SDRAMCのLattice XP2への実装 2

付録基板が入手できたので早速SDRAMの取り付け作業に着手し、片側の半田付けが終わった。



この基板は半田面側にパスコン類が実装されていてSDRAMの下も凸凹しているので、両面テープを何枚も重ね張りして高さを調整した。

2011年10月22日土曜日

SDRAMCのLattice XP2への実装

SD Card Controllerの作成をするつもりで、SD Cardの規格書を読んだりして調べていた。
規格書はSD Association からSimplified Specificationsを入手できる。
https://www.sdcard.org/downloads/pls
その他Internetでも調査した結果、SD Card規格で制御する場合はSD AssociationからLicenseを受ける必要があるが、SPI modeで制御する場合は不要という事が判った。
SPI modeでの制御仕様は規格書を読んだ限りではそれほど難解では無さそうだと感じたのだが、いざRTLを作成する段になってどうにもこうにも気分がのらない。 UART経由とは言え、撮影画像が見れたことで満足してしまったのかも知れない。(自分自身のことなのによく判らん。)

そこで、SD Card Controllerはやる気が起きるまで保留にして、今度はSDRAMCをLattice XP2に実装してみることにした。 XP2のボードはCQ出版社のディジタル・デザイン・テクノロジ No1に付属していた物を使う。 このNo1は今でも購入できるようだ。
http://shop.cqpub.co.jp/hanbai/books/49/49401.html
このボードのうれしいところは144pin のXP2を実装しているお陰で、使える端子数が81本もあるという点だ。お陰で、VGA I/Fも持つことができる。 現状考えているPin Assignmentは以下の通りだ。



一応、RTLの構築と合成は出来た。  Diamond 1.3を使用しているのだがGUIを操作していると異常終了してしまうことが度々あったのには参った。 Linux版だからなのかな??? また、このDiamondはXilinxやALTERAのToolに比べて合成制約やSTAの手段が貧弱な気がしている。使いこなせてないだけかも知れないが。。



次はボードにSDRAMを半田付けして実機で動作確認だ。 動くかな~?

2011年10月7日金曜日

SDRAMCのSpartan3Eへの実装 5

Cameraから画像が撮れるようになった。

Camera→SDRAMまでの経路の動作確認の為にCameraからの画像をSDRAMに書かせ、これをUART経由で吸い上げてppm形式のfileに落として見てみた。

まず、Camera(TCM8230MD)をColor Bar Modeにしてみた。


良さそうだったのでNormal Modeで机上を撮影してみた。


撮影している様子


う~ん、、、いい感じ?

System Architectureはこんな感じにしている。ただし、SDC(SDCARD I/F)はまだ実装していない。また、SDRAMは125MHzでも動作したので現状125MHzで動かしている。


今後はSDCの実装を行うが、FPGAのResourceにはまだ余裕があるので大丈夫だろう。
このFPGA(XC3S250E)は結構入るもんだと思うが、驚嘆すべきはこれが4年前に本の付録だったと言うことだろう。

2011年10月2日日曜日

SDRAMCのSpartan3Eへの実装 4

子基板が出来た。

これはCamera実装側から見たところ


側面からみたところ


これは部品面側


FPGA基板と合体させたところ


側面から見たところ


動作確認はこれからだ。 動くといいな。♪♪

2011年9月28日水曜日

SDRAMCのSpartan3Eへの実装 2

動いた!!

半田付けの結果は、SDRAMの端子ではなくてコネクタ用ランドで半田ブリッジが1箇所あっただけだった。 それを修正後RTLの方はほぼ無修正でいけた。 もちろんSDRAMは100MHzで駆動している。
結構動くもんなんだなーっと感心感心。

これはMemory R/W check programが動作している様子。Memoryの全領域の検査を終える毎にLEDが点滅するのでゆっくりした点滅周期になっている。



Errorになった場合はこの動画のように早い点滅になる。
これは意図的にError状態にして撮影した。



次は子基板を作ろう。

2011年9月25日日曜日

SDRAMCのSpartan3Eへの実装

SDRAMCのSpartan3E(XC3S250E)への実装をしている。
使用する基板は以下のマルツパーツのMFPGA_SPAR3Eというもので、Design Wave Magazine
2007/07 号の付属基板と同じ物だ。この基板にはSDRAMは実装されていないので、当初は子基板
を作ってそちらに実装しようあるいは基板裏面に張り付けようか等考えていたが、結局後者の方法
で行くことにした。



基板裏面のレジストを削除後、カプトンテープを貼り、その上にSDRAMを貼付けた。



以下は配線を終えたところ。線材は0.26mm UEW線を使用している。
半田付け作業はほぼ1年ぶりだったので、0.8mm pitchへの半田付けは少々手こずった。
果たして、動作するんだろうか。 (-_-;;



この基板にはSDRAMの他に CAMERA I/F (TCM8230MD)、I2C I/F、 UART I/F、
SD CARD I/F を持つ。できればVGA I/Fも入れたかったのだが端子数が足りず断念した。
基板コネクタの信号割り当ては以下の通りだ。



さすがに、CAMERA I/FやUART I/F、SD CARDのコネクタをこの基板に付けることは
出来ないので、これらは子基板に実装するつもりだ。

上記写真のような実装の仕方なので、動くかどうか判らないが出来ればSDRAMは100MHz
で動作させたいと考えている。
SD CARD Controller以外のRTLを構築して合成し、Timing violation等出ないことは
確認できた。



ここまでやってきて何だが。
このやり方はちょっと無理があるかも知れない。。。
もうちょっと頑張ってみよう。

2011年9月19日月曜日

SDRAMCのDE0での動作確認 3

SDRAMCをNios II Systemに組込み動作確認を行った。
Altera版SDRAMC(SOPC BuilderのLibraryのSDRAMC)との性能差を見ることが目的なので、
同じSystem構成でDRAMCがAltera版のものと自作SDRAMC版を生成して動作させることにした。
ただし、新しくSystem構成を考えるのは面倒なのでDE0のDemonstration用Designの一つである
DE0_NIOS_SDCARDを基にしたが、Nios IIはEconomy版に変更した。

自作SDRAMCをSOPCのComponentとして登録する手順としてはまず、Avalon-MM用のWrapper moduleを作成し、次にComponent EditorにHDLをAddして信号やInterface等の設定を行った後、FinishするとComponent Libraryに登録されるので、それをSOPC SystemにAddする。



Wrapper moduleの中身であるが、これは下図のようにほぼ信号名の付け直しで済んだ。


自作SDRAMCを組み込んだSystemが出来たので、合成してsof fileを生成後実機に流し込み、
何がしかのProgramを作成して走らせれば実機での動作確認が出来るが、この方法だと感覚的
にしか違いが判らない気がしたのでまずはSimulationで確認することにした。

単純なRead/Writeの確認
まず下図のようなProgramを書いてSimulationしてみた。
このProgramではtext, data, stack等の全てのsectionをonchip_memに配置するようにして、
Programから明示的に読み書きしない限りはSDRAMへのAccessが発生しないようにした。



下図はAltera版SDRAMCのSystemでのSimulation波形だ。
SDRAMへのAccessはもっと近接していると思ったら違った。随分スカスカだ。
objdumpを確認したところ、Nios IIをEconomy版にしたためもあると思うが番地計算で
値を4倍するのに加算命令2回で行う等冗長な命令列になっていた。
(Nios IIはShifterは持ってなかったっけか?)

2011/09/20 追記
後にNios IIプロセッサ・リファレンス・ハンドブック(n2cpu_nii5v1_j.pdf)を参照したところ、
Nios II/eコアは「最大で6クロック・サイクルあたり1つの命令を実行」するらしい。
波形を見る限りでは「最大で6クロック」というより「常に6クロック」という感じだが。。。
一方、Nios II/eは最大200MHzまで動作可能という記述もどっかの資料に書いてあったが、
ということは頑張って200MHzで合成できたとしても実質はその1/6の33.333MHzの性能しか
出ないということのようだ。 Nios II/e は。

下図では、SDRAMへの最初のWriteから最後のReadの完了までで2260nsかかっている。
Altera版SDRAMCはAvalon-MM側も16bitであるのに対してNios IIは32bit busなので、
Avalon-MM MasterとSDRAMC間のTransactionは必ず2回発生する。
この2回のTransactionがどういう間隔で発生するのか興味があった。 WriteはData転送を
行うI/F境界で転送が成立した時点でWrite完了と見做せるので連続的に発生できる筈である。
実際波形を見ても、WriteはBurst的になっている。 Readについても、Avalon-MM I/Fは
Split Transaction型のI/Fなので一々Read Dataの到着を待つ必要はなく連続してRead
要求を発行できる筈だ。が、波形をみるとそうなっていない。 1 Transaction毎にRead Data
の戻りを待っている。 Avalon-MM I/FのMaster があまり工夫されていないのだろう。



下図は自作SDRAMCのSystemでのSimulation波形だ。
上記と同様にWrite開始からRead完了までで1761nsだった。




ただし、波形をみてもわかる通りこの方法の場合、SDRAMへのAccessの占める時間は
僅かなのでこの結果を持って性能差を判断することは適切ではないだろう。
そこで、次に下図のようなProgramで且つこのProgram自体もSDRAM上に配置し、
且つStackやData sectionもSDRAM上に配置した状態で動作させてみた。
この状態の方がより現実的だろう。



実行時間としてはSDRAMのAccessが始まる時点から、Nios IIのInstruction busの
Addressがmain関数の最終番地になるまでを見た。(下図のret命令部)



下図がAltera版SDRAMC SystemのSimulation結果だ。



また、下図が自作SDRAMC SystemのSimulation結果だ。



Altera版の実行時間が2msec、自作版が1msecなので性能差は2倍だ。
ただ、これは自作版の方が性能が良いと見るよりは、むしろ、自作版の方が普通であり
Altera版の方が性能が低いと見るべきだろうと思う。なぜならbus幅が16bitと、
内部の1/2のためThroughputが0.5になってしまっているからだ。
(32bit幅のSDRAMを搭載したSystemでは差はないかも知れないし。。。)
DE0のように16bit幅のSDRAMを搭載したSystemでは、自作SDRAMCのようにSDRAM
 I/F部を倍速で動かすことでThroughput 1.0を保つことは可能なので、要は工夫次第と
いうことだろう。

最後にsofを実機に流し込んで、SDRAMの全領域のR/W check programを走らせて
Errorにならない事を確認した。また、160MHz駆動版(内部80MHz、SDRAM160MHz)
も作成して動作させてみたがこちらも動作した。

ここまでのRTL一式はいつも通り、
http://www.hi-ho.ne.jp/bravo-fpga/
に置いた。

次はこのSDRAMCをSpartan3Eに実装しよう。

ERROR: Failed to spawn fakeroot worker to run ...

なにかと忙しくてなかなか趣味の時間を確保できない。 ...orz  家の開発機のOSはLinux Mintなのだが、最近バージョンを22に更新したところ、myCNC用のpetalinuxをビルドできなくなってしまった。ビルドの途中で ERROR: Failed to spawn ...