SlideShare a Scribd company logo
1
Verilog-HDL 講習会DE0編(5)
組合せ回路記述(続)
12, June, 2013
鹿児島大学
中原 啓貴
2
•  ピン配置が面倒くさいので、デフォルト
のプロジェクトを読み込みましょう!
(DE0に限った事ではないが、Terasic製品はサンプルCD-ROMの
プロジェクトを改変するのが楽でお勧め)
DE0付属のCD-ROM
Demonstrations 内の
"DE0_Top"フォルダの
ファイル全てを
C:¥verilog¥DE0_tutorial_5¥
内にコピー
DE0_TOP.qpfをダブルクリック
してQuartus IIを起動
3
Pin Plannerを開いてみると
ピン配置が終わっている!
Verilog-HDLを入力
4
ダブルクリック
Verilog-HDLの
テンプレートが
表示されるので
コードを入力
コード入力したら保存を忘れずに!
5
課題: 信号選択回路 (2-MUX)
s x1 x2 y
0 0 0 0
0 0 1 0
0 1 0 1
0 1 1 1
1 0 0 0
1 0 1 1
1 1 0 0
1 1 1 1
2-MUX
x1
x2
y
s
選択信号 s が0のときは x1 を選択,
s が 1 のときは x2 を選択する回路
6
信号選択回路 (2-MUX) の
MIL記号による表現
2-MUX
x1
x2
y
s
選択信号 s が0のときは x1 を選択,
s が 1 のときは x2 を選択する回路
y = s x1 v s x2
x1
x2
s
y
SW[0]
SW[1]
SW[2]
LEDG[0]
LEDG[0]
SW[2]
SW[1]
SW[0]
7
2-MUXのVerilog-HDL記述
(MIL記号図ベース)
シミュレータの指定
(プロジェクト毎に1回行えばよい)
8
デバイス名(ここではCyclone III)を
右クリックして「Settings...」を選択
9
"EDA Tool Settings"の
"Simulation"を選択
"Tool name"で"ModelSim-Altera"を選択
"Format for output netlist"で"Verilog-HDL"を選択
10
合成の実行
クリック
コンピュータ (Quartus II)に
I/Oの設定を読み込ませる
ために合成を行います。
"Full Compilation was succesful"と
表示されればOK
テストベンチのテンプレート生成
11
「Start Test Bench
Template Writer」を選択
テストベンチの読み込み
(プロジェクト毎に1回行えばよい)
12
シミュレータ指定と
同じく、Settingsを���び出し、
"EDA Tool Settings"の
"Simulation"を選択
"Compile test bench"にチェックをつけて、
Test Benchesをクリック
テストベンチの読み込み
13
"New"をクリック
"Test bench and simulation files"
の File name 内の「...」をクリック
テストベンチ名と
トップモジュール名の設定
14
テストベンチ名はプロジェクト名(ここではDE0_TOP)
テストベンチのトップ・モジュール名は
テンプレート生成をしていれば
「テストベンチ名」+「_vlg_tst」
Add をクリックして
プロジェクトに
テストベンチを追加
あとは全てOKでよいです。
ModelSim(Altera版)の起動
15
クリック
Library をクリック
テストベンチ DE0_TOP_vlg_tst を
右クリック→Editを選択
16
テストベンチ記述
赤枠で囲った部分を記述
整数を宣言(テストベンチのみ使える).
整数は32ビットです。つまり、 reg [31:0]i ;と同じ.
iを初期化
for文はテストベンチのみ使えます.
ただし, C言語のような i++ は使えません!
コメントアウト
17
シミュレーション結果の確認
保存して, 「Recompile」を
行った後「Simulation」で
シミュレーションを設定.
SW[2]∼SW[0], LEDG[0]を
Waveウインドウに登録して、
10nsシミュレーションを実行
してみよう.
18
合成の実行
クリック
Quartus IIに戻って
合成しましょう
"Full Compilation was succesful"と
表示されればOK
19
FPGAをPCに接続し、
電源を入れます
1. ACアダプタを接続
2. USBケーブルを介して
PCとFPGAボードを接続
3. 電源スイッチをオン
20
Programmer (書き込みツール)の起動
クリック
21
コンフィギュレーションを開始
USB-Blaster, JTAGモード, Programにチェックを確認
確認したら
Start を
クリック
Progress に "100%(Successful)"
と表示されれば成功
22
スライドスイッチSW2 がオフのときは
LEDGがSW0と同期して点滅,
SW2がオンのときはLEDGがSW1と
同期して点滅するかチェック
動作確認
シミュレーション結果と一致しましたか?
23
2-MUX のVerilog-HDL記述
(条件演算子)
以前の記述をコメントアウト
以下を入力
24
解説
•  Verilog-HDLのコメントアウト
‒ 「//」:一行をコメントアウト
‒ 「/* */」:複数行をコメントアウト
C言語と同じです
•  条件演算子
assign 信号名 = ( 条件文) ? Val真 : Val偽;
(Val真…真のときに代入される値
Val偽…偽のときに代入される値)
※多ビットの条件、値の代入も可能
assign s[2:0] = (a[1:0] < 2'b10 ) ? 3'b010 : 3'b111;
25
シミュレーションしてみましょう
同じ結果になったはずです
26
スライドスイッチSW2 がオフのときは
LEDGがSW0と同期して点滅,
SW2がオンのときはLEDGがSW1と
同期して点滅するはず
DE0ボードに書込んで動作確認
同じ動作になりましたか?
27
複雑な条件式の記述
•  条件演算子や論理式
‒  複雑な条件分岐の記述は困難
‒  可読性が悪い
•  If文を使いたい!
assign f = ( c1 == 1'b0) ?
( ( c2 == 1'b0) ? 2'b00 : 2'b01)
: ((c2 == 1'b0) ? 2'b10 : 2'b11);
if( c1 == 1'b0) {
if( c2 == 1'b0) {
f = 2'b00;
} else {
f = 2'b01;
}
} else {
if( c2 == 1'b0) {
f = 2'b10;
} else {
f = 2'b11;
}
}
28
Function文の例
以前の記述をコメントアウト
ここを記述
セミコロン
セミコロン不要
29
解説
•  Function文
‒  関数のようなもの
‒  モジュール呼び出しと異なり、モジュール内に記述
•  呼び出し: assign = (Function名)(ポート・リスト);
•  関数:
function (ビット幅)(Function名);
(ポート宣言);
(関数記述, if文など)
代入は assign 不要. ただし, (Function名)=(値);
endfunction
癖がある記述なので、たくさん書いて慣れよう!
C言語の中括弧「 { 」「 } 」は
「begin」「end」になります
変数の順序が一致
しなければならない!
30
シミュレーションしてみましょう
同じ結果になったはずです
31
スライドスイッチSW2 がオフのときは
LEDGがSW0と同期して点滅,
SW2がオンのときはLEDGがSW1と
同期して点滅するはず
DE0ボードに書込んで動作確認
同じ動作になりましたか?
32
ルック・アップ・
テーブル
(真理値表記述)
ここを記述
以前の記述を
コメントアウト
(/* */ を使ってみよう)
論理合成
↓
シミュレーション
とFPGAで
動作を確認する
複数の信号は
「{ }」でまとめる
33
解説
•  Case文:真理値表を記述
Function文に使える
‒ もう一つの使用法は後日します
case ( 変数リスト(複数記述してもよい))
(一致する値): (Function名) = (値);
endcase
全ての組合せを記述
複数記述するときは「{ }」を使う
34
まとめ
•  複雑な組合せ回路を記述する方法
‒ 論理式: 記述量が少ないが可読性が悪い
•  算術演算も記述可能(全加算器を設計しましたよね)
‒ 条件演算子: 単純な条件演算の記述に向く
•  複雑な条件演算には向かない
‒ Function文
•  If文:記述量が多いが可読性がよい
•  Case文:最も記述量が多いが、設計・可読性に優れる
目的の回路に応じて適切な記述を選択するのが
設計者の仕事(センス)
35
課題1
•  デマルチプレクサを論理式, 条件演算子, If文,
case文で記述し、シミュレーションとFPGAで
動作を確認せよ
De-MUXx
s
y[0]
y[1]
s x y[0] y[1]
0 0 0 0
0 1 1 0
1 0 0 0
1 1 0 1
課題2
•  スライドスイッチ(3ビット)の値を
7セグメントLEDに表示せよ
(注意: 7セグメントLEDは負論理、つまり0のとき点��,1
のとき消灯する)
36
OFF, OFF, OFF OFF, OFF, ON ON, ON, ON

More Related Content

Verilog-HDL Tutorial (5)