まず始めに,組合せ回路の記述法から理解しましょう.先に示した半/全加 算器も組合せ回路です.もう少し複雑な組合せ回路の例として,7セグメント・ デコーダを設計してみます.7セグメント・デコーダは,下図のように8の字型 に並べられた7つの発光ダイオード(LED)を,入力した4ビットの値に応じて16 進数表示するように制御するために使用します.
図:7セグメントLED
VHDLによる記述は3とおりほど考えられます.
-- ライブラリ宣言 library IEEE; use IEEE.std_logic_1164.all; -- エンティティ宣言 entity seven_seg is port (din : in std_logic_vector(3 downto 0); dout : out std_logic_vector(7 downto 0) ); end seven_seg; -- アーキテクチャ本体 architecture seven_seg_body of seven_seg is begin dout <= "11111100" when din = "0000" else "01100000" when din = "0001" else "11011010" when din = "0010" else "11110010" when din = "0011" else "01100110" when din = "0100" else "10110110" when din = "0101" else "10111110" when din = "0110" else "11100000" when din = "0111" else "11111110" when din = "1000" else "11110110" when din = "1001" else "11101110" when din = "1010" else "00111110" when din = "1011" else "10011100" when din = "1100" else "01111010" when din = "1101" else "10011110" when din = "1110" else "10001110" when din = "1111" else "00000000"; -- 残り全部 end seven_seg_body;
"10001110" when din = "1111" else "00000000"; -- 残り全部
-- ライブラリ宣言 library IEEE; use IEEE.std_logic_1164.all; -- エンティティ宣言 entity seven_seg is port (din : in std_logic_vector(3 downto 0); dout : out std_logic_vector(7 downto 0) ); end seven_seg; -- アーキテクチャ本体 architecture seven_seg_body of seven_seg is begin with din select dout <= "11111100" when "0000", "01100000" when "0001", "11011010" when "0010", "11110010" when "0011", "01100110" when "0100", "10110110" when "0101", "10111110" when "0110", "11100000" when "0111", "11111110" when "1000", "11110110" when "1001", "11101110" when "1010", "00111110" when "1011", "10011100" when "1100", "01111010" when "1101", "10011110" when "1110", "10001110" when "1111", "00000000" when others; -- 残り全部 end seven_seg_body;
"00000000" when others; -- 残り全部
-- ライブラリ宣言 library IEEE; use IEEE.std_logic_1164.all; -- エンティティ宣言 entity seven_seg is port (din : in std_logic_vector(3 downto 0); dout : out std_logic_vector(7 downto 0) ); end seven_seg; -- アーキテクチャ本体 architecture seven_seg_body of seven_seg is begin process(din) begin case din is when "0000" => dout <= "11111100"; when "0001" => dout <= "01100000"; when "0010" => dout <= "11011010"; when "0011" => dout <= "11110010"; when "0100" => dout <= "01100110"; when "0101" => dout <= "10110110"; when "0110" => dout <= "10111110"; when "0111" => dout <= "11100000"; when "1000" => dout <= "11111110"; when "1001" => dout <= "11110110"; when "1010" => dout <= "11101110"; when "1011" => dout <= "00111110"; when "1100" => dout <= "10011100"; when "1101" => dout <= "01111010"; when "1110" => dout <= "10011110"; when "1111" => dout <= "10001110"; when others => dout <= "00000000"; end case; end process; end seven_seg_body;
-- ライブラリ宣言 library IEEE; use IEEE.std_logic_1164.all; -- エンティティ宣言 entity seven_seg is port (din : in std_logic_vector(3 downto 0); dout : out std_logic_vector(7 downto 0) ); end seven_seg; -- アーキテクチャ本体 architecture seven_seg_body of seven_seg is begin process(din) begin if din = "0000" then dout <= "11111100"; elsif din = "0001" then dout <= "01100000"; elsif din = "0010" then dout <= "11011010"; elsif din = "0011" then dout <= "11110010"; elsif din = "0100" then dout <= "01100110"; elsif din = "0101" then dout <= "10110110"; elsif din = "0110" then dout <= "10111110"; elsif din = "0111" then dout <= "11100000"; elsif din = "1000" then dout <= "11111110"; elsif din = "1001" then dout <= "11110110"; elsif din = "1010" then dout <= "11101110"; elsif din = "1011" then dout <= "00111110"; elsif din = "1100" then dout <= "10011100"; elsif din = "1101" then dout <= "01111010"; elsif din = "1110" then dout <= "10011110"; elsif din = "1111" then dout <= "10001110"; else dout <= "00000000"; end if; end process; end seven_seg_body;
process( センシティビティリスト ) begin 順次処理の記述 end process;