FPGAの部屋

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

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。ご利用ください。 http://marsee101.web.fc2.com/index.html

2006年12月

a95d1e5d.jpg


日経エレクトロニクスの組み込み速習キットが12月28日に届きました。
私はマイコンはPSoC以外あまり興味がないのでとりあえず放ってありますが、リアルてタイムOSが載るようになったらやってもいいかな?とも思っています。でも何をさせるかが問題ですね。とりあえずやらせたいことがないです。本誌のトラブルシュートが面白そうなので読んでみようと思っています。
(読んでみましたが本当に初歩的なことで面白くなかったです。)
書くものも書かないといけないしVerilogも勉強したいですが、こういうときは現実逃避してしまうんですよね。

皆さんいつも見ていただいてありがとうございます。来年もどうぞよろしくお願いいたします。来年はVirtex-5も試してみたいと思っています。(基板はありませんが。。。)

ece00b58.png


図の波形はXeonプロセッサのパソコンのPCI66MHz,64bitボードからパソコンのメモリへPCIマスタリードしたときのChipscope波形だ。Tの赤い線のところでREQを出し初めている。ピンクの丸のところでSTOPをアサートして5回分リトライしてから緑の丸のところでデータ転送をしている。
レイテンシは約45クロック×15ns=約675nsだ。こんなものなんだろう。このチップセットはリードのレイテンシは長いがバースト時のスループットは大きいようだ。
もう少し説明するとPCIカード側がREQを出してからGNTが来るのを待ちPCIバスがbusyでなくなったらFRAMEをアサートしてリードを始める。IRDYをアサートしてチップセット側からTRDYがアサートされたらリード完了だがSTOPがアサートされたらデータが用意されていないのでデータ転送しないままアクセスを終了する。(この場合は)その後PCIカード側がもう一度REQを出してリトライする。それが5回繰り返されている。その次のアクセスはチップセット(パソコンCPU)からのPCIターゲットアクセスだ。その後のPCIマスタアクセスでFRAMEをアサートしてリードを始めた後IRDYをアサートした時にチップセットがTRDYを返したのでリードが成立してデータが読めている。

ちなみにこれはChipscope Proで波形を観察している。pcix_ad_inとか書いてあるが、まだPCI66MHz,64bitである。
このようにChipscopeは信号をまとめてバスとして16進で表示することもできる。
やり方は信号を複数選択して右クリックし、"Add to Bus"から"New Bus"を選択するとWaveウインドウの左側にバスになって表示される。それをWaveウインドウにドラック&ドロップするとバスとして見ることができる。
ab7f17d8.png


最近AlteraのFPGAはあまり使っていない。1チップMSXを買ったら使っただろうが買わなかったのでXilinxのみしか使っていない。
今回は諸事情からQuartusⅡを使って見たけどRTL ViewerもXilinxのより洗練されている気がする。使ってみてもいいかなと思っている。
QuartusⅡでのピン割り当ての見方だが、まずはStratixⅡのプロジェクトを作る。
QuartusⅡのFileメニューから"New Project Wizadr..."を選択する。今開いているプロジェクトを閉じても良いか聞いてくるダイアログが開くので”はい(Y)"ボタンをクリック。
8bd9f133.png


New Project Wizard : Introductionダイアログが開く。”Next>"ボタンをクリック。
ea6efed9.png


"New Project Wizard: Directory. Name. Top-Level Entry [page 1 of5]"ダイアログが開く。ダイアログの"What is the working directory for this project?"で右の"..."ボタンをクリックしてフォルダを選択する。
c908db53.png


Select Directoryダイアログが開くので、右のアイコンから”新しいフォルダの作成”を選ぶ。QuartusはISEと違ってプロジェクト作ってもフォルダは作ってくれないようなのでフォルダを新しく作る。
71562f9f.png


”新しいフォルダ”が出来るので名前を"Stratix2_test"に変更して"Stratix2_test"フォルダをダブルクリックして開く。
05b8e5b1.png


"Stratix2_test"フォルダで”開く”ボタンをクリックすると、"New Project Wizard: Directory. Name. Top-Level Entry [page 1 of5]"ダイアログに戻る。"What is the working directory for this project?"にお目当てのフォルダ名が入っている。
06cfc8d7.png


