• 検索結果がありません。

HEX3

ドキュメント内 論理回路設計 (ページ 62-76)

『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

加算

回路

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のテストベンチ記述例②

波形記述

ドキュメント内 論理回路設計 (ページ 62-76)

関連したドキュメント