まず始めに,組合せ回路の記述法から理解しましょう.先に示した半/全加 算器も組合せ回路です.もう少し複雑な組合せ回路の例として,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;
ここで注意することして,
std_logicタイプでは '0' や '1' の他に'X','U','Z'等が存在するという点
です,これらの入力パターンに対して全て記述する必要があります.つまり,
"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;
ホーム
もどる
辞書