Contador QUartus II VHDL


El objetivo es crear un contador con una salida en BCD 7 Segmentos

Codigo VHDL

--------------------------------------------------
LIBRARY ieee;
USE ieee.std_logic_1164.all;
--------------------------------------------------
ENTITY CONTADOR IS
PORT (clk, reset,direccion : IN STD_LOGIC;
digit1, digit2,digit3,digit4 : OUT STD_LOGIC_VECTOR (6 DOWNTO 0);
ajuste: OUT STD_LOGIC_VECTOR (3 DOWNTO 0);
posicion: OUT STD_LOGIC_VECTOR (2 DOWNTO 0));
END CONTADOR;
--------------------------------------------------
ARCHITECTURE CONTADOR OF CONTADOR IS
BEGIN
PROCESS(clk, reset, direccion)
VARIABLE temp1: INTEGER RANGE 0 TO 10;
VARIABLE temp2: INTEGER RANGE 0 TO 10;
VARIABLE temp3: INTEGER RANGE 0 TO 10;
VARIABLE temp4: INTEGER RANGE 0 TO 10;
VARIABLE temp5: INTEGER RANGE 0 TO 10;


BEGIN
---- counter: ----------------------

IF (reset='1') THEN
temp1 := 0;
temp2 := 0;
temp3 := 0;
temp4 := 0;

ELSIF (clk'EVENT AND clk='1') THEN
CASE direccion IS
WHEN '0'=>
temp1 := temp1 + 1;
IF (temp1=10) THEN
temp1 := 0;
temp2 := temp2 + 1;
IF (temp2=10) THEN
temp2 := 0;
temp3 := temp3+1;
IF (temp3=10) THEN
temp3 := 0;
temp4 := temp4+1;
IF (temp4=10) THEN
temp4 := 0;
END IF;
END IF;
END IF;
END IF;

WHEN '1'=>
temp1 := temp1 - 1;
IF (temp1=10) THEN
temp1 := 9;
temp2 := temp2 - 1;
IF (temp2=10) THEN
temp2 := 9;
temp3 := temp3-1;
IF (temp3=10) THEN
temp3 := 9;
temp4 := temp4-1;
IF (temp4=10) THEN
temp4 := 0;

END IF;
END IF;
END IF;
END IF;
END CASE;
END IF;

---- BCD to SSD conversion: --------
CASE temp1 IS
WHEN 0 => digit1 <= "1111110";
WHEN 1 => digit1 <= "0110000";
WHEN 2 => digit1 <= "1101101";
WHEN 3 => digit1 <= "1111001";
WHEN 4 => digit1 <= "0110011";
WHEN 5 => digit1 <= "1011011";
WHEN 6 => digit1 <= "1011111";
WHEN 7 => digit1 <= "1110000";
WHEN 8 => digit1 <= "1111111";
WHEN 9 => digit1 <= "1111011";
WHEN OTHERS => NULL;
END CASE;
CASE temp2 IS
WHEN 0 => digit2 <= "1111110";
WHEN 1 => digit2 <= "0110000";
WHEN 2 => digit2 <= "1101101";
WHEN 3 => digit2 <= "1111001";
WHEN 4 => digit2 <= "0110011";
WHEN 5 => digit2 <= "1011011";
WHEN 6 => digit2 <= "1011111";
WHEN 7 => digit2 <= "1110000";
WHEN 8 => digit2 <= "1111111";
WHEN 9 => digit2 <= "1111011";
WHEN OTHERS => NULL;
END CASE;
CASE temp3 IS
WHEN 0 => digit3 <= "1111110";
WHEN 1 => digit3 <= "0110000";
WHEN 2 => digit3 <= "1101101";
WHEN 3 => digit3 <= "1111001";
WHEN 4 => digit3 <= "0110011";
WHEN 5 => digit3 <= "1011011";
WHEN 6 => digit3 <= "1011111";
WHEN 7 => digit3 <= "1110000";
WHEN 8 => digit3 <= "1111111";
WHEN 9 => digit3 <= "1111011";
WHEN OTHERS => NULL;
END CASE;
CASE temp4 IS
WHEN 0 => digit4 <= "1111110";
WHEN 1 => digit4 <= "0110000";
WHEN 2 => digit4 <= "1101101";
WHEN 3 => digit4 <= "1111001";
WHEN 4 => digit4 <= "0110011";
WHEN 5 => digit4 <= "1011011";
WHEN 6 => digit4 <= "1011111";
WHEN 7 => digit4 <= "1110000";
WHEN 8 => digit4 <= "1111111";
WHEN 9 => digit4 <= "1111011";
WHEN OTHERS => NULL;
END CASE;
END PROCESS;
END CONTADOR;
--------------------------------------------------