1 - HirokiNakaharaOboe.Net

Verilog-HDL 講習会DE0編(4)
組合せ回路記述
12, June, 2013
鹿児島大学
中原 啓貴
1
先週の復習:全加算器
x_in y_in
x_in
y_in
carry
out
sum
out
carry
in
半加算器
carry sum carry
in
out 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
2
nビット加算器
•  全部の加算器を記述していると面倒!
x0
y0
0
s0
x1
y1
s1
x2
y2
x2 x1 x0
+)y2 y1 y0
-------------s3 s2 s1 s0
s2
s3
3
モジュール
•  共通部分を読出し→記述量を減らす
‒ C言語における「関数」のようなもの
3ビット加算器モジュール
x0
y0
0
s0
x1
y1
x2 x1 x0
+)y2 y1 y0
-------------s3 s2 s1 s0
s1
x2
y2
全加算器モジュール
s2
s3
4
•  ピン配置が面倒くさいので、デフォルト
のプロジェクトを読み込みましょう!
(DE0に限った事ではないが、Terasic製品はサンプルCD-ROMの
プロジェクトを改変するのが楽でお勧め)
DE0付属のCD-ROM
Demonstrations 内の
"DE0_Top"フォルダの
ファイル全てを
C:¥verilog¥DE0_tutorial_4¥
内にコピー
5
DE0_TOP.qpfをダブルクリック
してQuartus IIを起動
Pin Plannerを開いてみると
ピン配置が終わっている!
6
Verilog-HDLを入力
コード入力したら保存を忘れずに!
ダブルクリック
Verilog-HDLの
テンプレートが
表示されるので
コードを入力
7
入力する
Verilog-HDL
8
入力する
Verilog-HDL
(続き)
9
モジュールの記述方法
(モジュール名) (インスタンス名) (
ポート・リスト
);
最後にセミコロン「;」をつける!
モジュール名:
full_adder
インスタンス名:
fadr_inst_1
10
Verilog-HDLと回路の対応を確認
three_bit_adder
SW[0]
SW[3]
fadr_inst_1
LEDG[0]
0
w[0]
SW[1]
SW[4]
fadr_inst_2
LEDG[1]
w[1]
SW[2]
SW[5]
fadr_inst_3
LEDG[2]
LEDG[3]
11
ビット幅指定
•  同じ属性を持った信号をまとめる
‒  記述量の削減
‒  コードの可読性向上
x[0]
y[0]
0
s[0]
x[1]
y[1]
x[2] x[1] x[0]
+)y[2] y[1] y[0]
---------------------s[3] s[2] s[1] s[0]
s[1]
x[2]
y[2]
s[2]
s[3]
12
シミュレータの指定
(プロジェクト毎に1回行えばよい)
デバイス名(ここではCyclone III)を
右クリックして「Settings...」を選択
13
"Tool name"で"ModelSim-Altera"を選択
"EDA Tool Settings"の
"Simulation"を選択
"Format for output netlist"で"Verilog-HDL"を選択
14
合成の実行
クリック
コンピュータ (Quartus II)に
I/Oの設定を読み込ませる
ために合成を行います。
"Full Compilation was succesful"と
表示されればOK
15
テストベンチのテンプレート生成
「Start Test Bench
Template Writer」を選択
16
テストベンチの読み込み
(プロジェクト毎に1回行えばよい)
シミュレータ指定と
同じく、Settingsを呼び出し、
"EDA Tool Settings"の
"Simulation"を選択
"Compile test bench"にチェックをつけて、
Test Benchesをクリック
17
テストベンチの読み込み
"New"をクリック
"Test bench and simulation files"
の File name 内の「...」をクリック
18
テストベンチを読み込み
(デフォルト設定では、プロジェクトを置いている
フォルダ/simulation/modelsim内に
「プロジェクト名.vt」で置いている)
テストベンチを選択
(拡張子は「.vt」)
19
テストベンチ名と
トップモジュール名の設定
テストベンチ名はプロジェクト名(ここではDE0_TOP)
テストベンチのトップ・モジュール名は
テンプレート生成をしていれば
「テストベンチ名」+「_vlg_tst」
Add をクリックして
プロジェクトに
テストベンチを追加
あとは全てOKでよいです。
20
ModelSim(Altera版)の起動
クリック
こんなスプラッシュ
ウインドウが起動します...
21
テストベンチの修正
テストベンチ DE0_TOP_vlg_tst を
右クリック→Editを選択
Library をクリック
22
今回記述する
テストベンチ
入力値を指定
(ビット幅)'(基数)値で
複数ビットの定数を
指定できます
区切り"_"を入れてもよい
記述が終わったら
保存しましょう
always間は
コメントアウト
23
ビット幅指定の書式
ビット幅の宣言:
(属性) [(ビット幅-1):0] (信号名);
ビットの指定:
(信号名)[(ビットインデックス)]
複数ビットの指定:
(信号名)[(インデックス):(インデックス)]
24
再度コンパイルを行い
シミュレーションを初期化します
テストベンチ名を右クリックして「Recompile」を選択
再度、右リックして「Simulate」を選択
25
観測したい信号を
Waveウインドウに追加します
Verilog-HDLで使っている
SW[5]∼SW[0]と
LEDG[3:0]を追加しましょう
Objects ウインドウ
で信号を右クリック
→「Add Wave」を
選択
26
シミュレーションの実行
シミュレーション結果がでるが
わかりにくい…
"Transcript"ウインドウで
run 3nsと入力し、リターンキーを押す
27
表示方法の変更
Result Nameに「x_in」と入力
SW[5]∼SW[3]を選択し
右クリック→「Combine Signals」
を選択
SW[5:3]が纏められて見やすくなった
28
同様に他の信号もグループ化
各信号はドラッグ&ドロップで移動可能
SW[2]∼SW[0]を
「y_in」に
何となく、加算器として
見やすくなった!
例: 001+001=0010
LEDG[3]∼LEDG[0]を
「z_out」に
29
基数を変更する
•  2進数では理解しにくい→10進数へ
信号を右クリック→「Radix」→「Unsigned」を選択
•  全て10進数にすると一目瞭然!
30
合成の実行
クリック
Quartus IIに戻って
合成しましょう
"Full Compilation was succesful"と
表示されればOK
31
FPGAをPCに接続し、
電源を入れます
1. ACアダプタを接続
2. USBケーブルを介して
PCとFPGAボードを接続
3. 電源スイッチをオン
32
Programmer (書き込みツール)の起動
クリック
33
コンフィギュレーションを開始
USB-Blaster, JTAGモード, Programにチェックを確認
確認したら
Start を
クリック
Progress に "100%(Successful)"
と表示されれば成功
34
動作確認
シミュレーション結果と一致しましたか?
スライドスイッチ(SW0∼SW5)を
動かして, LEDG0∼LEDG3が
3ビット加算器として動作するかチェック
35
課題: 信号選択回路 (2-MUX)
x1
2-MUX
x2
s
y
s
0
0
0
0
1
1
1
1
x1
0
0
1
1
0
0
1
1
選択信号 s が0のときは x1 を選択,
s が 1 のときは x2 を選択する回路
x2
0
1
0
1
0
1
0
1
y
0
0
1
1
0
1
0
1
36
課題1
•  選択回路(2-MUX)を Verilog-HDLで記述し、
FPGA上で動作させよ
‒ 選択信号, 入力信号はスライドスイッチ
‒ 出力信号は緑LED
SW[0]
2-MUX
LEDG[0]
SW[1]
SW[2]
37
課題2
•  モジュール記述を用いて4-MUX をVerilog-HDLで記述しなさい
‒  可能ならば, ビット幅指定記述も用いる
•  シミュレーションを行い, 動作すること検証せよ
•  DE0ボード上に実装し、動作を確認せよ
SW[0]
2-MUX
SW[1]
2-MUX
LEDG[0]
SW[2]
2-MUX
SW[3]
SW[4]
SW[5]
38