7セグメント・デコーダ
7セグメントLEDのデコーダをモジュール化した。
iValue(4bit)に応じた値 (0-F) を出力する。
デコード値はconstantで設定している。
kDigitがデコード値を格納した2次元配列になっていて、
例えばkDigit(3)は7セグメントLEDで3を表示する値となる。
iValueの値をconv_integerでintegerに変換するだけ。
library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_misc.all; use IEEE.std_logic_arith.all; use IEEE.std_logic_unsigned.all; entity Decoder7seg is port ( CLOCK_50 : in std_logic; RESET_N : in std_logic; iEnable : in std_logic; iValue : in std_logic_vector( 3 downto 0); oEncValue : out std_logic_vector( 6 downto 0) ); end Decoder7seg; architecture RTL of Decoder7seg is -- -- 0 -- -- 5 1 -- -- 6 -- -- 4 2 -- -- 3 -- constant kDigit0 : std_logic_vector(6 downto 0) := "1000000"; constant kDigit1 : std_logic_vector(6 downto 0) := "1111001"; constant kDigit2 : std_logic_vector(6 downto 0) := "0100100"; constant kDigit3 : std_logic_vector(6 downto 0) := "0110000"; constant kDigit4 : std_logic_vector(6 downto 0) := "0011001"; constant kDigit5 : std_logic_vector(6 downto 0) := "0010010"; constant kDigit6 : std_logic_vector(6 downto 0) := "0000010"; constant kDigit7 : std_logic_vector(6 downto 0) := "1111000"; constant kDigit8 : std_logic_vector(6 downto 0) := "0000000"; constant kDigit9 : std_logic_vector(6 downto 0) := "0010000"; constant kDigitA : std_logic_vector(6 downto 0) := "0001000"; constant kDigitB : std_logic_vector(6 downto 0) := "0000011"; constant kDigitC : std_logic_vector(6 downto 0) := "1000110"; constant kDigitD : std_logic_vector(6 downto 0) := "0100001"; constant kDigitE : std_logic_vector(6 downto 0) := "0000110"; constant kDigitF : std_logic_vector(6 downto 0) := "0001110"; type tDigitSelect is array(0 to 15) of std_logic_vector(6 downto 0); constant kDigit : tDigitSelect := ( kDigit0, kDigit1, kDigit2, kDigit3, kDigit4, kDigit5, kDigit6, kDigit7, kDigit8, kDigit9, kDigitA, kDigitB, kDigitC, kDigitD, kDigitE, kDigitF ); signal sEnable : std_logic; signal sValue : std_logic_vector( 3 downto 0); begin -- Retiming Input signal process (CLOCK_50, RESET_N) is begin if RESET_N = '0' then sEnable <= '0'; sValue <= (others => '0'); elsif rising_edge(CLOCK_50) then sEnable <= iEnable; sValue <= iValue; end if; end process; -- Encode data process (CLOCK_50, RESET_N) is begin if RESET_N = '0' then oEncValue <= (others => '1'); elsif rising_edge(CLOCK_50) then if (sEnable = '0') then oEncValue <= (others => '1'); else oEncValue <= kDigit(conv_integer(sValue)); end if; end if; end process; end RTL;