"What is the name of this project?"にプロジェクト名を入れる。ここでは"stratix2_test"と入れると下のフィールドにも同じ名前が入る。ここは終了なので"Next>"をクリック。
2e856a70.png


"New Project Wizard: Add Files [page 2 of 5]"ダイアログが開く。特にHDLのフィアルを指定しなければ"Next>"ボタンをクリック。
42bdc02a.png


"New Project Wizard: Family & Device Settings [page 3 of 5]"ダイアログが開く。Famliyリストボックスから"Stratix Ⅱ"を選択すると”Available devices"リストにStratix Ⅱデバイスがリストされる。WebエディションなのでEP2S15F672が最大なのでこれを選択し、"Next>"ボタンをクリック。
e77f67fc.png


"New Project Wizard: EDA Tool Settings [page 4 of 5]"ダイアログが表示される。設定する項目がないので"Next>"をクリック。(本当にQuartusでプロジェクトを作るならば"EDA simulation tool:"にModelSimを設定したほうが良いと思う)
74fcb1cd.png


"New Project Wizard: Summary [page 5 of 5]"ダイアログが開くので"Finish"ボタンをクリック。
3f244ebc.png


そうするとStratixⅡのプロジェクトが出来る。""Assignments"メニューから"Pins"を選択する。
970c7ec8.png


そうするとPin PlannerとしてFPGAチップのTop Viewが表示される。
31e0a9be.png


更に"View"メニューから"Pin Legend Window"を選択する。
08bf3adf.png


Pin Legendが表示されどのマークがどのピンに対応しているかの対応表が表示される。
2e1126a3.png


これでAltera社のPin Informationに書いてあるのと同様のFPGAのピン配置表が得られる。ただこれはWebエディションだとインストールされていない大きなFPGAのピン配置表は見られないという欠点がある。

IOBの入力用FFを活用する”でDCMを使わないクロックを使いIOB内のFFでデータを受けた。その結果、クロックの遅延のほうが大きくなったのでセットアップ時間は-0.944nsとマイナスになってしまった。下にFPGA Editorでのlvds_rx_clkからBUFGMUXまでの配線とIOB内の配線、Timing Analyzerのタイミング解析結果を示す。(使用しているFPGAはVirtex-2proです)
0b242d20.png


00a70e9d.png


”IOBの入力用FFを活用する”でDCMを使わないクロックを使いIOB内のFFでデータを受けた。その結果、クロックの遅延のほうが大きくなったのでセットアップ時間は-0.944nsとマイナスになってしまった。下にFPGA Editorでのlvds_rx_clkからBUFGMUXまでの配線とIOB内の配線、Timing Analyzerのタイミング解析結果を示す。
b2a53b4c.png


00a70e9d.png


ホールド時間は足りているはずだがプラスの値に戻そうと思った。そこで以前は余計物と思ったIOB内の遅延素子をONにすることにした。前回はディフォルトで入っていたものだ。IOB内の配線とTiming Analyzerのタイミング解析結果を示す。
f5f6f9df.png


6d9d3df6.png


これではセットアップ時間の規格を満足しないのでクロックを遅延して辻褄を合わせることにする。”クロックを遅延する方法”を参考にして受信クロックに遅延を挿入した。LUT3プリミティブではINIT値が不正だとSynplify ProにけられたのでBUFプリミティブを挿入した。VHDL記述を下に示す。(Synplify Proで論理合成した場合)

attribute syn_keep : string;
attribute syn_keep of clk_node: signal is "ture";
attribute syn_keep of clk_delay_1: signal is "true";
attribute syn_keep of clk_delay_2: signal is "true";
attribute syn_keep of clk_delay_3: signal is "true"; 

..........................

    ibufg_inst1 : ibufg port map(
        i => lvds_rx_clk,
        o => rxclk_ibuf
    );
    
    clk_node <= rxclk_ibuf;
    delay1 : buf
        port map(
            o => clk_delay_1,
            i => clk_node
        );
    delay2 : buf
        port map(
            o => clk_delay_2,
            i => clk_delay_1
        );
    delay3 : buf
        port map(
            o => clk_delay_3,
            i => clk_delay_2
        );
        
    bufg_in : bufg port map(
        i => clk_delay_3,
        o => rxclkfb
    );


