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

2011年9月21日水曜日

DE0のSDRAMの動作上限周波数

DE0のSDRAMは160MHzで動作させることが出来ているが、
STAして検討した結果ではそれ以上の周波数でもSetupやHoldは確保できそうな感じだ。
そこで、どの位が上限なのか色々試して見たところ175MHzまでは動作した。
FPGA側は200MHz位まではいけそうなのだが、SDRAMが166MHz品なのでこの位が
限界なのかもしれない。



これはMemory R/W Check Programが動いている様子だ。

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に実装しよう。

2011年9月15日木曜日

SDRAMCのDE0での動作確認 2

前回のblogでclockの位相を同位相にしたと書いたのだが、念のため再度STAしてみた。
前回はclockの時間をTimeQuestのReportPathで、それ以外の信号の時間をReportTimingで
得ていたがこの方法だとclockの時間が分かり辛かった。
そこで、今回は仮想のclockをcreate_generated_clockで生成して、このclockに対するReportTimingを実行してDRAMへのclock、他の信号のtimingを得た。
下図はDRAM_CLKの値で、これから遅延値は5.126-3.101で2.039nsだった。


また、clock以外の信号で最大遅延経路はDRAM_WEとDRAM_DQ[3]で、最小遅延経路はDRAM_CSだった。




Read (DRAM_DQ → capture F/F)の値はReport Pathで調べた。



また、SDRAMのspecは以下の通りだ。

以上の値から計算するのだが、図を書いたり手で計算するのは面倒なので、
下図のようにverilogでprogramを書いてsimulationし波形で確認した。

その結果、holdが仕様を満たしていない(仕様1nsに対して580ps)ことが判明した。


そこで、SDRAMのclockの位相を2.0ns早めるようにした。


DE0に付属しているSDRAMの仕様書はIntegrated Circuit Solutionのものだが、
実際に実装されているのはZentelのA3V64S40ETPG6という166MHz品だ。
仕様書はここから入手できる。 http://www.zentel.com.tw/

そこで上記programで160MHzの場合について計算してみた。
holdは余裕がある。setupも仕様1.5nsに対して1.637nsで大丈夫そうだ。


setup/hold関係は一応問題なさそうだ。
160MHz対応にするためにはこの他にtRCDやtRFC等のtimingの見直しも
必要になるが、とりあえずこれらは現状ままとして合成して実機で動かしてみた。

結果は動作した。
以下の動画はDRAMのR/W check programを実行させている様子だ。


また、以下の動画は同じprogramを100MHzで動かしている様子だ。
160MHzと比較してLEDの点滅が遅いのが解る。


という訳でDE0でSDRAMを160MHzで動作させることが出来た。 やったー!  \(^_^)/

2011年9月11日日曜日

SDRAMCのDE0での動作確認

SDRAMCのRTLが出来上がったのでDE0用にSystemを構築して動作確認を行った。
今回はzumi32の実機動作確認時に文字列をDisplayに表示するRTLを流用して、
DE0用に変更して使用した。
内部動作周波数が50MHzと低いので特に躓くこともなく容易に合成できた。


clock系について、100MHzはSDRAM_CLKに供給用と内部用に分けてSDRAM_CLK
の位相を変えられるようにしたのだが、合成後のSTA(Static Timing Analysis)の値を計算
した結果同位相で問題なさそうだったので結局、同位相にした。



次に以下のようなSDRAMの全領域の読み書き検査Programを作成して1時間程走らせて、
Errorにならないことが確認できた。


次に文字列のbitmapをSDRAMのVRAM領域に展開するProgram(zumi32の実機確認時
に作成したものを若干変更)を動作させてみた。こちらも動作した。


今回のProjectの最終目標は作成したSDRAMCをSpartan3E XC3S250Eに実装することなので、
その作業に移ろうと思うが、その前に、SDRAMC CoreにAvalon I/Fを付けてNios II Systemで
動作させ、SOPC Builderで生成したSDRAMCとの性能差を見ようと思う。
前回のblogに書いたようにSDRAMC単体性能では私のSDRAMCの方が性能は良いはずだが、
Systemに統合した場合にどの程度違いが出るのか是非見てみたい。

2011年5月14日土曜日

DE0のLCDの交換

DE0のLCDは手持ちのほとんど骨董品のような物を使っていたが、
表示濃度が薄すぎて文字が見づらかったので、新しい物に交換した。
このLCDは秋月電子から購入した。


2012.07.17 追記
LCDの出っ張りが気に入らなくて Strawberry-Linuxで販売しているLCD-10862に交換した。


このLCDはバックライトLEDが赤・青・緑あり電流を調節すれば白色発光も出来そうだが、
面倒なので青色だけ使用している。また、DE0の電源がUSBバスパワーのみだとコントラスト
が悪いようだ。接続先がUSB-HUBの場合かPC直結かによっても変わると思うが、
LCD使用時はDE0付属のACアダプターを使った方が良さそうだ。


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

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