FC2カウンター FPGAの部屋 2005年09月

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

UCFの書き方5

今回はUCFの書き方3の応用編。というか、3のほうが応用編かもしれないが。。。
クロックが異なるFF(フリップフロップ)の出力を使うにしても、初期化終了通知などで出力がのFFが0から1になって、そのまま電源が切れるまで1のままのことがある。その場合は、入力側は1クロックぐらい、セットアップ時間が足りなくて取りはぐっても問題はない。そういう条件のクロックが異なる出力FF、入力FF間のタイミングは制約が加わっているとうざいので、無視するように指示する。
それがこれ。
INST "controller_inst/dll_reset_cnt[4]" TNM = "CLK_DV_FF";
INST "controller_inst/initial_start" TNM = "CLK_DV_FF";
INST "controller_inst/dll_reset_end" TNM = "TO_CLK_DV_DATA";
INST "controller_inst/initial_startx" TNM = "TO_CLK_DV_DATA";
TIMESPEC "TS_CLK_DV_PATH" = FROM "CLK_DV_FF" TO "TO_CLK_DV_DATA" TIG;

dll_reset_cnt[4]とinitial_startという名前の付いたFFをCLK_DV_FFという名前でグループ化する。
dll_reset_endとinitial_startxという名前のFFをTO_CLK_DV_DATAという名前でグループ化する。
CLK_DV_FFとTO_CLK_DV_DATA間の制約を無視。

あと良く使うのは、MAXDELAYかな?
これはネットの最大遅延時間を指定する。クロックのネットなどに使用することが多い。特に、グローバルバッファがなくなってしまったときに、クロックラインにはこれを指定したほうが良いらしい。チップが大きい(Virtex2-6000)とグローバルバッファを使っていても、クロックの遅延が大きくなるので指定している。しかし、なかなかクロックの遅延が減らない。クロックスキューが出てタイミング違反になってしまう。悩ましい。ともかく、書き方は。
NET "U_ddr_cont_inf/DDR_CONT/clkrx" MAXDELAY=2 ns;

大体使っている制約は書いたが、まだDCMの位置固定などを使用している。(これは、P&Rが使えないやつだから)
相対位置固定や、絶対位置固定なども見たことがあるが、実際に自分で使ったことはない。回路が高速になるとP&Rにお任せでは心もとないので、それらも使うことになりそうである。いよいよフロアプランナー?
(だれか、教えてください。Xilinxのセミナーに行くしかないか・・・。7万5千円位するから高い)
  1. 2005年09月30日 11:47 |
  2. UCFの書き方
  3. | トラックバック:0
  4. | コメント:0

UCFの書き方4

今度はIOB(入出力ポートの回路)に入っている遅延素子の入れ方だ。
セットアップ時間は通常は+の値だが、クロックが遅れてしまうと、セットアップ時間が-の値になってしまうことがある。これでは、ホールド時間が満足せずに値を拾い損なうことがある。これではまずいので、そういうときには、IOBの中にある遅延素子をON,OFFする制約がある。それが、IOBDELAYだ。使用方法。
NET "ad(*)" IOBDELAY = BOTH;
IOBには、入力用FFが入っていて、そのFFでラッチするのがセットアップ時間が一番短くなる。BOTHはIOB入力用FFとIOB外のFFの両方に遅延素子を入れるという制約。IBUFがIOB外のFFだけ、IFDがIOB入力用FFだけに遅延素子を入れるという制約。大体BOTHで使っている。
ちなみに、ディフォルトはNONE(どっちもオフ)である。
  1. 2005年09月28日 17:13 |
  2. UCFの書き方
  3. | トラックバック:0
  4. | コメント:0

UCFの書き方3

