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

SELS A

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

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文字)が可能 _

← ・・ ← ・・

[各文字と各セグメントの表示は、

テキスト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も同様の手順で作業する。

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

関連したドキュメント