OpenCores
URL https://opencores.org/ocsvn/System09/System09/trunk

Subversion Repositories System09

[/] [System09/] [trunk/] [rtl/] [VHDL/] [SevenSegmentDisplay.vhd] - Rev 159

Go to most recent revision | Compare with Previous | Blame | View Log

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
 
--  Uncomment the following lines to use the declarations that are
--  provided for instantiating Xilinx primitive components.
--library UNISIM;
--use UNISIM.VComponents.all;
 
entity SevenSegmentDisplay is
    Port ( Clk : in std_logic;
           Reset : in std_logic;
           Value0 : in std_logic_vector(3 downto 0);
           Value1 : in std_logic_vector(3 downto 0);
           Value2 : in std_logic_vector(3 downto 0);
           Value3 : in std_logic_vector(3 downto 0);
			  DPs    : in std_logic_vector(3 downto 0);
			  Blanks	: in std_logic_vector(3 downto 0);
           DigitSelect : out std_logic_vector(3 downto 0);
           Segments : out std_logic_vector(7 downto 0));
end SevenSegmentDisplay;
 
architecture Behavioral of SevenSegmentDisplay is
 
	signal ClockDivider		: std_logic_vector(13 downto 0);
	signal WhichDigit			: std_logic_vector(1 downto 0);
	signal Result				: std_logic_vector(7 downto 0);
	signal DigitValue			: std_logic_vector(3 downto 0);
	signal DP					: std_logic;
	signal Blank				: std_logic;
 
	component DecoderDriver
	port(
		DigitValue	: in std_logic_vector(3 downto 0);
		DP				: in std_logic;
		Blank			: in std_logic;
		Segments		: out std_logic_vector(7 downto 0));
	end component;
 
begin
 
	process(Reset,Clk) is
	begin
		if Reset = '1' then
			ClockDivider <= (others => '0');
			WhichDigit   <= "00";
			DigitSelect	<= "1111";
		elsif Clk = '1' and Clk'Event then
			if ClockDivider = "11000011010011" then
				ClockDivider <= (others => '0');
				Segments <= Result;
				case WhichDigit is	-- note that everything is pipelined
					when "00" => 
						DigitSelect <= "1110"; 
						DigitValue <= Value1; 
						DP <= DPs(1); 
						Blank <= Blanks(1);
					when "01" => 
						DigitSelect <= "1101"; 
						DigitValue <= Value2; 
						DP <= DPs(2); 
						Blank <= Blanks(2);
					when "10" => 
						DigitSelect <= "1011"; 
						DigitValue <= Value3; 
						DP <= DPs(3); 
						Blank <= Blanks(3);
					when "11" => 
						DigitSelect <= "0111"; 
						DigitValue <= Value0; 
						DP <= DPs(0); 
						Blank <= Blanks(0);
					when others => null;
				end case;
				WhichDigit <= WhichDigit + 1;
			else
				ClockDivider <= ClockDivider + 1;
			end if;
		end if;
	end process;
 
	Inst_DecoderDriver: DecoderDriver PORT MAP (
		DigitValue => DigitValue,
		DP => DP,
		Blank => Blank,
		Segments => Result
	);
 
end Behavioral;
 

Go to most recent revision | Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.