今回は自分で便利に使っているやり方を書きます。”こんなことも出来るよ。それよりもっとこんなふうにやれば良いのに。間違っているよ”、ということがあれば、ぜひコメントに書き込みお願いします。
まずは、前回の補足からタイミング制約でクロックの入力ポートに、動作クロックの周期(動作周波数)の制約を書いたが、この制約はDCMの後にも伝播するようだ。つまり、66MHzをクロック入力して、それをDCMに入れて、2倍の133MHzにして、回路に供給したとする。DCMの出力に制約を新たに書かなくても、66MHzのクロックの入力ポートに15nsの制約を書いておけば、DCMが出力したクロックの制約は7.5nsになる。
DDR SDRAMコントローラなどを作ると、沢山のクロックが必要となる。私が作っているのは、PCIバスから66MHzを供給して、それを元クロックとすると、
66MHz、133MHz0度、133MHz90度、133MHz180度、133MHz270度、133MHzの受信用、133MHzの16分周、位相シフト用
の8種類使用している。
特に、133MHzの受信用クロックは動的に位相をシフトしているので、他のクロックとの位相関係が静的にはわからない。従って、他のクロックで動作している回路へデータを渡す場合には、非同期FIFOを使用している。非同期FIFOの入力と出力で違うクロックになるわけだが、異なるクロックで動作し、データを受け渡すFFを制約に加えてしまうと、大幅にタイミング違反になってしまう場合がある。その場合に、受け渡すクロックの間の依存関係は無視するという制約を書く。
それが以下の制約だ。
PIN "U_ddr_cont_inf/DDR_CONT/dynamic_phase_adjustment_inst/bufg_fb.O" TNM = CLK_RX_O;
PIN "U_ddr_cont_inf/DDR_CONT/dcm_module_inst/clk_bufg_inst.O" TNM = CLK_DDR_O;
TIMESPEC TS_IGNORE3 = FROM CLK_RX_O TO CLK_DDR_O TIG;
TIMESPEC TS_IGNORE4 = FROM CLK_DDR_O TO CLK_RX_O TIG;

最初の行は、受信クロックを出力しているbufg(グローバルバッファ)の出力(.O)を使用しているFF全般にCLK_RX_Oという名前をつける。
次に、133MHz0度クロックを出力してるbufgの出力を使用しているFF全般にCLK_DDR_Oという名前をつける。
CLK_RX_OからCLK_DDR_Oへのデータパスのタイミング検出を無視(TIG)する。
CLK_DDR_OからCLK_RX_Oへのデータパスのタイミング検出を無視(TIG)する。
こうすると、非同期FIFOのタイミング検出を無視できるはずである。事実、タイミング違反が無くなった。

制約に関してはもう1回くらい書きたい。
  1. 2005年09月25日 20:00 |
  2. UCFの書き方
  3. | トラックバック:0
  4. | コメント:0

UCFの書き方2

今度は、タイミング制約だ。
一番基本的な制約は、動作周波数である。
制約エディタ(ISE7.1i)でやると一番簡単だ。制約エディタの最初の画面に、クロックはリストされている。右側のPeriodの欄をダブルクリックすると、クロック制約を設定するダイアログが開く。
constraint_editor2.jpg
Clock Signal Definitionの欄にクロック制約を入力することになるが、大体はSpecify Timeの欄に入力することになる。
予定動作周波数の周期をTimeに入力する。この場合は50MHzの予定なので、周期は20nsなので、20と入力。デューティはだいたの場合は50%だろうから、Time HIGHはディフォルトの50でOK。
テキストエディタで見ると制約はこうなる。
NET "clk" TNM_NET = "clk";
TIMESPEC "TS_clk" = PERIOD "clk" 20 ns HIGH 50 %;

今度はセットアップ時間の設定。制約エディタでPortsタブをクリックすると、ポート(入出力ピン)の設定が出来る。当たり前だが入力ポートのみセットアップ時間を設定できる。Pad to Setup欄をダブルクリック。Pad to Setupのダイアログが開く。
constraint_editor3.jpg
Time Requirementの欄にセットアップ時間を入力(20ns)。クロックが複数ある場合は、Relative to Clock Pad Netで関連するクロックを選択。この場合はclkのみ。
テキストエディタで見るとこうなる。
NET "sw<0>" OFFSET = IN 20 ns BEFORE "clk" ;
ちなみにベクタの括弧が<>になっている。UCFの書き方1では、()だったが、これは論理合成ツールによって異なっている。()はSynplify Pro、<>はXST(ISEのディフォルト)。XSTは括弧をプロパティから変更可能。
この後、ベクタに同じセットアップ時間を設定する場合には、テキストエディタで、<*>に変更する。
NET "sw<*>" OFFSET = IN 20 ns BEFORE "clk" ;

今度は、クロックからの出力時間を設定する。同じPortsタブの画面から、Clock to Padをダブルクリック。そうすると、Clock to Padのダイアログが開く。
constraint_editor4.jpg
OFFSETの欄にクロックからの出力時間を設定(20ns)。後は、セットアップ時間と同様。
テキストエディタで見るとこうなる。
NET "seg_out<0>" OFFSET = OUT 20 ns AFTER "clk" ;
これで、タイミング制約の基礎はOK。
次回は、応用編。
  1. 2005年09月25日 10:32 |
  2. UCFの書き方
  3. | トラックバック:0
  4. | コメント:0

UCFの書きかた1