このVHDL記述を追加してインプリメントするとBUFプリミティブが入っていなかった。Synplify Proに制約ファイルを出力するオプションをつけてもだめだった。それでUCFにネットをKEEPするようにKEEP制約を追加した。

NET "clk_delay_1" KEEP;
NET "clk_delay_2" KEEP;
NET "clk_delay_3" KEEP;


これでクロックにBUFプリミティブを入れて遅延されられるようになった。下にFPGA Editorで見たBUFプリミティブの様子とTiming Analyzerでのタイミング解析結果を示す。
5065b5a0.png


72f7d39c.png


これでセットアップ時間は0.439nsになったので多少FPGAの遅延時間が違っていても大丈夫だろう。
なお、clk_delay_1はIOBの中に統合されてしまったようで外のスライスにはアサインされなかった。(KEEP制約でKEEPしたのはネットなのでclk_delay_1ネットはIOBからの出力ネットとして存在する)
大体ワーストケースの遅延時間はあるがベストケースの値はマニュアルに書いていない。

”Xilinxのウェブセミナで書いた”モジュールごとのパーティションの設定について書いてみようと思う。
プロジェクトは”スパルタン3EスターターキットのLCD表示回路5”で使用したスパルタン3EスターターキットのLCD表示回路を使用する。
プロジェクトを開いてinstrom.vhd(instrom_inst)にパーティションを設定する。PicoBlazeのプログラムだけを変えたときにそこだけ変更してくれれば良いと思ったからである。instrom.vhdを右クリックしてメニューを出し、その中から"New Partition"をクリック。
partition_1_061220.png

そうするとinstrom.vhdのアイコンの横にオレンジ色の循環している矢印がついた新たなアイコンがつく。TOPのVHDLファイルTest_LCD4HexDisp.vhdにもチップの上にオレンジ色の循環している矢印がついた新たなアイコンがつく。
partition_2_061220.png

通常のコンパイルと一緒にProcessesペインでGenerate Programming Fileをダブルクリックしてbitファイルまで生成する。そうすると緑チェックのついたアイコンに変わる。これでインプリメントできたようだ。
aedcd9f7.png


次にinstrom.vhdをほんの少し変更する。コメントをちょっと減らすだけでも良い。
そうするとinstrom.vhdのアイコンだけがオレンジ色の循環している矢印がついたアイコンの状態に戻るので、再度ProcessesペインでGenerate Programming Fileをダブルクリックしてbitファイルまで生成する。そうするとパーティションを設定したinstrom.vhdだけ変更して論理合成インプリメントしてくれる予定だ。これでインプリメントが速くなると良いけど。。。
03baf108.png


更にDesign SummaryのFPGA Design SummaryのDetailed Reportsの各ReportsにPartionのReportが出てくる。例えばSynthesis Reportはこんな感じ。
46bc6d0d.png


最後にPartitionをinstrom.vhdに設定しない時と最初に設定したとき、instrom.vhdだけを変更してそこだけを論理合成する場合の時間をXSTレポートから見てみる。

partitionなしXST 18秒
partitionありXST 25秒
partition設定しVHDLの変更のときのXST 22秒


というわけでPartitionを設定しないほうが論理合成が速いようだ。サンプルが小さいファイルなので有効性は確認できないようだ。オーバーヘッドのほうが大きくなっているのであろう。それにinstrom.vhdはPlcoBlazeのアセンブラが出力するプログラムを初期化で入れたBRAMだけインスタンスしてある特殊なファイルだし。それだけにプログラムを書き換えたときに速くなるとうれしいのだが、もっと大きなプロジェクトで試してみなくてはだめなようだ。
実は最初にDDR SDRAMコントローラのプロジェクトでPartitionを確かめてみようと思ったがプロジェクトにDDRレジスタが入っていると怒られてPartitionを設定できないようだった。DDRレジスタが入っている.vhdファイルにPartitionを設定していなくてもだめだったのでプロジェクトにDDRレジスタが入ってるデザインがあったらだめなのか?
もっと大きなプロジェクトで試してみたいが大きいのはほとんどSynplify Proのプロジェクトなので"New Partition"がハイドされて選択できないようだ。後でXSTに変えてやってみようと思う。

本当にXilinxのISEは人知れず(みんな知っているのかな?)機能が追加されていて探検するのが興味深いツールだと思う。

↑このページのトップヘ