FC2カウンター FPGAの部屋 2006年02月08日
FC2ブログ

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

FPGAの部屋

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

スパルタン3スタータキットでのISE8.1iのチュートリアル4(シミュレーション編)

やっと今度はシミュレーションだ。
シミュレーションのやり方を説明する前に私の取って置きのシミュレーションしやすいVHDLの書き方を説明しよう。(私のほうがうまくやっていると方ぜひ私に教えてほしい。私はそういう情報を求めている)
まずは、FPGAの動作周波数は50MHzとかだが、シリアルインターフェースやダイナミック点灯、スイッチ入力のようにKHzやHzオーダの入出力をシミュレーションする時に面倒くさい思いをしたことが無いだろうか?
例えば私の回路でのスイッチのサンプリング間隔は5ms、200Hzだが、これは水晶発信器の周波数50MHzの250万倍である。クロック1周期を250万回シミュレーションしないと1つスイッチイネーブルが出ないことになる。これでは気が長いし、ModelSimがメモリを食い尽くしてしまうかもしれない。
そこで、シミュレーションの時のみカウンタの分周比を変えてシミュレーションすると思うが、いちいちVHDLを書き換えるのが面倒である。そこでシミュレーションの時のみVHDLファイルを書き換えないで、小さい分周比に出来ると便利である。
私はそれをpragmaで実現している。
LedTest.vhdの152行目から155行目までの

-- pragma translate_off
generic map(
clk_frequency => 1)
-- pragma translate_on


と165行目から168行目までの

-- pragma translate_off
generic map(
clk_frequency => 4)
-- pragma translate_on


を見てほしい。
-- pragma translate_offでここから論理合成ツールの解釈を停止して、-- pragma translate_onで論理合成ツールの解釈を開始する。つまりその間はシミュレーションツールのみVHDL文を解釈する。
シミュレーションの時はclk_frequencyに1又は4が入るが、インプリメンテーション時はそれが無視されてディフォルトの50000が入る。
という訳で同じファイルでシミュレーションの時とインプリメンテーションの時の分周比を変えることが出来る。それを頭に置いてシミュレーションの結果を見てほしい。

それではProcessesウインドウのModelSim Simulatorを展開してSimulate Behavioral Modelをダブルクリックする。
ISE81i_23_060208.png


ModelSimが立ち上がりコンパイル、シミュレーションしてwaveウインドウで結果を表示する。btnを展開し、Zoom Fullアイコンをクリックしてシミュレーション全体をwaveウインドウに表示してみよう。
ISE81i_24_060208.png


今のままでは一番上のLedTest.vhdのentityでport宣言した信号しか見えない。信号を入れてみよう。Workspace(stracture)ペインでuutをクリックする。そうするとLedTest.vhdでsignal宣言した信号がすべてObjects(Signals)ペインに表示される。そこでcsを選んでみよう。これはステートマシンのcurrent stateだ。これをwaveペインの空いている所にドラックアンドドロップする。sw_enaも同様に入れてみよう。
次にWorkspace(stracture)ペインでssegdispiを展開してfreqdviをクリック。Objects(Signals)ペインからlighting_enaを同様にwaveペインの空いている所にドラックアンドドロップする。
ISE81i_26_060208.png


ピンク〇で囲んだRestartアイコンをクリックするとRestartウインドウが開くのでRestartボタンをクリックするとリスタートする。
ISE81i_27_060208.png


ピンク〇で囲んだRun -Allアイコンをクリックするとシュミレーションを行う。waveタブを押して波形を見ると追加した信号も波形が見える。
ISE81i_28_060208.png


このwaveペインで現在表示している信号をセーブしてみよう。FileメニューからSaveを選ぶと、Save Formatウインドウが開く。ディフォルトのwave.doという名前でセーブしてみよう。OKボタンをクリックする。
ISE81i_29_060208.png


これでwaveに表示する信号名がwave.doファイルにセーブされた。
次に、ModelSimの一番下のTranscriptペインを一番前にしてみるとdo ledtest_tb.fdoと書かれていてledtest_tb.fdoというスクリプトファイルを実行しているのがわかる。
ISE81i_25_060208.png


何らかのエディタでledtest_tb.fdoを見ると

## NOTE: Do not edit this file.
## Autogenerated by ProjNav (creatfdo.tcl) on Wed Feb 08 19:54:12 東京 (標準時) 2006
##
vlib work
vcom -explicit -93 "freqdiv.vhd"
vcom -explicit -93 "b27segdec.vhd"
vcom -explicit -93 "swdiv.vhd"
vcom -explicit -93 "ssegdisp.vhd"
vcom -explicit -93 "LedTest.vhd"
vcom -explicit -93 "ledtest_tb.vhw"
vsim -t 1ps -lib work ledtest_tb
do {ledtest_tb.udo}
view wave
add wave *
view structure
view signals
run -all


こんな感じだ。
vlibでライブラリをつくり、vcomでコンパイル、vsimでシミュレーション開始、viewでwaveウインドウを開けて、add waveでwaveウインドウに信号名を追加、structure、signalsウインドウを開けて、runでシミュレーション開始、という具合である。詳しいことはModelSimのマニュアルを見てほしい。
ledtest_tb.fdoの中のadd wave *do {wave.do}に変更して、名前をledtest_tb.doに変更してセーブしよう。
ModelSimの一番下のTranscriptペインのコマンドラインから"do ledtest_tb.do"とコマンド入力してみよう。
そうすると、もう一度コンパイル、シミュレーションしてくれる。終了したらVHDLソースが右側に表示されているので、waveのタブをクリックしてwaveペインにフォーカスするともう一度シミュレーション波形が見えるはずだ。これはISEでVHDLソースを変更してもその変更がシミュレーションに反映される。
かくして、お手軽にModelSim単体で使用することが出来る。
更にwaveペインの右上の×の隣の○→アイコンをクリックするとundockしてwaveウインドウになるので見るにはそっちが良いだろう。

どうだっただろうか、ためになっただろうか。いろんなコメントをどしどしください。何かもっといい方法があったらぜひ教えてください。皆さんとお話しするのにブログを書いているようなものなのである。
更に書きたいやり方もあるがもう大変になったのでここらでシュミレーション編は終了とする。気力が充実したらインプリメンテーション編を書くことにする。何しろまだこのままではスパルタン3スタータボードで動作しない。
  1. 2006年02月08日 19:06 |
  2. FPGAリテラシー及びチュートリアル
  3. | トラックバック:0
  4. | コメント:2