Upload
others
View
4
Download
0
Embed Size (px)
Citation preview
1
Verilog-HDL 講習会DE0編(9) 順序回路記述(4)
~複雑な状態遷移図~
31, July, 2013 鹿児島大学 中原 啓貴
DE0_Default もどきを作ってみよう (DE0ボードの電源を入れたときの動作)
2
3Hzのクロック に同期して 4桁同時に
カウントアップ
25 Hzのクロックに同期して 4ビット毎に左右にスライド
回路を並列に動作させる • なにも一つの回路で制御する必要はない! • 今回は2つの状態遷移図に分けよう!
3
LEDGスライドの状態遷移図
4
000 001 010
101 100 011
Reset LEDG <= 11110 _00000; is_right_shift <= 1;
NONE LEDG <= 01111 _00000; is_right_shift <= 1;
is_right_shift == 1; LEDG <= 00111 _10000;
is_right_shift == 1; LEDG <= 00011_11000;
is_right_shift == 1; LEDG <= 00001_11100;
110
is_right_shift == 1; LEDG <= 00000_11110;
is_right_shift == 1; LEDG <= 00000_01111;
NONE LEDG <= 00000_11110; is_right_shift == 0;
is_right_shift == 0; LEDG <= 00001_11100;
is_right_shift == 0; LEDG <= 00011_11000;
is_right_shift == 1; LEDG <= 00111 _10000;
is_right_shift == 0; LEDG <= 01111_00000;
is_right_shift == 0; LEDG <= 11110_00000;
カウントアップの状態遷移図
5
000 001 010 011
111 110 101 100
Reset HEX_D <= 1000000; HEX_DP <= 0;
NONE HEX_D <= 1111001; HEX_DP <= 1;
NONE HEX_D <= 0100100; HEX_DP <= 0;
NONE HEX_D <= 0110000; HEX_DP <= 1;
NONE HEX_D <= 0011001; HEX_DP <= 0;
NONE HEX_D <= 0010010; HEX_DP <= 1;
NONE HEX_D <= 0000010; HEX_DP <= 0;
NONE HEX_D <= 1111000; HEX_DP <= 1;
NONE HEX_D <= 1000000; HEX_DP <= 0;
どうやって実装するか? • 並列動作する回路なので独立に設計 • 各回路の設計後、1つにまとめる
6
まずはLEDGスライド回路を 設計してFPGA上で動作させる
7
8
• ピン配置が面倒くさいので、デフォルトのプロジェクトを読み込みましょう! (DE0に限った事ではないが、Terasic製品はサンプルCD-ROMの プロジェクトを改変するのが楽でお勧め)
DE0付属のCD-ROM ”Demonstrations”内の "DE0_Top"フォルダの ファイル全てを C:¥verilog¥DE0_tutorial_9_LEDG_Slide¥ 内にコピー
DE0_TOP.qpfをダブルクリックしてQuartus IIを起動
9
Pin Plannerを開いてみると ピン配置が終わっている!
Verilog-HDLを入力
10
ダブルクリック Verilog-HDLの テンプレートが 表示されるので コードを入力
コード入力したら保存を忘れずに!
そろそろモジュール階層を 意識して記述しましょう
• 最後に各回路をマージするので、サブ・ モジュールにLEDGスライド回路を記述する • サブ・モジュールは別のVerilog-HDLファイルに記述する ‒ 可読性を上げるため • トップモジュールにべた書きは読みにくい!! • トップモジュールはFPGA外部の信号線定義のみに留める
‒ 次の設計のときに読み込んで再利用可能 • FPGAボードが変ってもインスタンス化して接続し直すだけで再利用可能
11
Verilog-HDLファイルの新規追加
12
新規作成をクリック
Verilog HDL Fileを 選択し「OK」
タイミングの生成 • 50MHz (DE0ボードのクロック)から25Hzをどうやって生成?
13
25 Hz ということは, 1周期= 1 / 25 = 0.04 [sec]
25Hz
ということは, 0.04 / 2 = 0.02 [sec] 毎にHigh と Low を切り替えればよい
50MHz 50 MHz ということは, 1周期= 1 / 50x106 = 0.02x10-6 [sec]
つまり, 0.02 / (0.02 x 10-6) = 100,000 クロック毎に High と Lowを切り替えればよい
入力するVerilog-HDL (LEDG_Slide.v)
14
入力するVerilog-HDL (LEDG_Slide.v)
15
16
入力するVerilog-HDL (LEDG_Slide.v)
LEDG_Slide.vを入力したら保存
17
保存ボタンをクリック
ファイル名「LEDG_Slide.v」として「保存」
保存するとタブの表示が変ります
18
入力するVerilog-HDL (DE0_TOP.v)
• 単にLEDG_Slideをインスタンス化するだけ
19
リセット信号は押しボタン[0]とした. 負論理であることに注意!
コンパイルを行うとプロジェクトに 認識されます
20
シミュレーションの設定
21
Project Navigatorで 「DE0_TOP」を右クリックし 「Settings」を選択
Simulation を選択
Tool name は「ModelSim-Altera」
Format は 「Verilog-HDL」
Time scale は「1 ns」
テストベンチ・テンプレート生成
22
Processing -> Startメニューから
Start Test Bench Template Writer を選択
テストベンチ 読み込み設定
23
Project Navigatorで 「DE0_TOP」を右クリックし 「Settings」を選択
Compile test benchを選択し, Test Benches... をクリック New... をクリック
テストベンチ設定
24
Test bench name は「DE0_TOP」
Top level module in test bench は「DE0_TOP_vlg_tst」
テストベンチファイルを追加
テストベンチファイル読み込み
25
プロジェクトを置いているフォルダに 「simulation」フォルダができているので、 「modelsim」フォルダをクリック。 すると、テンプレート「DE0_TOP.vt」が あるはず。
テストベンチ「DE0_TOP.vt」を選択
確認を行う
26
シミュレーションの設定確認
27
ModelSim起動
28
29
テストベンチを編集
1. Library タブをクリック
2. rtl_work を展開
3. DE0_TOP_vlg_tst を右クリックし 「Edit」を選択
30
タイム スケールを 確認
入力するテストベンチ
31
32
ReCompile を実行し シミュレーションの準備を行います
DE0_TOP_vlg_tst を右クリックし 「ReCompile」を選択
波形をWaveウインドウに追加
33
LEDG_Slideの信号を追加
34
Gen_CLK25Hzの信号を追加
35
表示を見やすくするため, Divider を追加しましょう
36
右クリックして「Add」を選択し 「New Divider」を選択
コマンドラインに run 50ms を入力
37
Add Cursor をクリックしカーソルを追加
25Hz間隔になっているか チェックしてみよう
FPGA上で動作を確認
38
25 Hzのクロックに同期して 4ビット毎に左右にスライド
次はカウントアップ回路を 設計してFPGA上で動作させる
39
40
• ピン配置が面倒くさいので、デフォルトのプロジェクトを読み込みましょう! (DE0に限った事ではないが、Terasic製品はサンプルCD-ROMの プロジェクトを改変するのが楽でお勧め)
DE0付属のCD-ROM ”Demonstrations”内の "DE0_Top"フォルダの ファイル全てを C:¥verilog¥DE0_tutorial_9_CountUp_7SEG¥ 内にコピー
DE0_TOP.qpfをダブルクリックしてQuartus IIを起動
41
Pin Plannerを開いてみると ピン配置が終わっている!
Verilog-HDLを入力
42
ダブルクリック Verilog-HDLの テンプレートが 表示されるので コードを入力
コード入力したら保存を忘れずに!
Verilog-HDLファイルの新規追加
43
新規作成をクリック
Verilog HDL Fileを 選択し「OK」
タイミングの生成 • 50MHz (DE0ボードのクロック)から3Hzをどうやって生成?
44
3Hz ということは, 1周期= 1 /3 = 0.04 [sec]
3Hz
ということは, 0.04 / 2 = 0.02 [sec] 毎にHigh と Low を切り替えればよい
50MHz 50 MHz ということは, 1周期= 1 / 50x106 = 0.02x10-6 [sec]
つまり, 0.02 / (0.02 x 10-6) = 100,000 クロック毎に High と Lowを切り替えればよい
自分で考えてみよう
入力するVerilog-HDL (CountUp_7SEG.v)
45
入力するVerilog-HDL (CountUp_7SEG.v)
46
47
入力するVerilog-HDL (CountUp_7SEG.v)
CountUp_7SEG.vを保存
48
保存ボタンをクリック
ファイル名「CountUp_7SEG.v」として「保存」
入力するVerilog-HDL (DE0_TOP.v)
49
入力するテストベンチ
50
シミュレーションで動作を確認
51
FPGA上で動作を確認
52
3Hzのクロック に同期して 4桁同時に
カウントアップ
最後に設計した各回路を 読み込んで1つの回路にする
53
54
• ピン配置が面倒くさいので、デフォルトのプロジェクトを読み込みましょう! (DE0に限った事ではないが、Terasic製品はサンプルCD-ROMの プロジェクトを改変するのが楽でお勧め)
DE0付属のCD-ROM ”Demonstrations”内の "DE0_Top"フォルダの ファイル全てを C:¥verilog¥DE0_tutorial_9_DE0_Default¥ 内にコピー
DE0_TOP.qpfをダブルクリックしてQuartus IIを起動
55
Pin Plannerを開いてみると ピン配置が終わっている!
【準備】先程設計したVerilog-HDLファイルをコピーしておく 2個のファイル「LEDG_Slide.v」「CountUp_7SEG.v」を C:\verilog\DE0_tutorial_9_DE0_Defaultにコピー
56
Verilog-HDLを入力
57
ダブルクリック Verilog-HDLの テンプレートが 表示されるので コードを入力
コード入力したら保存を忘れずに!
先程設計したVerilog-HDL ファイルを読み込みましょう
58
右クリックして 「Settings ...」を 選択
「Files」を選択 「...」を選択
Verilog-HDLファイルの選択
59
先程コピーしたファイル 「CountUp_7SEG.v」 「LEDG_Slide.v」 を選択して「開く」を クリック
60
【Tips】他のファイルをインスタンシェーション(呼出し)する場合は, コピペすると楽!
Verilog-HDLの記述 (DE0_Top.v)
「LEDG_Slide」をテキストエディタで 開いて, モジュール宣言部をコピペ
あとは信号を記述しましょう
61
同様にコピペ…
62
「CountUp_7SEG」を テキストエディタで 開いて, モジュール宣言部をコピペ
記述するVerilog-HDL (DE0_TOP.v)
63
今回設計した回路
64
DE0_Top
LED_Slide_inst
CountUp_7SEG_inst
CLOCK_50 RESET_N
LEDG
CLOCK_50 RESET_N
HEX_D
HEX_DP
CLOCK_50
BUTTON[0] LEDG
HEX0_D HEX0_DP HEX1_D HEX1_DP HEX2_D HEX2_DP HEX3_D HEX3_DP
【別ファイルで設計するメリット】 FPGAボードを変更しても使い回しできる!
65
Spartan III FPGA Boardに変更!! (インスタンシエーションの信号名を付け替えるだけでOK)
LED_Slide_inst
CountUp_7SEG_inst
CLOCK_50 RESET_N
LEDG
CLOCK_50 RESET_N
HEX_D
HEX_DP
CLK50
PUSH[0] LED_GREEN
HEX0_D HEX0_DP HEX1_D HEX1_DP HEX2_D HEX2_DP
7セグが減っても増えてもOK
別ファイルで設計するメリットはたくさんある!
• FPGAボードが変わっても、インスタンシエーョン時に信号線名を変えるだけでOK • 回路を分割設計するので, 設計対象が小さくなる. ‒ 設計がしやすくなる ‒ ミスも減る ‒ バグ検出も容易
• 設計毎に過去の資産として使い回しできる
66
コンパイルを行う
67
「保存アイコン」を クリックして保存
「コンパイルアイコン」を クリックして コンパイルを行う
コンパイル後、このウインドウが 表示されればOK
コンパイル後, 読み込んだファイルがProject Navigator に表示されます
68
FPGA上で動作を確認
69
3Hzのクロック に同期して 4桁同時に
カウントアップ 25 Hzのクロックに同期して 4ビット毎に左右にスライド
まとめ • 複雑な回路は並列化して状態遷移図をわける ‒ 設計が楽になるので、是非わけましょう! ‒ Verilog-HDLファイルを読み込む方法を学習 ‒ 状態遷移図間の通信は次回で
• 所望のクロックを生成する方法を学習 ‒ 入力周波数から所定の周波数を 生成できるようになった • ただし、誤差あり • 入力周波数以上の周波数は生成できない… (実はFPGA内のある回路を使うとできます)
70
課題 • 下記のLEDGを指定した周波数で点滅する回路を作成し, FPGA上で動作を確認 ‒ LEDG[0]: 2 Hz ‒ LEDG[1]: 1 Hz ‒ LEDG[2]: 0.333 Hz ‒ LEDG[3]: 0.5 Hz
• 各LED表示回路毎にプロジェクトを作成して, 全てが完成したら1つのプロジェクトに読み込むように設計しよう
71