研究で使う可能性があるからFPGAをやり始める.
言語はとりあえずVerilog.評価ボードはそのうちDE10 nanoを買うかもしれない.
なお,ここにある情報は2017年4月24日時点のものであり,古くなって使えなくなる可能性が高いので注意.
1.Quartus primeのインストール
このページからダウンロード,インストールを行う.
Quartus PrimeとModelSim,Cyclone V device supportを入れれば大丈夫なはず.
詳細は割愛.
2.プロジェクトの作成
Quartus Primeを開く.
[File]->[New Project Wizard…]から新しいプロジェクトを作る.
プロジェクトの場所と名前を決める.
以後しばらくNext連打.
SimulationをModelSim-Alteraにして,Format(s)をVerilogにする
Finishを押す.
3.ソースファイルの作成
[File]->[New]から[Design Files]->[Verilog HDL File]でVerilogファイルを作成する.
今回は例として半加算器を作成する.
module haddr(clk,in_A,in_B,out,cout); output reg out,cout; input clk,in_A,in_B; always @(posedge clk)begin out<=in_A ^ in_B; cout<=in_A & in_B; end endmodule
作成したらhaddr.vとして保存する.
なお,プロジェクト名とファイル名を一致させない場合は,そのファイルをTop Levelに設定する必要がある.
4.コンパイル
[Processing]->[Start]->[Start Analysis & Synthesis]でコンパイルを行う.
5.テストベンチ作成
[Tools]->[Options]->[General]->[EDA Tool Options]からModelSim-Alteraにパスを設定する.
なお,最後に\を入れないとエラーが発生するらしい.
[Tools]->[Run Simulation Tools]->[RTL Simulation]でシミュレータを起動する.
[Library]タブからworkを展開し,haddrを右クリックし[Create Wave]をクリック
Waveタブに信号が表示されるので,各入力信号を作成する.
各入力信号に対して右クリック,[Edit]->[Wave Editor]->[Create/Modify Waveform]をクリック.
各入力信号を適当に作成する.
今回はclkの周期を短くし常にデータを更新,in_Aの周期をin_Bの2倍にすることで00,01,10,11の4パターンを網羅できるように設定する.
設定し終わるとこのようになる.
[File]->[Export]->[Waveform…]からWaveformを保存する.
保存したらModelSimを閉じる.
6.テストベンチの設定
[Assignments]->[Settings…]->[EDA Tool Settings]->[Simulation]からNativeLink settingsのConpile test benchをクリック.
Newをクリック
Test bench nameにtbと入力する.
File nameから作製したtb.vを選択し,Addをクリック.
設定関係をOK押して全部閉じる.
[Project]->[Add/Remove Files in Project…]からtb.vをプロジェクトに追加する.
[Processing]->[Start]->[Start Analysis & Synthesis]でコンパイルすると,エラーが出る.
エラーメッセージをクリックするとtb.vが開くので,wire reg outとwire reg coutをそれぞれwire outとwire coutに置き換える.
なぜ自動生成で「wire reg 変数名;」という文が生成されるのかは不明.でも「wire 変数名;」にすると直る.不思議.
保存後,再び[Processing]->[Start]->[Start Analysis & Synthesis]でコンパイルする.おそらく成功する.
7.シミュレーション
[Tools]->[Run Simulation Tools]->[RTL Simulation]でシミュレータを起動
エディタを消してWaveタブに切り替える.
最初は平坦な信号しか見えないが,これは縮尺が合っていないため.
虫眼鏡マークで縮尺を調整し,信号を左端の0[ns]あたりを見る.
信号の順番が気に入らないので,ドラッグして入れ替える.
半加算器としてたぶん正しい出力なので,これでOK
8.おわりに
これで半加算器としてのシミュレーション終わり.
次は半加算器をモジュールとして全加算器を作成したい.
それが終わったらカウンタとかかな.