第 回 VHDL 演習組み合せ論理回路 VHDL に関する演習を行う 今回は, 組み合せ論理回路の記述について学ぶ - 論理回路の VHDL 記述の基本 同時処理文を並べることで記述できる 部品の接続関係を記述 順番は関係ない process 文の内部では, 順次処理文を使う process 文 つで, つの同時処理文になる順次処理文は, 回路の動作を 逐次処理的 に ( 手続き処理型プログラム言語のように ) 記述できる 分かりやすくなる注意 : 回路動作そのものが逐次処理になるわけではない process 文は, 組み合せ論理回路にも, 順序回路にも使える ステートマシンの記述に適す ステートマシンの記述には process 文を使う ( 同時処理文だけでも記述できるが, 設計が大変 ) マイクロプロセッサとインタフェース講義資料 -
- VHDL 演習 ( 組み合せ論理回路 ) 回路 半加算器 (half adder,fig.-) 全加算器を構成する要素である半加算器を作成する i) リスト - のコードを理解してから, コンパイル, ダウンロードする ii) 実験基板上のスイッチ W, が, の入力,LED, が, の出力となる すべての組み合せを入力し,LED の出力から回路の動作を確認, 真理値表を作成せよ リスト - 半加算器 use IEEE.TD_LOGIC_6.LL; use IEEE.TD_LOGIC_RITH.LL; use IEEE.TD_LOGIC_UNIGNED.LL; entity Half_adder is,:in std_logic;, :out std_logic end Half_adder; architecture ehavioral of Half_adder is <= xor ; <= and ; end ehavioral; Fig.- 半加算器 半加算器 桁分の加算のための基本回路 ( 下位からの桁上げ無し ) 入力 bit, 出力 bit + - マイクロプロセッサとインタフェース講義資料
回路 全加算器 (full adder Fig.-) 半加算器を用いて全加算器を記述する 構造化記述を理解する ⅰ) リスト - のコードを理解してから, コンパイル, ダウンロードする ⅱ) 実験基板上のスイッチ W,, が,, の入力,LED, が, の出力となる すべての組み合せを入力し,LED の出力から回路の動作を確認, 真理値表を作成せよ Full dder リスト - 全加算器 use IEEE.TD_LOGIC_6.LL; use IEEE.TD_LOGIC_RITH.LL; use IEEE.TD_LOGIC_UNIGNED.LL; entity Full_adder is,,:in std_logic;, :out std_logic end Full_adder; architecture ehavioral of Full_adder is component Half_adder port (,:in std_logic;,: out std_logic end component; signal U_,U_,U_: std_logic; U: Half_adder port map (,, U_, U_ U: Half_adder port map (U_,,, U_ <= U_ or U_; end ehavioral; としてもよい Half dder Fig.- 全加算器 Half dder 構造化記述コンポーネント宣言下位モジュールをコンポーネントとして呼び出す際に, コンポーネントの形を宣言する component コンポーネント名ポート宣言 end component; コンポーネント インスタンス文下位モジュールを呼び出し 信号と下位モジュールのポートを結びつけるラベル名 : コンポーネント名 port map ( 信号, 結合のさせ方には以下の二通りがある 位置による結合信号とポートを, ポート文で書かれた順番に結合 名前による結合 port map の信号の部分にポート名 => 信号名と記述することで結合を指定可能 全加算器 桁分の加算のための基本回路 ( 下位からの桁上げ有り ) 入力 bit, 出力 bit C + U_ U_ U_ 5 マイクロプロセッサとインタフェース講義資料 -
演習 半加算器 (H) 及び全加算器 (F) を再利用して,Fig.- のような bit 加算器を設計する その VHDL コードはリスト - のようになる この中で用いられているコンポーネント インスタンスの文の上位及び下位モジュール同士のポート接続関係を示す部分は~9にて記述する これらの部分を埋めてリスト - の VHDL コードを完成させよ dder_ リスト - bit 加算器の VHDL コード use IEEE.TD_LOGIC_6.LL; use IEEE.TD_LOGIC_RITH.LL; use IEEE.TD_LOGIC_UNIGNED.LL; entity dder_ is Port ( : in std_logic_vector( downto : in std_logic_vector( downto Y : out std_logic_vector( downto ) end dder_; architecture TRUCTURE of dder_ is component Half_adder is,:in std_logic;, :out std_logic end component; component Full_adder is,,:in std_logic;, :out std_logic end component; signal U_C,U_C,U_C : std_logic; () () () () () () () () H F F F H F F F U_C U_C U_C Y() Y() Y() Y() Y() H : Half_adder port map (,,, F : Full_adder port map (5, 6, 7, 8, 9 F : Full_adder port map (,,,, F : Full_adder port map (5, 6, 7, 8, 9 Fig.- bit 加算器 End TRUCTURE; 7 8 9 7 8 9 - マイクロプロセッサとインタフェース講義資料
process 文 ハードウェアを逐次処理文によって記述 [< ラベル名 >] : process [< センシティビティリスト >] [ 宣言文 ] [ 逐次処理文による記述 ] end process [< ラベル名 >] CLK <= CKG or G; process(clk,r) if R = then Q <= ; if CLK event and CLK = then Q <= Q+; end process; R <= C and G; C G CKG R Q Q Q CLK 逐次処理文による記述 ( プロセス文の中身 ) は C 言語などと同様に, 文の順番が意味を持つ つのプロセス文は, 他の文に対して同時処理文として処理されるステートマシンの記述に使われることが多いが, 組合せ論理回路の記述にも使用可能 回路 マルチプレクサ (Fig.-) 選択信号の入力により出力を切り替えるマルチプレクサの動作を理解する process 文および if 文の文法を学ぶ i) リスト - のコードを理解してから, コンパイル, ダウンロードする ii) 実験基板上のスイッチ W, が, の入力,W が の入力となる W の値により Y の値が出力される L の切り替わる様子を確認せよ リスト - マルチプレクサ use IEEE.TD_LOGIC_6.LL; use IEEE.TD_LOGIC_RITH.LL; use IEEE.TD_LOGIC_UNIGNED.LL; entity MUX is,:in std_logic; :in std_logic; Y :out std_logic end MUX; architecture ehavioral of MUX is process(,,) process 文内では, 手続き言語プ if ='' then Y <= ; ログラムのように, 逐次処理的 else Y <= ; に動作を表す! end process; end ehavioral; Fig.- マルチプレクサ Y process 文上から順番に処理される順次処理文を記述する [< ラベル名 >]:process [< センシティビティリスト >] [ 宣言文 ] [ 順次処理文による記述 ] end process [< ラベル名 >] センシティビティリスト : このリストに指定した信号に変化が生じたときに ~end process 内の記述を実行する つのプロセス文は, 他の文に対して同時処理文として処理される if 文,case 文等は process 文の内部でのみ記述できる if 文 条件分岐を伴う回路を記述する際に使用する if 条件 then 条件成立の時の処理 ; else 条件不成立の時の処理 ; 複数の条件で分岐を行う場合は以下のように記述する if 条件 then 条件 成立の時の処理 ; elsif 条件 then 条件 成立の時の処理 ; elsif 条件 n then 条件 n 成立の時の処理 ; else 条件 ~n が全て不成立の時の処理 *Fig.- の回路は,ND-OR elector とも呼ばれる マイクロプロセッサとインタフェース講義資料 -5
回路 5 7 セグメントデコーダ (Fig.-5) デコーダ回路を利用した 7 セグメント LED の駆動回路を作成する case 文の文法を理解する ⅰ) リスト -5 のコードを理解してから, コンパイル, ダウンロードする ⅱ)W~ を用いて入力を変化させ,7 セグメントデコーダの動作を確認する ⅲ) 桁の 7 セグメントデコーダに, 各自の学籍番号を表示するにはどうすればよいか 百の位, 十の位, 一の位の出力をそれぞれ Y,Y,Y とし, 代入文 (Y<= ; など ) のみを記せ リスト -5 7 セグメントデコーダ use IEEE.TD_LOGIC_6.LL; use IEEE.TD_LOGIC_RITH.LL; use IEEE.TD_LOGIC_UNIGNED.LL; entity Decoder is : in std_logic_vector( downto Y: out std_logic_vector(6 downto ) end Decoder; architecture ehavioral of Decoder is process() case is when "" => Y <= ""; when "" => Y <= ""; when "" => Y <= ""; when "" => Y <= ""; when "" => Y <= ""; when "" => Y <= ""; when "" => Y <= ""; when "" => Y <= ""; when "" => Y <= ""; when "" => Y <= ""; when others => Y <= ""; end case; end process; end ehavioral; 複数ビットの扱い方 std_logic_vector( N downto N+ ビットの信号を扱うことが可能 M が一番大きい数字の場合 downto,m が の場合は to を用いる 信号名 (i) とすることで i 番目の値, 信号名 (i downto j) とすることで i 番目から j 番目までの複数のビットを取り出すことができる case 文信号の値により動作を切り替える回路を記述する際に使用する case 信号 is when 値 => 文 ; -- 信号が値 の時の動作を記述 when 値 => 文 ; -- 信号が値 の時の動作を記述 when others => 文 ;-- 全てに該当しなかった時の記述 end case; () () () () Y() Y() Y() Y() Y() Y(5) Y(6) Fig.-5 7 セグメント LED 用デコーダ -6 マイクロプロセッサとインタフェース講義資料
演習 7 セグメントデコーダ ( リスト -5) 入力 W~W で設定される入力 ()~() と 7 セグメント LED に表示された文字パターンの全ての組み合せを示せ. 文字パターンの図示の例 参考文献 ) 小川晃 :PLD MTER Digital Technical olutions, マイクロアプリケーションラボラトリー () ) 長谷川裕恭 :VHDL によるハードウェア設計入門,CQ 出版社 (995) ) 吉田, 尾知 :VHDL で学ぶディジタル回路設計,CQ 出版社 () ) 坂巻佳寿美 : 見てわかる VHDL, 工業調査会 () マイクロプロセッサとインタフェース講義資料 -7
演習問題の解答例演習 component 文による ビット加算回路の構成 ( リスト -) 半加算器 (H) 及び全加算器 (F) を再利用して,Fig.- のような bit 加算器を設計する その VHDL コードはリスト - のようになる この中で用いられているコンポーネント インスタンスの文の上位及び下位モジュール同士のポート接続関係を示す部分は ~9 にて記述する これらの部分を埋めてリスト - の VHDL コードを完成させよ 解答欄 () () Y() U_C 5 () 6 () 7 U_C 8 Y() 9 U_C () () U_C Y() U_C 5 () 6 () 7 U_C 8 Y() 9 Y() # 上の回答例は,Fig.- の回路図通りの構成を実現するためのものです 実際には,half adder および full adder への入力ビットの順番が変わっても, 外から見た ビット加算器としての機能に変わりはありません つまり, と,5~7,~,5~7 のそれぞれの組の中での順番は変わっても構いません, もちろん, これは full adder や half adder の特性から来るものです 演習 7 セグメントデコーダ ( リスト -5) 入力 pg~pg と 7 セグメント LED に表示された文字パターンを示せ.,, PG()~PG() = のとき PG()~PG() = のとき PG()~PG() = のとき 5 6 PG()~PG() = のとき PG()~PG() = のとき PG()~PG() = のとき PG()~PG() = のとき 6 PG()~PG() = のとき PG()~PG() = のとき PG()~PG() = のとき PG()~PG() = ~ のとき 解説 日の字型パターン を持つ 7 セグメント LED で数字を表示するための回路の例です when 構文を使っています 入力の 進数が ( 進数の ) 以上では表示は E となるようにしています 桁分の表示なので,~ までしか入力しないことを前提にしていても,when 構文では全ての場合について出力を記述します -8 マイクロプロセッサとインタフェース講義資料