XilinxのFPGAはHDLが書けても、まだ半分しかマスターできたことにならないと思っている。後半分は、制約ファイル(.ucf)だ。これがが書けないと使い物にならないことがある。
制約ファイル(.ucf)は、通常PACEや制約エディタで編集する。入出力ピンはPACEでGUIで編集できる。これはこれでよいが、普通のエディタでも制約ファイルを編集できる。
例えば、一番使うと思われる入出力ピンを指定するのはこのように指定する。
NET "ddr_dq(0)" LOC = "A22";
これは、ddr_dq : inout std_logic_vector(63 downto 0);のうちのビット0をA22ピンに割り当てる指定だ。これはPACEで割り当てるピンをチップの図面へドラックアンドドロップするのと同様だ。
普通のエディタの方が便利ということもある。例えば、入出力バッファのスルーレートをFASTとSLOWに指定できるが、こういうものは、同じグループの全てのピンに指定したい。この時、制約エディタを使うと、1ピンずつの指定となるが、普通のエディタで書くと、*を使ってグループ全部ということを表すことが出来る。例を示すと。
NET "ddr_dq(*)" SLEW = FAST ;
FPGAはいろんなIO入出力レベルをサポートしているので、DDR SDRAMの場合はSSTL IIを指定する必要がある。(ディフォルトはLVTTL)それを指定する方法は、IOSTANDARD = SSTL2_II 。それを前の制約と一緒に書くと、
NET "ddr_dq(*)" IOSTANDARD = SSTL2_II | SLEW = FAST ;
となる。

PACE
xilinx_pace.jpg

制約エディタ
contraint_editor.jpg

  1. 2005年09月24日 09:01 |
  2. UCFの書き方
  3. | トラックバック:0
  4. | コメント:2

Chipscope7.1iの使用法について

以前からずっとChipscopeを使用してきた。Chipscopeとは、いわばFPGAの中にロジック・アナライザを入れて、内部の信号を観察することの出来るツールだ。BGAの信号はプローブで引っ掛けることが出来ないので、観察端子を立てていないと、このようなツールでしか観察することが出来ない。なにたふさんのMITOUJTAGと違うのは、内部のBRAMを信号を保存するバッファとして使用して、動作クロックで起こる信号をサンプル出来るところだ。MITOUJTAGでは、私たちの用途にはスピードが遅すぎる。266MHzでサンプルしてくれれば使えるが。。。
Chipscopeはその代わり、FPGAの残っているBRAM分しか波形を取れない。
Chipscope回路の挿入方法はHDLソースにコアをつなぐ方法と、論理合成したEDFファイルにコアを挿入する方法がある。私は、面倒がない(ソースを変更しなくて良い)ので、信号がなくなることもあるが、EDFファイルにコアを挿入する方法で使用している。
Ver.4のころの使用法は、Chipscope単体で起動して、論理合成ツールの吐いたednファイルにチップスコープの論理回路を追加して、ngoファイルに出力し、それからISEでTranslate, Map, Place & Routeする方法だった。
Ver.5かVer.6のころからは、ISEにChipscopeのcdcファイル(どの信号をプローブするかのマップ)をプロジェクトに追加することが出来るようになったが、以前の方法でやっていた。
ChipscopeをかけるとTranslate, Map, Place & Routeのチェックが外れて、コンパイルしてくださいよとISEが催促する。
Chipscope7.1iからは、この方法は使えなくなったようだ。Chipscope単体で起動して、コアをインサートしてもTranslate, Map, Place & Routeのチェックが外れない。そのままTranslateからRerunすると、1回はChipscopeが入って、Analayzerで波形を見ることが出来るが、2回目からはAnalayzerでコアが認識できないようだ。論理合成からやり直せば大丈夫のようだが、従来の方法では、何かおかしい。
Chipscope7.1iからは、ISEのプロジェクトに入れて使用するのが無難のようだ。

--------------------------
その後、やってみたところISEのプロジェクトに入れても2回目以降は、同じようにだめなようだ。論理合成からやりなおすとOK。いったいどうなっているのだろうか? 継続調査予定。
  1. 2005年09月22日 09:18 |
  2. Chipscope
  3. | トラックバック:0
  4. | コメント:0

チャーリーとチョコレート工場を見に行きました

