Forum: FPGA, VHDL & Co. Frage zu Enumerations


von Didi (Gast)


Lesenswert?

Hallo,

in meinem Design habe ich ein Signal und ein Register definiert vom Typ 
color_type. color_type ist eine enumeration (so wie in C):
1
type color_type is (RED, GREEN, BLUE);

Gegenüber einem std_ulogic_vector erhöht es die Lesbarkeit. Ich würde 
deshalb auch in Entity-Ports color_type verwenden wollen.

Ist das eigentlch unproblematisch für die Synthese? Es sollte doch 
intern auf einen std_ulogic_vector mit 2 Bit abgebildet werden, oder? 
Was mich irritiert ist, das Quartus mir das Register von diesem Typ bei 
der Ressourcenanzeige unter "State Machines" auflistet...

von user (Gast)


Lesenswert?

Ja, das ist kein Problem für die Synthese.

Wahrscheinlich beschreibst du damit eine "State Machine", deswegen wird 
das als solche ausgewiesen. Wie es dargestellt wird kannst du einstellen 
-> one hot / binary usw

von Klaus F. (kfalser)


Lesenswert?

Didi schrieb:
> type color_type is (RED, GREEN, BLUE);
> Es sollte doch intern auf einen std_ulogic_vector
> mit 2 Bit abgebildet werden, oder?

Nein, darauf kann man sich so nicht verlassen, das hängt auch von den 
Compiler-Optionen ab.
Inbesonders wäre es nicht sauber, sich darauf zu verlassen dass RED auf 
0, GREEN auf 1 usw. gemappt wird.

Eine Möglichkeit wäre:
1
Subtype color_type is std_ulogic_vector(1 downto 0);
2
constant RED   : color_type := "00";
3
constant GREEN : color_type := "01";
4
constant BLUE  : color_type := "10";

von P. K. (pek)


Lesenswert?

Klaus Falser schrieb:
> Eine Möglichkeit wäre:
> Subtype color_type is std_ulogic_vector(1 downto 0);
>
> constant RED   : color_type := "00";
> constant GREEN : color_type := "01";
> constant BLUE  : color_type := "10";

Allerdings mit dem unschönen Nebeneffekt, dass die Simulation dann 
wieder "00", "01" und "10" anzeigt, statt der leserlichen Fraben...

von Sven P. (Gast)


Lesenswert?

Es funktioniert, wenn du den Aufzählungstyp dann auch konsequent 
benutzt. Solltest du irgendwo dann wieder Bitmasken benötigen, mach ein 
'case' oder eine LUT draus. Um den Rest darf sich die Synthese wieder 
kümmern, dafür ist die ja da.

Bei Xilinx kannst du die Kodierung beispielsweise mit dem 
ENUM_ENCODING-Attribut erzwingen. Ist aber vermutlich nicht portabel.
1
type ENUM_TYPE is (FIRST, SECOND, THIRD);
2
3
-- Xilinx:
4
attribute ENUM_ENCODING: STRING;
5
attribute ENUM_ENCODING of ENUM_TYPE: type is "00 01 10";
6
7
-- Portabel:
8
type ENUM_TYPE_ENCODING_VECTOR is array(ENUM_TYPE) of STD_LOGIC_VECTOR(1 downto 0);
9
constant ENUM_TYPE_ENCODING: ENUM_TYPE_ENCODING_VECTOR := ("00", "01", "10");
10
11
-- Benutzen:
12
signal ENU: ENUM_TYPE;
13
signal VEC: STD_LOGIC_VECTOR(1 downto 0);
14
VEC <= ENUM_TYPE_ENCODING(ENU);

von Thomas W. (donka)


Lesenswert?

Deshalb erstellt man sich am besten eine Konversationsfunktion und 
weisst dann das "color signal" durch diese Funktion den Ausgangsports 
zu!
 z.B.
1
function color_2_slv(color : color_type) return std_logic_vector is
2
    variable slv    : std_logic_vector(1 downto 0);
3
begin
4
    case color is
5
        when RED =>   slv := "00";
6
        when GREEN => slv := "01";
7
        when BLUE =>  slv := "10";
8
    end case;
9
    return slv;
10
end function;
11
12
...
13
14
color_output_port <= color_2_slv(color_signal);

Somit hat man definierte Werte und es ist portabel.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.