verilog-hdl tutorial (3)
TRANSCRIPT
1
Verilog-HDL 講習会DE0編(3) Verilogの基礎と
論理シミュレーション
12, June, 2013 鹿児島大学 中原 啓貴
2
• ピン配置が面倒くさいので、デフォルトのプロジェクトを読み込みましょう! (DE0に限った事ではないが、Terasic製品はサンプルCD-ROMの プロジェクトを改変するのが楽でお勧め)
DE0付属のCD-ROM ”Demonstrations”内の "DE0_Top"フォルダの ファイル全てを C:¥verilog¥DE0_tutorial_3¥ 内にコピー
DE0_TOP.qpfをダブルクリックしてQuartus IIを起動
3
Pin Plannerを開いてみると ピン配置が終わっている!
4
今回は全加算器を設計します
x_in y_in
carry in
carry out
sum out
半加算器
x_in y_in carry in sum out
carry out
0 0 0 0 0
0 0 1 1 0
0 1 0 1 0
0 1 1 0 1
1 0 0 1 0
1 0 1 0 1
1 1 0 0 1
1 1 1 1 1
SW[0]
SW[1]
SW[2]
LEDG[1]
LEDG[0]
DE0ボードを使うので, スライドスイッチ(SW)と 緑LED(LEDG)に入出力を割当てています
Verilog-HDLを入力
5
ダブルクリック Verilog-HDLの テンプレートが 表示されるので コードを入力
コード入力したら保存を忘れずに!
6
入力するVerilog-HDL
7
module モジュール名( ポートリスト ); ポート宣言 レジスタ宣言 ネット宣言 回路記述 • 組合せ回路 • 順序回路 endmodule
ポート・リスト
ポート宣言
ネット宣言
全加算器の 回路記述部
文の終わりはセミコロン「;」
最初に「module」を書く
最後は「endmodule」を書く
Verilog-HDLの基本構造
半加算器の記述例
8
モジュールとポートの宣言
topmodule_first_verilog
x_in
y_in
carry_in
sum_out
carry_out
モジュール:回路を表現する箱のようなもの ポート:入出力
9
ネット宣言
x_in y_in
carry in
carry out
sum out
半加算器
ネット:回路の様々な構成要素を接続
w1
w3
w2
10
assign文
x_in y_in
carry in
carry out
sum out
半加算器
組合せ回路を記述
w1
w3
w2
11
assign文 (Cont'd)
x_in y_in
carry in
carry out
sum out
半加算器
「~」: NOT 「&」: AND 「^」: EXOR 「~^」: EXNOR 「|」: OR
w1
w3
w2
12
注意! assign 文には演算の優先度がある! 優先度の変更は「()」を使う
assign f = a & b | c;
assign f = a & (b | c);
a b c
b c a f
f
今回はテンプレートを使用
13
モジュール名 ポート宣言は既に記述済み
自分のVerilog-HDLを 最初から読んで、 SW, LEDGの宣言を 探してみよう
論理シミュレーション (RTLシミュレーション)
• テストベンチを記述必要がある!
14
SW[0] SW[1]
SW[2]
LEDG[1]
LEDG[0]
半加算器
w1
w3
w2
テストベンチ(要は更に外側にシミュレーション用の 仮想モジュールをかぶせる)
シミュレータのパス指定 (インストール後に1回行えばよい)
15
デフォルトのインストール先にパスを指定 C:¥altera¥13.0¥modelsim_ase¥win32aloem
"Options"を選択
"EDA Tool Options" を選択
"ModelSim-Altera" のパスを修正
シミュレータの指定 (プロジェクト毎に1回行えばよい)
16
デバイス名(ここではCyclone III)を 右クリックして「Settings...」を選択
17
"EDA Tool Settings"の "Simulation"を選択
"Tool name"で"ModelSim-Altera"を選択
"Format for output netlist"で"Verilog-HDL"を選択
18
合成の実行
クリック
コンピュータ (Quartus II)に I/Oの設定を読み込ませる ために合成を行います。
"Full Compilation was succesful"と 表示されればOK
テストベンチのテンプレート生成
19 「Start Test Bench Template Writer」を選択
テストベンチの読み込み (プロジェクト毎に1回行えばよい)
20
シミュレータ指定と 同じく、Settingsを呼び出し、 "EDA Tool Settings"の "Simulation"を選択
"Compile test bench"にチェックをつけて、 Test Benchesをクリック
テストベンチの読み込み
21
"New"をクリック
"Test bench and simulation files" の File name 内の「...」をクリック
テストベンチを読み込み (デフォルト設定では、プロジェクトを置いている
フォルダ/simulation/modelsim内に 「プロジェクト名.vt」で置いている)
22
テストベンチを選択 (拡張子は「.vt」)
テストベンチ名と トップモジュール名の設定
23
テストベンチ名はプロジェクト名(ここではDE0_TOP)
テストベンチのトップ・モジュール名は テンプレート生成をしていれば 「テストベンチ名」+「_vlg_tst」
”Add”をクリックして プロジェクトに テストベンチを追加
あとは全てOKでよいです。
ModelSim(Altera版)の起動
24
クリック
こんなスプラッシュ ウインドウが起動します...
25 Linarayタブをクリック
"rtl_work"を展開
テストベンチ名を 右クリックして 「Edit」を選択し、 テストベンチを修正します
修正内容
26
initial~begin間に SWの値を記述。
always~endを コメントアウト (「/*」と「 */」で挟む)
27
修正したら保存ボタンをクリック
テストベンチ名を右クリックして「Recompile」を選択 再度、右リックして「Simulate」を選択
シミュレーション波形の追加
28
”Objects”ウインドウで "SW"を展開する
[2],[1],[0]を選択し、 右クリック→「Add Wave」をクリック
"Wave"ウインドウに 波形名が追加される
LEDG[1],[0]も追加しましょう
29
シミュレーションの実行
30 ”run 3ns”と入力し、リターンキーを押す
シミュレーション結果が 波形で表示される!
31
テストベンチは外部へ接続しないので ポート宣言は不要
テスト入力信号宣言(reg 宣言)
テスト出力信号宣言(wire 宣言)
ユーザが記述した モジュール
テスト入力信号初期値
100単位時間遅らせる命令 精度 1ps, 単位時間: 1ns
テストベンチの最初に定義済み
ここにテストベンチを書く
テストベンチの 記述例
(テンプレートと 比較してみよう!)
【余談】Verilog-HDLコードの修正 シミュレーションで不具合が見つかったとき
32
修正したいHDLを右クリック→「Edit」で 開いて修正する 再度右クリックして「Recompile」 Transcript(さっき「run 3ns」と入力したところ) で「restart」→「run **ns」とシミュレーションを 再実行するとよい
33
合成の実行
クリック
Quartus IIに戻って 合成しましょう
"Full Compilation was succesful"と 表示されればOK
34
FPGAをPCに接続し、 電源を入れます 1. ACアダプタを接続
2. USBケーブルを介して PCとFPGAボードを接続
3. 電源スイッチをオン
35
Programmer (書き込みツール)の起動
クリック
36
コンフィギュレーションを開始
USB-Blaster, JTAGモード, Programにチェックを確認
確認したら ”Start”を クリック
Progress に "100%(Successful)" と表示されれば成功
動作確認 シミュレーション結果と一致しましたか?
37
スライドスイッチ(SW0,SW1,SW2)を 動かして, LEDG0, LEDG1が 半加算器として動作するかチェック
38
課題 • 1. 全加算器をFPGAボード上に実現しなさい ‒ LED, スライドスイッチは適切に選択
• 2. 次の回路をシミュレーションする. また, FPGAボード上に実現し, 動作を確認する. この回路は何か?