今日は一番下の娘と一緒に”チャーリーとチョコレート工場”の映画を見に行った。
良く見に行く映画館はインターネットでチケットが購入できる。割引が使えないので、ちょっと高くなるが、チケットを買うのに待つのを考えたら安いもんである。午前中、早い時間に、インターネットで席を購入する。後ろのほうの通路側の席が取れた。娘のおしっこがまめなので、通路側の席がベスト。
午前中に予告がテレビでやっていたので、見てみる。少しはきたいできるかな?
午後、映画館に行ってみると、車の渋滞を覚悟していたが、案外すんなり駐車場に入れた。でも、チケット売り場の行列は外にまで続くほど長い。うちらはチケットを購入しているから、自動発券機で発券してもらえばOK。自動発券機の前には、誰もいなかった。ラッキー。
映画は、チョコレート工場の中の情景などは見ごたえがあって、そこそこ面白かったが、ウンバルンバ人が踊っているところなどをみると、B級の上くらいかなと思った。
こんどは頭文字Dを見たい。これは1人で行くしかないけど。
  1. 2005年09月19日 21:02 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

Windowsインストール

もらったパソコンがどうしてもOSインストールできないので、友達から見てくれとの依頼が来た。
何でも、OSをインストールしても、アプリをインストールしても元に戻ってしまうそうだ。
ググってみると、いくつかそのようなソフトがあるようだ。ドライブシールドとか。そのうちの1つが入っているようだ。
やってみるよと受け取って、やってみたが、FDブート、CDブートでもHDのプロテクトソフトが立ち上がってしまってだめ。
ハードディスクだけ取り出して、他のパソコンのIDEスレーブとして入れてフォーマットしても、Cドライブの内容は消えたが、プロテクトソフトは消えない。
ハードディスクメーカーのツールで、ローレベル・フォーマットをしてみると、何とか消えてくれたようだ。ローレベル・フォーマットについては、ここのサイトに詳しく書いてある。
でも、まだ最初の時になにやらインストールしろと出てくる。ESCを押すと無視できるので、これを無視してWindowsインストールしたら出来た。これで、Windows Updateをして、OpenOffice.orgをインストールしたら、返却することとする。
もうすでに、ケーキをもらっているので、早くやらないと。。。

-----------------------

最初の時になにやらインストールしろと出てくるのは、LANカードのEPROM BIOSのようだ。どうもLANカード2枚入っているので、おかしいと思っていた。手前のLANカードを抜いたら、起動後のメッセージが出なくなった。これでOK。
  1. 2005年09月15日 20:37 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

Virtex2の動的位相シフト覚書

DDR SDRAMコントローラに動的位相シフトを使っているが、使うにあったってのメモ。
Virtex2などのFPGAでは、DCMというクロック・マネージャーが載っている。DCMはクロックの分周、逓倍、位相シフトなどが出来る。スペクトラム拡散も前のユーザーズマニュアルには記述があったが、うまく行かなかったのか、今はキャンセルされている。
DDR SDRAMコントローラを作る場合に、リードの時のサンプルクロックの位相が問題になる。(本当はVirtex4みたいにデータのほうを遅延できれば一番良いのが)
ちょうど良くサンプル出来る位相にクロックをシフトしたいという欲求が当然起こる。そこで、データを出して、(本当はDQSだけど)そのデータがうまくサンプルできるところを動的位相シフトで探るわけである。リードのクロックを位相シフトして行って、うまくリードでき始めた位相とリードできなくなった位相のちょうど真ん中にクロックの位相をロックできれば、うまくリードできるはずである。
DCMの位相シフト範囲はディレイラインの関係上最大+-5nsだそうだ。目的の周波数は133MHzなので、1周期7.5ns、間に合うはずである。
ここで、DCMの動的位相シフトをXilinxのアンサー・データベースから調べる。XilinxのFPGAばかりでもないだろうが、理想と現実の差(バグとも言う)がアンサー・データベースに表現されている。3つ程度ヒット。
1. Virtex-II - DCM 位相シフトの精度について
2. Virtex-II、DCM - 可変位相シフトのタイミング図 (PSEN、PSINCDEC、PSCLK、PSDONE のタイミング パラメータ)
3. Virtex-II/Virtex-II Pro DCM - 位相シフトを可変モードで使用するには、BitGen?オプションを設定し位相シフト範囲を正の値にする必要がある
1はDCMの精度について限界があるよと言っている。2は動的位相シフトのやり方。3が重要で位相シフト範囲を正の値にしろと言っている。
普通は+-5nsなのだが、"bitgen -g Centered_x0y0:0 design.ncd"とやると、+10ns位相シフトするようになるらしい。
アンサーのやり方のうちのPHASE_SHIFT = 128 の場合でやることにした。最初0までディクリメントしてから、255までインクリメントしてデータが受けられるかどうか見ていくので面倒だ。これには理由があって、シミュレーションではこれでやると+5nsだけしか動かないので、うまくシミュレーションできない。そこで、PHASE_SHIFT = 0に書き換えて、シミュレーションするとうまく出来るのである。これは、最後のbitgenコマンドで設定を書き換えているので、上流(VHDLファイルの状態)では+10ns位相シフトするのがわからないためである。でも、DCMのgeneric map見てもそれに該当するものがないので、上流で書けない。(ISE6.3i SP3の場合、7.1iに期待しているがどうだろう?)
次にISEの"Processes for Source"ウインドウの"Generate Programming File"のところをダブルクリックするとbitgenコマンドが実行される。ここのPropertiesを見ても、"-g Centered_x0y0:0"に相当する場所がない。これは、自分でコマンドラインからbitgenを実行しなければいけないことを意味する。
ほかのオプションもすべて入れなくてはいけないので、どうやってオプションが入っているのを見ようか。。。
ISEの"Processes for Source"ウインドウの"Design Entry Utilities"の中に"View VHDL Instantiation Template"というのがある。これをダブルクリックすると今まで、どんなコマンドをどんなオプションで起動してきたかのログが出てきた。
ここで、bitgenのところを見るとプロジェクト名.utというのがbitgenのオプションを書いてあるファイルのようだ。ここに"-g Centered_x?y?:0"を書き込んでやってみると、今までうまく行かなかったのが、まだまだ修正は必要だが、だいぶうまくリードできる様になってきた。やはり、このオプションを入れないと動的位相シフトはだめな様である。
Centered_x?y?と書いたのは、動的位相シフトを行っているDCMをUCFで位置を固定していないため、コンパイル1回ごとに位置が変わってしまうためである。そのたびにFPGA Editorで位置を調べて、その位置を?の部分に入れている。
なお、プロジェクト名.utは、コンパイルのだびに作り直されてしまうので、どっかにコピーしておいて、"Generate Programming File"の時だけプロジェクトがあるフォルダにコピーしている。

