DE0_Default もどきを作ってみよう (DE0ボードの電源を入れたときの動作)
2
3Hzのクロック に同期して 4桁同時に
カウントアップ
25 Hzのクロックに同期して 4ビット毎に左右にスライド
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;
8
• ピン配置が面倒くさいので、デフォルトのプロジェクトを読み込みましょう! (DE0に限った事ではないが、Terasic製品はサンプルCD-ROMの プロジェクトを改変するのが楽でお勧め)
DE0付属のCD-ROM ”Demonstrations”内の "DE0_Top"フォルダの ファイル全てを C:¥verilog¥DE0_tutorial_9_LEDG_Slide¥ 内にコピー
そろそろモジュール階層を 意識して記述しましょう
• 最後に各回路をマージするので、サブ・ モジュールにLEDGスライド回路を記述する • サブ・モジュールは別のVerilog-HDLファイルに記述する ‒ 可読性を上げるため • トップモジュールにべた書きは読みにくい!! • トップモジュールはFPGA外部の信号線定義のみに留める
‒ 次の設計のときに読み込んで再利用可能 • FPGAボードが変ってもインスタンス化して接続し直すだけで再利用可能
11
タイミングの生成 • 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を切り替えればよい
シミュレーションの設定
21
Project Navigatorで 「DE0_TOP」を右クリックし 「Settings」を選択
Simulation を選択
Tool name は「ModelSim-Altera」
Format は 「Verilog-HDL」
Time scale は「1 ns」
テストベンチ 読み込み設定
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」を選択
40
• ピン配置が面倒くさいので、デフォルトのプロジェクトを読み込みましょう! (DE0に限った事ではないが、Terasic製品はサンプルCD-ROMの プロジェクトを改変するのが楽でお勧め)
DE0付属のCD-ROM ”Demonstrations”内の "DE0_Top"フォルダの ファイル全てを C:¥verilog¥DE0_tutorial_9_CountUp_7SEG¥ 内にコピー
タイミングの生成 • 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を切り替えればよい
自分で考えてみよう
54
• ピン配置が面倒くさいので、デフォルトのプロジェクトを読み込みましょう! (DE0に限った事ではないが、Terasic製品はサンプルCD-ROMの プロジェクトを改変するのが楽でお勧め)
DE0付属のCD-ROM ”Demonstrations”内の "DE0_Top"フォルダの ファイル全てを C:¥verilog¥DE0_tutorial_9_DE0_Default¥ 内にコピー
【準備】先程設計したVerilog-HDLファイルをコピーしておく 2個のファイル「LEDG_Slide.v」「CountUp_7SEG.v」を C:\verilog\DE0_tutorial_9_DE0_Defaultにコピー
56
60
【Tips】他のファイルをインスタンシェーション(呼出し)する場合は, コピペすると楽!
Verilog-HDLの記述 (DE0_Top.v)
「LEDG_Slide」をテキストエディタで 開いて, モジュール宣言部をコピペ
今回設計した回路
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
まとめ • 複雑な回路は並列化して状態遷移図をわける ‒ 設計が楽になるので、是非わけましょう! ‒ Verilog-HDLファイルを読み込む方法を学習 ‒ 状態遷移図間の通信は次回で
• 所望のクロックを生成する方法を学習 ‒ 入力周波数から所定の周波数を 生成できるようになった • ただし、誤差あり • 入力周波数以上の周波数は生成できない… (実はFPGA内のある回路を使うとできます)
70