『1分時計』のトップ回路図
[入力]
- CLK: 50Mhz(20ns)
- 非同期reset
[出力]
1 2. 3 4
1/100単位 ドットを付ける
60秒で繰り返す
ドット表示
clk
reset
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);
『1分時計』のサブ回路のテストベンチ
-
分周周波数は、10us
でシミュレーションを実行clk生成
reset生成 3215nsから2us間
reset後、
500us実行して、
強制終了
Sim継続時間
サブ回路:Partsのシミュレーション結果①
[reset機能の確認]
[Div_10msの出力:clk_10msとCNT10の出力:信号bcdの確認]
サブ回路:Partsのシミュレーション結果②
[CNT10の出力:clk_100msの確認]
5.課題4: 『追加仕様版加算器』
- 第4日目 -
[追加仕様1]
4ビット加算器の表示を16進表示 ⇒ 10進表示に変更する
- “1100”(=C
H) ⇒ [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ビット加算器』への追加仕様
実習の進め方
【第4日目】 以下の手順で設計して、シミュレーションで確認後、
実機用回路を設計して、動作を確認する。
[ Modelsim ]
①
新規プロジェクト(adder_expand)を作成する②
プロジェクト:adder_4bit に、・4ビットカウンター: Counter_4bit.vhd ・BCD化モジュール:Binary2bcd.vhd
・表示信号の選択回路: Selector.vhd
を追加する③
全体回路を整合し、テストベンチでシミュレーションを実行し、機能確認する [QuartusⅡ]
④
新規プロジェクト( adder_expand_DE0 )を作成する⑤
実機用回路を設計する(チャッタリング防止回路の追加)⑥
端子割り当て後、コンパイルして実行モジュールを作成する⑦
実機で動作を確認する☆
追加仕様2/3も同様の手順で作業する。A B RESET
EQUAL システムクロック
(50MHz)
カウンター
波形整形(チャタリング) SW0
0 加算
回路
BCD化
BCD化 BCD化
カウンター
Hex0
Hex1
Hex2
Hex3
1
表示信号の選択
BCD_
7segLED
(Hex3) (Hex2) (Hex1) (Hex0)
『追加仕様版_加算器』のブロック図
adder_expand_DE0
図6-1 追加仕様版1の加算器ブロック図
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
entity Binary2bcd is
port( bin_in : in std_logic_vector(4 downto 0);
bcd1 : out std_logic_vector(3 downto 0);
bcd2 : out std_logic_vector(3 downto 0));
end Binary2bcd ;
architecture RTL of Binary2bcd is
signal Num,N1,N2: integer range 0 to 63;
begin
Num <= CONV_INTEGER(bin_in);
N1 <= Num - (Num/10)*10;
N2 <= (Num/10) mod 10;
BCD化: Binary2bcd.vhd
関数名 機能内容
std_logic_1164パッケージ内
To_stdlogicvector(A) bit_vectorからstd_logic_vectorへの変換 To_bitvector(A) std_logic_vectorからbit_vectorへの変換
To_stdlogic(A) bitからstd_logicへの変換
To_bit(A) std_logicからbitへの変換
std_logic_arithパッケージ内
CONV_std_logic_vector(A、ビット幅) integer、unsigned、signedから std_logic_vectorへの変換
CONV_INTEGER(A) unsigned、signedからintegerへの変換
std_logic_unsignedパッケージ内
CONV_INTEGER(A) std_logic_vectorからintegerへの変換
『型の変換』の関数
【参考資料】
- 7segLEDのデコード回路 -
(ドット表示on/off機能付)
7segLEDのデコーダ: BCD_7seg.vhd
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity BCD_7seg is
port( dot : in std_logic;
led : in std_logic_vector(3 downto 0);
seg : out std_logic_vector(7 downto 0));
end BCD_7seg;
architecture RTL of BCD_7seg is begin
process(led) begin if dot='0' then case led is
when "0000" => seg<="00000011"; -- 0 when "0001" => seg<="10011111"; -- 1 when "0010" => seg<="00100101"; -- 2 when "0011" => seg<="00001101"; -- 3 when "0100" => seg<="10011001"; -- 4 when "0101" => seg<="01001001"; -- 5 when "0110" => seg<="01000001"; -- 6 when "0111" => seg<="00011011"; -- 7 when "1000" => seg<="00000001"; -- 8 when "1001" => seg<="00001001"; -- 9 when others => seg<="11111111";
end case;
else
case led is
when "0000" => seg<="00000010"; -- 0 when "0001" => seg<="10011110"; -- 1 when "0010" => seg<="00100100"; -- 2 when "0011" => seg<="00001100"; -- 3 when "0100" => seg<="10011000"; -- 4 when "0101" => seg<="01001000"; -- 5 when "0110" => seg<="01000000"; -- 6 when "0111" => seg<="00011010"; -- 7 when "1000" => seg<="00000000"; -- 8 when "1001" => seg<="00001000"; -- 9 when others => seg<="11111110";
end case;
end if;
end process;
end RTL;
DUT: BCD_7seg
- 7seg LEDのデコーダー -
入力: 0 ~ 9(BCD)-
ドット表示の有無で場合分けlibrary ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity BCD_7seg_tb is end BCD_7seg_tb;
architecture SIM of BCD_7seg_tb is component BCD_7seg
port( dot : in std_logic;
led : in std_logic_vector(3 downto 0);
seg : out std_logic_vector(7 downto 0));
end component;
signal dot : std_logic;
signal led : std_logic_vector(3 downto 0):="0000";
signal seg : std_logic_vector(7 downto 0);
constant STEP: time := 1 us;
begin
DUT: BCD_7seg port map (dot, led, seg);
end SIM;
configuration cfg_BCD_7seg_tb of BCD_7seg_tb is for SIM
ポートリストの無いエンティティ記述
テストモジュール:BCD_7segのコンポーネント宣言
BCD_7segの入出力信号で定義する
定数を定義するBCD_7segをDUTとしてインスタンスする
コンフィグレーションを定義する 入力信号の波形を定義する
(-
出力波形を記述し期待値照合を行う)波形記述
ライブラリ記述
BCD_7segのテストベンチ記述例①
constant STEP: time := 1 us;
begin
DUT: BCD_7seg port map (dot, led, seg);
process begin
wait for STEP; led <= led + '1';
end process;
process begin
dot <= '0'; wait for STEP*16;
dot <= '1'; wait for STEP*16;
assert false severity failure;
end process;
☆ BCD_7segの入力波形の記述 (前頁の 部分)
入力信号は、dot(スカラー) と led(ベクトル)
led
(3 downto 0)の入力信号を生成する- “000”~”1111”(0~15)を STEP(1us)単位で生成する -
無限に繰り返す入力信号:dotを生成する
- ‘0’を16 STEP間保持、
-
‘1’を16 STEP間保持後、-
assert文で強制終了するBCD_7segのテストベンチ記述例②
波形記述