> Ok, das heißt also, dass ich zwar eine synthetisierbare Funktion
> aufrufe, diese aber nur verwendet wird um eine weitere Konstante zu
> bestimmen?
Ich möchte sehr stark bezweifeln, dass du die log2() Funktion
tatsächlich synthetisiert bekommst...
> Ist das nicht trotzdem total ineffizient, weil erst mal die
> selbstdefinierte Funktion interpretiert werden muss?
Das passiert ja nur 1 mal auf dem Syntheserechner.
> Eine in der Sprache VHDL verankerte Funktion für log2 wäre halt
> deutlich besser
Was bringt dich auf diesen Gedanken? Es sind die Basisoperatoren in VHDL
definiert. Und es ist nachgewiesen, dass mit diesen Basisoperatoren alle
nötigen Berechnungen angestellt werden können.
In C mußt du Libraries einbinden, um bestimmte naheliegende Funktionen
aufrufen zu können. Und genau das passiert hier auch:
1 | USE ieee.math_real.log2;
|
2 | USE ieee.math_real.ceil;
|
3 | :
|
4 | constant COUNT_WIDTH : integer := INTEGER(CEIL(LOG2(REAL(COUNT_MAX+1))));
|
5 | signal cnt : unsigned (COUNT_WIDTH-1 downto 0) := (others=>'0');
|
Und dann ist LOG2() wieder nur ein Funktionsaufruf.
> VHDL ist doch doof! :D
Ja, VDHL ist eben VHDL. Besser, du findest dich längerfristig damit ab,
dass VHDL viel mehr kann, als ein Synthesizer kann... ;-)
Till schrieb:
>> Oder gibt es einen Grund, warum "meinTyp" auf einen Vector anderer
>> Breite abgebildet werden könnte?
Ja. NAND-Flash-Zellen können z.B. mehr als 1 Bit speichern. Du brauchst
um das in VHDL zu beschreiben also z.B. eine Logik, die 8 Zustände (3
Bit) auf 1 Speicherzelle abbilden kann. Damit wäre dann eine
Integer-Busbreite von 32 Bit auf einmal ein Vektor mit einer Breite von
11 Speicherzellen.
Und spätestens dann kommst du auch mit einer eingebauten log2() Funktion
nicht sehr weit...