Files
XC3S400/sevseg.vhdl
2023-02-07 21:53:39 -03:00

164 lines
5.1 KiB
VHDL

----------------------------------------------------------------------------------
-- Company:
-- Engineer:
--
-- Create Date: 20:36:54 02/07/2023
-- Design Name:
-- Module Name: sevseg - Behavioral
-- Project Name:
-- Target Devices:
-- Tool versions:
-- Description:
--
-- Dependencies:
--
-- Revision:
-- Revision 0.01 - File Created
-- Additional Comments:
--
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
-- Uncomment the following library declaration if using
-- arithmetic functions with Signed or Unsigned values
--use IEEE.NUMERIC_STD.ALL;
-- Uncomment the following library declaration if instantiating
-- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
entity sevseg is
Port ( UINT16 : in STD_LOGIC_VECTOR (15 downto 0);
CLK : in STD_LOGIC;
SEGMENTS : out STD_LOGIC_VECTOR (7 downto 0);
DIGITS : out STD_LOGIC_VECTOR (3 downto 0)
);
end sevseg;
architecture Behavioral of sevseg is
signal DIGIT0: std_logic_vector (3 downto 0);
signal DIGIT1: std_logic_vector (3 downto 0);
signal DIGIT2: std_logic_vector (3 downto 0);
signal DIGIT3: std_logic_vector (3 downto 0);
signal SEGMENTS0: std_logic_vector (7 downto 0);
signal SEGMENTS1: std_logic_vector (7 downto 0);
signal SEGMENTS2: std_logic_vector (7 downto 0);
signal SEGMENTS3: std_logic_vector (7 downto 0);
signal digitsaux: std_logic_vector (3 downto 0);
begin
DIGIT0 <= UINT16 (3 downto 0);
DIGIT1 <= UINT16 (7 downto 4);
DIGIT2 <= UINT16 (11 downto 8);
DIGIT3 <= UINT16 (15 downto 12);
DIGITS <= not digitsaux;
process(UINT16)
begin
case DIGIT0 is
when "0000" => segments0 <= "00111111";
when "0001" => segments0 <= "00000110";
when "0010" => segments0 <= "01011011";
when "0011" => segments0 <= "01001111";
when "0100" => segments0 <= "01100110";
when "0101" => segments0 <= "01101101";
when "0110" => segments0 <= "01111101";
when "0111" => segments0 <= "00000111";
when "1000" => segments0 <= "01111111";
when "1001" => segments0 <= "01101111";
when "1010" => segments0 <= "01110111";
when "1011" => segments0 <= "01111100";
when "1100" => segments0 <= "00111001";
when "1101" => segments0 <= "01011110";
when "1110" => segments0 <= "01111001";
when "1111" => segments0 <= "01110001";
when others => segments0 <= "10000000";
end case;
case DIGIT1 is
when "0000" => segments1 <= "00111111";
when "0001" => segments1 <= "00000110";
when "0010" => segments1 <= "01011011";
when "0011" => segments1 <= "01001111";
when "0100" => segments1 <= "01100110";
when "0101" => segments1 <= "01101101";
when "0110" => segments1 <= "01111101";
when "0111" => segments1 <= "00000111";
when "1000" => segments1 <= "01111111";
when "1001" => segments1 <= "01101111";
when "1010" => segments1 <= "01110111";
when "1011" => segments1 <= "01111100";
when "1100" => segments1 <= "00111001";
when "1101" => segments1 <= "01011110";
when "1110" => segments1 <= "01111001";
when "1111" => segments1 <= "01110001";
when others => segments1 <= "10000000";
end case;
case DIGIT2 is
when "0000" => segments2 <= "00111111";
when "0001" => segments2 <= "00000110";
when "0010" => segments2 <= "01011011";
when "0011" => segments2 <= "01001111";
when "0100" => segments2 <= "01100110";
when "0101" => segments2 <= "01101101";
when "0110" => segments2 <= "01111101";
when "0111" => segments2 <= "00000111";
when "1000" => segments2 <= "01111111";
when "1001" => segments2 <= "01101111";
when "1010" => segments2 <= "01110111";
when "1011" => segments2 <= "01111100";
when "1100" => segments2 <= "00111001";
when "1101" => segments2 <= "01011110";
when "1110" => segments2 <= "01111001";
when "1111" => segments2 <= "01110001";
when others => segments2 <= "10000000";
end case;
case DIGIT3 is
when "0000" => segments3 <= "00111111";
when "0001" => segments3 <= "00000110";
when "0010" => segments3 <= "01011011";
when "0011" => segments3 <= "01001111";
when "0100" => segments3 <= "01100110";
when "0101" => segments3 <= "01101101";
when "0110" => segments3 <= "01111101";
when "0111" => segments3 <= "00000111";
when "1000" => segments3 <= "01111111";
when "1001" => segments3 <= "01101111";
when "1010" => segments3 <= "01110111";
when "1011" => segments3 <= "01111100";
when "1100" => segments3 <= "00111001";
when "1101" => segments3 <= "01011110";
when "1110" => segments3 <= "01111001";
when "1111" => segments3 <= "01110001";
when others => segments3 <= "10000000";
end case;
end process;
process (CLK)
begin
if(CLK'event and CLK = '1') then
case digitsaux is
when "0001" =>
digitsaux <= "0010";
SEGMENTS <= not segments1;
when "0010" =>
digitsaux <= "0100";
SEGMENTS <= not segments2;
when "0100" =>
digitsaux <= "1000";
SEGMENTS <= not segments3;
when others =>
digitsaux <= "0001";
SEGMENTS <= not segments0;
end case;
end if;
end process;
end Behavioral;