Download pdf - Verilog-HDL Tutorial (9)

Transcript

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


Recommended