verilog-hdl tutorial (5)

36
1 Verilog-HDL 講習会DE0編(5) 組合せ回路記述(続) 12, June, 2013 鹿児島大学 中原 啓貴

Upload: hiroki-nakahara

Post on 18-Jul-2015

81 views

Category:

Education


0 download

TRANSCRIPT

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-MUX x

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