# 点亮数字人生

# 基础需求

- 直接把二进制输入转化为七段码，注意 `8 4 2 1` 译码器只能显示 `1~9` 位的数字

```vhdl
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY lighten IS
 PORT (
  key : IN STD_LOGIC_VECTOR(3 DOWNTO 0); --控制开关
  display : OUT STD_LOGIC_VECTOR(6 DOWNTO 0); --不带译码器
  display_4 : OUT STD_LOGIC_VECTOR(3 DOWNTO 0) --带译码器

 );
END lighten;

ARCHITECTURE bhv OF lighten IS

BEGIN
 display_4 <= key; --带译码器的可以直接输出开关值
 PROCESS (key) --不带译码器的需要进行译码处理
 BEGIN
  CASE key IS --以下是0/8/F 的编码规则
   WHEN"0000" => display <= "1111110"; --0
   WHEN"0001" => display <= "0110000"; -- 1
   WHEN"0010" => display <= "1101101"; -- 2
   WHEN"0011" => display <= "1111001"; --3
   WHEN"0100" => display <= "0110011"; --4
   WHEN"0101" => display <= "1011011"; --5
   WHEN"0110" => display <= "0011111"; --6
   WHEN"0111" => display <= "1110000"; --7
   WHEN"1000" => display <= "1111111"; --8
   WHEN"1001" => display <= "1110011"; --9
   WHEN"1010" => display <= "1110111"; --10
   WHEN"1011" => display <= "0011111"; --11
   WHEN"1100" => display <= "1001110"; --12
   WHEN"1101" => display <= "0111101"; --13
   WHEN"1110" => display <= "1001111"; --14
   WHEN"1111" => display <= "1000111"; --15
   WHEN OTHERS => display <= "0000000"; --其他情况全灭
  END CASE;
 END PROCESS;
END bhv;
```

# 提高需求

- 有规律地显示一段号码

```vhdl
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;

entity couter_4 is
	port(
		light_even_4: out std_logic_vector(3 downto 0);
		light_odd_4: out std_logic_vector(3 downto 0);
		light_natural_7: out std_logic_vector(6 downto 0);
		clk,rst: in std_logic
	);
end couter_4;

architecture lighting of couter_4 is
	signal signal_natural_4:std_logic_vector(3 downto 0):="0000";
	signal signal_odd_4:std_logic_vector(3 downto 0):="0001";
	signal signal_even_4:std_logic_vector(3 downto 0):="0000";
begin
	process(clk, rst)
	begin
		if (clk'event and clk='1') then
			if (signal_natural_4="1111") then
				signal_natural_4<="0000";
			else
				signal_natural_4<=signal_natural_4+'1';
			end if;
			
			if (signal_even_4="1000") then
				signal_even_4<="0000";
			else
				signal_even_4<=signal_even_4+2;
			end if;
			
			if (signal_odd_4="1001") then
				signal_odd_4<="0001";
			else
				signal_odd_4<=signal_odd_4+2;
			end if;
		end if;
		if (rst='1') then
			signal_natural_4<="0000";
			signal_odd_4<="0001";
			signal_even_4<="0000";
		end if;
	end process;
	
	process(signal_even_4)
	begin
		light_even_4<=signal_even_4;
	end process;
	
	process(signal_odd_4)
	begin
		light_odd_4<=signal_odd_4;
	end process;
	
	process(signal_natural_4)
	begin
		case signal_natural_4 is
			when "0000"=>light_natural_7<="1101101"; -- 2
			when "0001"=>light_natural_7<="1111110"; -- 0
			when "0010"=>light_natural_7<="1101101"; -- 2
			when "0011"=>light_natural_7<="1111110"; -- 0
			when "0100"=>light_natural_7<="1111110"; -- 0
			when "0101"=>light_natural_7<="0110000"; -- 1
			when "0110"=>light_natural_7<="1101101"; -- 2
			when "0111"=>light_natural_7<="1111001"; -- 3
			when "1000"=>light_natural_7<="0011111"; -- 6
			when "1001"=>light_natural_7<="1111001"; -- 3
			when "1010"=>light_natural_7<="1101101"; -- 2
			when "1011"=>light_natural_7<="1111110"; -- 0
			when "1100"=>light_natural_7<="1101101"; -- 2
			when "1101"=>light_natural_7<="1101101"; -- 2
			when "1110"=>light_natural_7<="1001111";
			when "1111"=>light_natural_7<="1000111";
			when others=>light_natural_7<="0000000";
		end case;
	end process;
end lighting;
```