Los tipos enumerados son fáciles de declarar:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity enum is
end entity;
architecture foo of enum is
type ss_enum is (ss_0, ss_1, ss_2, ss_3, ss_4, ss_5, ss_6, ss_7, ss_8,
ss_9, ss_A, ss_B, ss_C, ss_D, ss_E, ss_F);
signal sseg: ss_enum;
signal hex_in: unsigned (3 downto 0) := "0000";
begin
COUNT:
process
begin
wait for 10 ns;
if hex_in < "1111" then
hex_in <= hex_in + 1;
else
wait;
end if;
end process;
LOOKUP_ENUM:
sseg <= ss_enum'VAL(to_integer(hex_in));
end architecture;
Este no es un tipo de enumeración de caracteres (todos sus miembros son identificadores).
Esencialmente, puede asociar un valor con un identificador o carácter literal. En este caso, la entrada del valor hexadecimal al bucle utilizado para producir su valor de visualización de siete segmentos también se usa para establecer el valor de una señal del tipo enumerado:
Puedeconsiderarlocomoinformaciónadicionalamenosqueuseeltipoenumeradocomoeltipodeíndiceparasubúsquedadevalordesietesegmentos.(YVHDLtepermitehacereso).
Si,comoDaveTweedsugierequedeseareconocerlosvaloresdesietesegmentosdeformadispersa,losasignaráasutipoenumerado:
architecturefieofenumistypess_enumis(ss_0,ss_1,ss_2,ss_3,ss_4,ss_5,ss_6,ss_7,ss_8,ss_9,ss_A,ss_B,ss_C,ss_D,ss_E,ss_F,unknown);signalsseg:ss_enum;signalseven_seg:unsigned(6downto0):="1000000";
function sseg_enum (sevenseg: std_logic_vector(6 downto 0))
return ss_enum is
begin
case sevenseg is
when "1000010" =>
return ss_D;
when others => -- we're going to fill this in, right?
return unknown;
end case;
end function;
begin
COUNT:
process
begin
wait for 10 ns;
if seven_seg < "1000100" then
seven_seg <= seven_seg + 1;
else
wait;
end if;
end process;
LOOKUP_ENUM:
sseg <= sseg_enum(std_logic_vector(seven_seg));
end architecture;
En este caso, la búsqueda dispersa se realiza con una función que usa una declaración de caso (y podemos ver que el ejemplo es escaso).
Puede ver que hay un valor de enumeración agregado para los valores de siete segmentos que no son útiles asignados.
Eso nos da:
Este método también se puede realizar en la mayoría de los visores de forma de onda de alguna manera generalmente no portátil. Porque en este caso, la señal de tipo enumerado no se usaría en ningún lugar donde se esperaría que se comiera la compuerta en síntesis. (Sin ningún puerto de salida asignado a los pines, este ejemplo completo de 'diseño' se comerá de todos modos).