Upload
hiroki-nakahara
View
82
Download
0
Embed Size (px)
Citation preview
2
• ピン配置が面倒くさいので、デフォルトのプロジェクトを読み込みましょう!
(DE0に限った事ではないが、Terasic製品はサンプルCD-ROMの プロジェクトを改変するのが楽でお勧め)
DE0付属のCD-ROM ”Demonstrations”内の "DE0_Top"フォルダの ファイル全てを C:¥verilog¥DE0_tutorial_5¥ 内にコピー
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]
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
テストベンチの読み込み (プロジェクト毎に1回行えばよい)
12
シミュレータ指定と 同じく、Settingsを呼び出し、 "EDA Tool Settings"の "Simulation"を選択
"Compile test bench"にチェックをつけて、 Test Benchesをクリック
テストベンチ名と トップモジュール名の設定
14
テストベンチ名はプロジェクト名(ここではDE0_TOP)
テストベンチのトップ・モジュール名は テンプレート生成をしていれば 「テストベンチ名」+「_vlg_tst」
”Add”をクリックして プロジェクトに テストベンチを追加
あとは全てOKでよいです。
16
テストベンチ記述 赤枠で囲った部分を記述
整数を宣言(テストベンチのみ使える). 整数は32ビットです。つまり、 reg [31:0]i ;と同じ.
iを初期化
for文はテストベンチのみ使えます. ただし, C言語のような i++ は使えません!
コメントアウト
17
シミュレーション結果の確認
保存して, 「Recompile」を 行った後「Simulation」で シミュレーションを設定. SW[2]~SW[0], LEDG[0]を Waveウインドウに登録して、 10nsシミュレーションを実行 してみよう.
21
コンフィギュレーションを開始
USB-Blaster, JTAGモード, Programにチェックを確認
確認したら ”Start”を クリック
Progress に "100%(Successful)" と表示されれば成功
24
解説 • Verilog-HDLのコメントアウト
‒ 「//」:一行をコメントアウト ‒ 「/* */」:複数行をコメントアウト C言語と同じです
• 条件演算子
assign 信号名 = ( 条件文) ? Val真 : Val偽; (Val真…真のときに代入される値 Val偽…偽のときに代入される値) ※多ビットの条件、値の代入も可能 assign s[2:0] = (a[1:0] < 2'b10 ) ? 3'b010 : 3'b111;
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; }
}
29
解説 • Function文
‒ 関数のようなもの ‒ モジュール呼び出しと異なり、モジュール内に記述
• 呼び出し: assign = (Function名)(ポート・リスト); • 関数: function (ビット幅)(Function名); (ポート宣言); (関数記述, if文など) 代入は assign 不要. ただし, (Function名)=(値); endfunction
癖がある記述なので、たくさん書いて慣れよう!
C言語の中括弧「 { 」「 } 」は 「begin」「end」になります
変数の順序が一致 しなければならない!
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