ModelSim-AlteraでFPGA入門(1)

研究で使う可能性があるから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.おわりに
これで半加算器としてのシミュレーション終わり.
次は半加算器をモジュールとして全加算器を作成したい.
それが終わったらカウンタとかかな.