-----------------------

ISE7.1iをインストールしてみた。ISE6.3iと同様にプロジェクト名.utを編集して、"Generate Programming File"をしたら、"-g Centered_x?y?:0"が消えていた。ISE7.1iは"Generate Programming File"をする直前に、プロジェクト名.utを書き換えるようだ。
これではできないので、本当に、bitgenをコマンドラインから実行する羽目となった。
また、ISE7.1iのDCMソースにもそれらしいオプションがなかった。がっかり。
そういえば、ISE7.1iはFPGAエディタのデザインが変わっていた。これはこれでいいかも。
  1. 2005年09月09日 13:43 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:0

ハクション大魔王のからくり時計

daimao.jpg

今日、ヤフー・オークションで落札したハクション大魔王のからくり時計が届いた。
子供のころよくハクション大魔王を見ていた。近頃、皮膚科の医者に行くと、ハクション大魔王のからくり時計を見る。これは、ほしいと思っていた。
皮膚科で売ってくれるように交渉しようと思っていたが、もしやと思いヤフー・オークションを見てみると、結構出物があった。
最初に入札したのは、奥久慈に旅行に行ったころで、3000円で入札したが、旅行に行っている間に3100円で落札されてしまった。とてもくやしかった。
2度目は5千いくらになってしまったので、やめ。
3度目は新品だったので、絶対落札するつもりで入札。1万円くらいまで出すつもりだったが、6千いくらで落札。
テレビの上に飾った。時報がハクション大魔王のくしゃみなのがとても良い。満足。。。
DDR SDRAMコントローラにも進展があったが、また後で書くことにする。なかなか他の仕事が忙しくてすすまない。
  1. 2005年09月07日 21:00 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

Webpack ISEとModelSimのインストールマニュアル

今日、MIPSプロセッサの実験が始まりました。一応、順調な滑り出しです。
Xilinx社のFPGA用ツール、Webpack ISEとModelSimのインストールマニュアルを作ったので、よろしければお読みください。どちらもインストールファイルをダウンロードした後で、インストーラーを起動する所から始まります。
ModelSim XEはスターターバージョン、VHDLライブラリを組み込む設定です。ライセンスファイルを申請する所まで、親切に書いてあるつもりです。
Webpack ISE6.3インストールマニュアル
ModelSim XE スターターインストールマニュアル
念のため書いておきますが、これを見たから失敗したと言われても責任はもてません。
  1. 2005年09月02日 18:39 |
  2. シミュレーション
  3. | トラックバック:0
  4. | コメント:0