begin
M <= A when SEL else B;
end DSEL;
A M B
SEL
entity K_BEHAVIOR is
port (SELS : in bit_vector(0 to 1);
A,B,C,D : in bit; M : out bit);
end;
architecture DSELS of K_BEHAVIOR is begin M <= A when (SELS="00") else
B when (SELS="01") else
C when (SELS="10") else D ; end DSELS;
M
SELS A
B C D
53
library IEEE;
use IEEE.std_logic_1164.all;
entity M_BEHAVIOR is
port (SELS : in bit_vector(0 to 1);
A,B,C,D : in bit; M : out bit);
end;
architecture DSELS of M_BEHAVIOR begin
with SELS select M <= A when ”00”, B when ”01”, C when ”10”, D when ”11”;
end DSELS;
with select 文
library IEEE;
use IEEE.std_logic_1164.all;
entity M_BEHAVIOR is
port (SELS : in std_logic_vector(0 to 1);
A,B,C,D : in bit; M : out bit);
end;
architecture DSELS of M_BEHAVIOR begin
with SELS select
M <= A when ”00”, B when ”01”, C when ”10”, D when ”11”;
end DSELS;
この記述を、
D when others;
とするとOK
M
SELS D
A B C
54
この宣言のとき、
SELSは、9x9=81値となり,, 左の記述ではエラー
55
3/4日目の実習内容
- テキスト:111~153頁
[実習の目的]
- 課題2/3/4をVHDLで設計し、実機動作させる
- 記述したVHDLのテストベンチを記述して、
ModelSimで機能確認する
- 検証したVHDLをQuartusⅡに移し、実機回路用に 修正して実行モジュールを作成する
- 課題を繰り返し、設計スキルを習得する
- Sim用回路と実機用回路の違いを理解する
56
課題2/3/4の設計作業の流れ
コンパイル
実機による動作確認
実行
モジュール ダウンロード QuartusⅡ
ピン割り当て
[評価ボード: DE0]
VHDL記述
ModelSim
VHDLで設計し、テストベンチを記述して、
シミュレーションで機能検証
検証したVHDLをQuartusⅡに移し、実機用回路に修正
VHDL記述
課題 2/3/4 の開発仕様の確認
57
課題2:
『自分の名前を表示させよう』
- 3日目 -
0123456789_I_AM_TOKUYA_FUJIOKA.
自分の名前
[注] 31文字なので、5ビット化(32文字)が可能 M _ T O
← ・・ ← ・・
[各文字と各セグメントの表示は、
テキストpp111、112を参照]
58
課題2の実習内容と進め方
ModelSim環境でVHDLで設計する。
テストベンチでシミュレーションして機能確認後、
実機 (回路変更が必要) で動作を確認する。
[ Modelsim ]
(テキスト: 116 ~ 130頁)① 新規プロジェクト(moji_deco)を作成する
② conversion_ascii.vhd (各自で記述内容が異なる)
moji_deco.vhd (全員の記述内容が同じ) を設計する。
③ moji_deco_top.vhd トップ回路をVHDLで設計する
④ テストベンチでシミュレーションを実行し、機能確認する
[QuartusⅡ]
(テキスト: 131 ~ 137頁)⑤ 新規プロジェクト(moji_deco_DE0)を作成する
⑥ 実機用回路に修正し(図4-24)、コンパイルする
⇒ 修正後のデータをエラーフリーにする
⑦ 端子割り当て後、コンパイルして実行モジュールを作成する
⑧ 実機で動作を確認する
59
[実現機能] 4個の7segLEDに、1秒毎に左に流れるように、0~9の数字を 表示させた後に、自分の名前をアルファベットで表示する。
[ボタン仕様]
Button0(stop): 押下毎に停止/再開の動作を繰り返す
停止: 押下時点での表示をそのまま継続する
再開: 表示状態から次の表示を再開する
Button1(reset): 初期状態に戻る(0表示から始める)
[LED表示]
HEX0 : 0123456789_I_am_(各人の名前をアルファベットで表示 HEX1/2/3 : -1/-2/-3秒遅れて、HEX0を同じ内容を表示
[モジュール構成]
- peripheral_moji: 準備されている。 ボタン動作に従って、1MHz周期 (Sim用)のカウント信号(0~31)が出力される: deco0~3[5_0]
実機用には、1Hz周期になるように変更する。
- conversion_ascii: カウント信号をascii文字コードに変換 - moji_deco: ascii文字コードを7segLED信号に変換
『名前表示』の開発仕様
moji_deco conversion_ascii
60
『名前表示』のSim用モジュール構成
- 図4-5 実習課題概要 -
deco0 0 1 2 3 4 5 6 7 8 9 ・・・ 30 31 deco1 31 0 1 2 3 4 5 6 7 8 ・・・ 29 30 deco2 30 31 0 1 2 3 4 5 6 7 ・・・ 28 29 deco3 29 30 31 0 1 2 3 4 5 6 ・・・ 27 28
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 1 2 3 4 5 6 7 8 9 _ I _ a m _ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 1 2 3 4 5 6 7 8 9 _ I _ a m _ (ascii)
(7seg)
(← 1秒毎にカウントアップする) (← カウントアップした数をascii文字と7segに変換する)
CNV0 DEC0
CLK
STOP
RESET
conversion_ascii decoder_7seg
CNV1 DEC1
CNV2 DEC2
CNV3 DEC3
S0(5) A0(7)
S1(5) A1(7)
S2(5) A2(7)
S3(5) A3(7)
LED0
LED1
LED2
LED3
HEX0
HEX1
HEX2
HEX3 PERI
deco0
deco1
deco2
deco3
moji_deco_top peripheral_moji
(配付モジュール)
今回設計する部分
[注意] 図中のS0(5)、A0(7)という表記は、単に信号のバス幅を示している。
S0(5) ⇒ S0(4 downto 0)、 A0(7) ⇒ A0(6 downto 0) 等 を略記したものです。
61
Sim用回路と実機用回路の相違
clk chattering
SW_in SW_out
50Mhz(システムクロック)
チャタリング発生信号 チャタリング除去信号
1.実機の入力信号には雑音が含まれる
⇒ チャタリング防止回路を挿入する必要がある
図4-22
図4-23
2.すべての状態をシミュレーションすることは不可能
⇒ 不必要な入力パターンを入力しない
⇒ 効率的な検証を行うためにモデル化が必要である
62
CLK
STOP
RESET
LED0
LED1
LED2
LED3
HEX0
HEX1
HEX2
HEX3
moji_deco_DE0
CLK LED0(7..0) I3: moji_deco_top
STOP RESET
LED1(7..0) LED2(7..0) LED3(7..0) clk
I1: chattering SW_in SW_out
clk
I2: chattering SW_in SW_out
chat_STP
chat_RST
『名前表示』の実機用モジュール構成
- 図4-24 実機評価用最上位回路: moji_deco_DE0 -
- 入力信号の雑音を削除 ⇒ チャタリング防止回路の挿入 - 表示周期を1秒(=1Hz)に変更
⇒ moji_deco_top内のperipheral_mojiの一部を変更 (図4-26、133頁)
63
『名前表示』のシミュレーション
1.シミュレーション用回路の設計
1)図4-5に従って、
conversion_ascii, decoder_7seg, moji_deco_top を設計する
2)peripheral_mojiは、シミュレーション用にカスタマイズする(されている)
・シミュレーションでは、雑音等は削除してよい ・シミュレーションの効率化を図る
⇒ 出力:deco0/1/2/3を1MHz(=1us)周期に設定 3)テストベンチを記述して、シミュレーションを実行する
2.シミュレーション後の確認内容
1)decoのカウント数に従って、所望の文字列が発生されているか?
2)カウント数が、asciiコードに正しく変換されているか?
3)7segLEDの信号が正しく生成されているか?
4)resetが正しく動作しているか?
5)stop信号が正しく動作しているか?
・1回目押下:カウント停止 →(継続) 2回目押下:カウント再開
64
『名前表示』のシミュレーション結果(1)
- 全体表示 -
65
『名前表示』のシミュレーション結果(2)
- リセット付近 - (asciiコードは、表4-2参照)
66
『名前表示』のシミュレーション結果(3)
- ストップ付近 -
67
課題3:
『1分時計』
- 3/4日目 -
68
課題3の実習内容と進め方
ModelSimのシミュレーションは、サブ回路で実行する。
QuartusⅡで実機用回路を設計して、動作確認する。
[ Modelsim ]
(テキスト: 142 ~ 146頁)① 新規プロジェクト(one_min_clock)を作成する ② Div_10ms: Sim用に、分周は、10usで設計する
CNT10 : カウントアップ機能付き10進カウンター を設計する
③ Parts : サブ回路のトップモジュールを設計する
④ テストベンチでシミュレーションを実行し、機能確認する
[QuartusⅡ]
(テキスト: 146 ~ 1148頁)⑤ 新規プロジェクト( one_min_clock )を作成する
⑥ 実機用回路(図5-8)を設計する ⇐ 分周は、10msにする
⇒ コンパイルで設計データをエラーフリーにする
⑦ 端子割り当て後、コンパイルして実行モジュールを作成する
⑧ 実機で動作を確認する
69
[実現機能] 1/100秒まで表示する1分時計を作る。60秒でトグルする。
(表示例) 12.34 [秒桁に、ドットを表示する]
[ボタン仕様]
Button0(reset): 初期状態に戻る(00.00秒表示に戻る)
[LED表示]
HEX0 : 1/100秒 HEX1 : 1/10秒
HEX2 : 1秒 ← “ドット”を表示させる HEX3 : 10秒
[モジュール構成]
- one_min_clock_top: 1分時計の最上位回路
- Div_10ms: 50MHz(20ns)→100Hz(10ms)への分周回路。
- chattering: チャタリング防止回路(既設計。手法1、2どちらでも可)
- CNT10: カウントアップ機能付き10進カウンタ - CNT06: カウントアップ機能付き6進カウンタ
- BCD_7segLED: BCDコードを7segLED信号にデコード
(注意) “ドット表示”をどこに組み込むかを考えること
『1分時計』の開発仕様
70
『1分時計』のトップ回路図
[入力]
- CLK: 50Mhz(20ns)
- 非同期reset
[出力] 1 2. 3 4
1/100単位 ドットを付ける
60秒で繰り返す
ドット表示
clk
reset
LED0
LED1
LED2
LED3
HEX0
HEX1
HEX2
HEX3
one_minute_top
[チャタリング防止回路]
chattering
chat_rst
clk_10ms
clk_100ms
BCD_7segLED
[分周回路]
Div_10ms
bcd seg
bcd seg
bcd seg
bcd seg
clk clk_div clk_sig reset
up_sig bcd
10進 カウンタ
clk_sig reset
up_sig bcd
10進 カウンタ
clk_sig reset
up_sig bcd
10進 カウンタ
clk_sig reset
up_sig bcd
6進 カウンタ clk_1s
clk_10s
bcd0_sig
bcd1_sig
bcd2sig
bcd3_sig
- 図5-8 『1分時計』のブロック図 -
71
clk
Parts
clk_10ms
clk_100ms
[分周回路] Div_10ms
clk_sig reset
bcd up_sig
[10進カウンタ] CNT10
clk clk_div bcd(3..0)
reset
▼ ▼
▼ ▼ ▼9 9 1 1
シミュレーション用サブ回路
図5-8の回路全体をシミュレーションするのは、非効率
⇒ サブ回路で、シミュレーションを実行
⇒ Div_10msとCNT10の動作を確認
⇒ 図5-10のサブ回路:Partsでシミュレーション実行
- 分周は、10ms→10us(1/1000)でシミュレーション
- 図5-10 サブ回路:Partsのブロック図 -
システムクロック:
50MHz
begin
DUT: parts port map (clk, reset, clk_100ms, bcd);
process begin
clk <= '1'; wait for 10 ns ; clk <= '0'; wait for 10 ns ; end process;
process begin
wait for 3215 ns; reset <= '0';
wait for 2.0 us; reset <= '1';
wait for 500 us;
assert false severity failure;
end process;
end SIM;
configuration cfg_parts_tb of parts_tb is for SIM
end for;
end cfg_parts_tb;
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity parts_tb is end parts_tb;
architecture SIM of parts_tb is component parts port
(clk, reset : in std_logic;
clk_100ms : out std_logic;
bcd : out std_logic_vector(3 downto 0) );
end component;
signal clk, reset, clk_100ms : std_logic :='1';
signal bcd : std_logic_vector(3 downto 0);
72
『1分時計』のサブ回路のテストベンチ
- 分周周波数は、10us でシミュレーションを実行
CLK生成
RST生成 3215nsから2us間
reset後、
500us実行して、
強制終了
Sim継続時間
73
サブ回路:Partsのシミュレーション結果①
[reset機能の確認]
[Div_10msの出力:clk_10msとCNT10の出力:信号bcdの確認]
74
サブ回路:Partsのシミュレーション結果②
[CNT10の出力:clk_100msの確認]
75
課題4:
『追加仕様版加算器』
- 4日目 -
76
[追加仕様1]
4ビット加算器の表示を16進表示 ⇒ 10進表示に変更する
- “1100”(=CH) ⇒ [BCDコード] “0001_0010”(=1210)
[追加仕様2]
追加仕様1の4ビット
(0~15)を7ビット
(0~127)へ拡張する。
-入力信号AとB: 0~99まで入力可。 99から0に戻る。
-加算結果は、HEX0/1/2に10進数で、HEX/3には“=”を表示する。
(表示例) “=005”、“=034”、“=198” 等
[追加仕様3]
追加仕様2に乗算機能を追加する
-99x99=9801 ⇒ HEX0/1/2/3に表示可)
-乗算機能は、単純に、MUL <= A * B; で実現する
-MULの表示は、SW1を使う。 SW1=’1’の時に、HEX3~0に表示する。
SW0とSW1が同時に’1’の時は、SW1を優先する。
『4ビット加算器』への追加仕様
77
課題4の実習内容と進め方
【4日目】 以下の手順で設計して、シミュレーションで確認後、
実機用回路を設計して、動作を確認する。
[ Modelsim ]
① 新規プロジェクト(adder_expand)を作成する ② プロジェクト:adder_4bit に、
・4ビットカウンター: Counter_4bit.vhd ・BCD化モジュール:Binary2bcd.vhd
・表示信号の選択回路: Selector.vhd を追加する
③ 全体回路を整合し、テストベンチでシミュレーションを実行し、
機能確認する
[QuartusⅡ]
④ 新規プロジェクト( adder_expand_DE0 )を作成する
⑤ 実機用回路を設計する(チャッタリング防止回路の追加)
⑥ 端子割り当て後、コンパイルして実行モジュールを作成する
⑦ 実機で動作を確認する
☆ 追加仕様2/3も同様の手順で作業する。