ハードウェア実験Tips
資料
Xilinx のマニュアル
VHDLでの例とか載ってて便利。その通りに書いて、上手くコンパイル通らないなら、新しいバージョンを参照してね! -- NU-MA
VHDLの書き方とか
もうmodelsimとかの使い方忘れた人用
第4回課題の手順にそって大体の流れを書いときますね。
第三回でやったのに既に忘れていた自分のための覚書でもあったりなかったり
modelsim
1.部品定義ファイル、シミュレーション用ファイル(第四回課題ならそれぞれ8bitスライスアダーの定義ファイルとそれを0~255(1~256)までの全数でチェックするファイル + コンポーネント)などを用意する。
2. modelsim起動 「. ~/bin/use-msim.sh ; . ~/bin/use-ise.sh」を入力してから「vsim &」で起動。
3. プロジェクトを新規に作ってからファイルを全部加えて「Compile All」(右クリックメニュー)
→エラーが起こったらやり直し。コンポーネントとしてフルアダーとか使ってるならそのファイルも一緒にコンパイルしないと通らないので注意。
4. 「Library」タブで表示されるメニューから、「work」の中のシミュレーション用ファイルを選択し、「Simulate」
5.Wave画面を表示して左のウインドウのsimタブ内の中から出力を見たいものを選んでAdd -> To Wave -> All item in region
6.「Run -All」ボタンを押すか下に直にコマンド入力で「run 30ns -all」とかでシミュレーション開始。ボタンで開始した場合は適当に隣のStopボタンで止める。
7.動いたらおめでとうございます。
ise
1. さっきのファイルに加え、top.vhdとか、FPGAとの送受信に必要なファイルを全て用意する。
2. 適当に新しいプロジェクトを生成。
3.「Hierarchy」ウインドウ(左上の)の中で右クリック→Add Sourceでファイルをすべてプロジェクトに突っ込む。
スライスアダーとかのファイルもいる……と思う(未確認)
4.「xc5vlx……」をクリック → Design Utilities → Compile HDL Simulation
そのままコンパイルしても多分通らない。すぐ左にある「Edit Process Property」ボタンをクリック
5.General Optionタブで右の方にスクロールしてくと
「Please Specify」って項目あるんで「Modelsim SE VHDL」を選択。
6.「Compile HDL Simulation」を右クリック&「Run」
7.待つ。
8.コンパイルが通ったら第一段階クリア
9.できたら今度は「Hierarchy」ウインドウで今度はtopを選択&「Generate Programming File」をダブルクリック。 通ったらクリア。
impact
1.FPGAを繋ぐ
2.適当にプロジェクト作成&FPGAが認識されているか確認。 (一個ダメになってるコードがあるっぽいです。ってか多分俺が何かやらかした)
3.top.bitファイルがiseによって生成されているはずなので、それを選択&緑色のチップ(?)みたいなのを右クリックして「Program」 で実行。(ここら辺の細かい手順忘れました……備忘録なのに……)
4.minicomやらで出力を見る。詳しくは第三回の課題ページ。
OCamlでかかれたプログラムが課題ページにありますが、使ってないので謎。
以上。だいたい合ってるはずですが(現在進行形で確かめながら書いてますので)細かいところで間違ってるかもです。
でも大まかな流れは上の通りなはずです。-- TakuyaKuwahara
ちょっとハマりポイント
- ISEのプロジェクトを作成するときに指定するDesign Propertiesを今一度確認してください。
SimulatorにModelsim-SE VHDLを指定した方がうまくいくっぽい -- carbon_twelve
ISEで合成する際に、top.ucfを忘れないようにしてください。-- carbon_twelve
signalとvariable
毎クロックprogram_counterを0~8の変域でインクリメントするサンプル。
signal program_counter : integer := 0; send_msg: process(clk) begin if rising_edge(clk) then program_counter <= program_counter + 1; if program_counter = 9 then program_counter <= 0; end if; end if; end process;
これはダメ。
program_counterの値が更新されるのはこのprocess文を抜けたあとなので、正しい記述の一例としては
signal program_counter : integer := 0; send_msg: process(clk) variable tmp : integer := 0; begin if rising_edge(clk) then V := program_counter + 1; program_counter <= V; if V = 9 then program_counter <= 0; end if; end if; end process;
こんな感じ。
(そもそも program_counter : integer range 0 to 8 と宣言すれば分岐する必要はない?(8の時に+1したら0になることを期待)でも筆者のコード・環境ではそれをしたらバグりました...情報求む) -- fujima
CSCで論理合成
CSCは12コアクラスタです。論理合成も爆速でしょ!ってことでやってみました
ssh -Y kfujima@CSC.is.s.u-tokyo.ac.jp
※ユーザ名は適宜読み替えてね
※-Yオプションは、リモートサーバに対し、ローカルマシン上のX11サーバへのアクセスを許可する?というような意味らしいです
以下通常のインストールと同じです
mkdir hw cd hw wget http://www-hiraki.is.s.u-tokyo.ac.jp:8080/hwex/hwex-sets.tar tar xf hwex-sets.tar cd sets/ise-13.1/ tar xf Xilinx_ISE_DS_Lin_13.1_O.40d.1.1.tar cd ../modelsim-se-6.6d/ ./install.Linux
途中バージョンを選ぶところ?はmodelsim SEなんちゃら(たぶんデフォルト)を選択
cd ../ise-13.1/Xilinx_ISE_DS_Lin_13.1_O.40d.1.1 ./xsetup
※インストールにとても時間がかかる(ディスクアクセスが遅い?)
結果
前々回のビットスライスアダー:貸与PC->90秒、CSC->55秒 今回の浮動小数点加算器 :貸与PC->2分33秒、CSC->1分36秒
さすがに速いですね!正直期待には程遠い感じですが、、、 -- fujima 2011-06-07 07:00:27