Forum: FPGA, VHDL & Co. Comparator Simulationsproblem


von T.M. (Gast)


Lesenswert?

Tag auch.

Entweder ich steh auf dem Schlauch oder der Simulator hat ein Problem.
Ich arbeite im Moment ein Buch über Synthese durch, in dem für diverse
Schaltungen verschiedene mögliche Implementierungen vorgestellt werden.
Naja, lange Rede, kurzer Sinn: Code eines Komparators:
1
  p0 :PROCESS (a, b) IS
2
  BEGIN
3
    less    <= '0';
4
    equal   <= '1';
5
    greater <= '0';
6
    FOR index IN a'RANGE LOOP
7
      IF a(index) AND (NOT b(index)) THEN
8
        equal   <= '0';
9
        greater <= '1';
10
        EXIT;
11
      ELSIF (NOT a(index)) AND b(index) THEN
12
        less  <= '1';
13
        equal <= '0';
14
        EXIT;
15
      END IF;
16
    END LOOP;
17
  END PROCESS p0;
18
19
END ARCHITECTURE rtl1;

Rein funktionell sieht der Code fehlerfrei aus. Nur meckert mir der
Simulator rum:
gle.vhd:34:19: no function declarations for operator "and"
gle.vhd:38:28: no function declarations for operator "and"

Ich bin ratlos... AND ist doch im std_logic_1164 Library auch für
std_logic-Typen definiert...

Sonst muss ich halt mal in GHDL-Maillist fragen.

Danke für Anregungen.

T.M.


=============================
http://editthis.info/freefpga
=============================

von T.M. (Gast)


Lesenswert?

Ich habe es jetzt folgendermassen geändert, damit läuft der Simulator
ohne zu Murren:
1
ARCHITECTURE rtl1 OF gle IS
2
BEGIN
3
4
  p0 :PROCESS (a, b) IS
5
  BEGIN
6
    less    <= '0';
7
    equal   <= '1';
8
    greater <= '0';
9
    FOR index IN a'RANGE LOOP
10
      IF (a(index) = '1') AND (b(index) = '0') THEN
11
        equal   <= '0';
12
        greater <= '1';
13
        EXIT;
14
      ELSIF (a(index) = '0') AND (b(index) = '1') THEN
15
        less  <= '1';
16
        equal <= '0';
17
        EXIT;
18
      END IF;
19
    END LOOP;
20
  END PROCESS p0;
21
22
END ARCHITECTURE rtl1;
Fragt sich nur, ob die Synthese das gleiche draus macht wie oben. Oder
ob da einzelne bitweise Komparatoren inferriert werden. Werd ich Morgen
mal schauen. Und ob der ISE/Modelsim auch so mäklich ist...

T.M.


=============================
http://editthis.info/freefpga
=============================

von Klaus F. (kfalser)


Lesenswert?

Das Problem liegt wahrscheinlich daran, dass

a(index) AND b(index)

wiederum einen std_logic Wert ergeben. In der IF Bedingung wird aber
ein bool'scher Wert verlangt, also z.B.

(a(index) AND b(index)) == '1'

Grüße
Klaus

von T.M. (Gast)


Lesenswert?

Ja, das ergibt Sinn. Dann ist das Buch an der Stelle (wie leider auch an
anderen) nicht ganz korrekt. Ich nehme mal an, dass es andere
Simulatoren da nicht so genau nehmen, werd ich mal ausprobieren.

von FPGAküchle (Gast)


Lesenswert?

Es ist wie in C++ man kann Operatoren sind in VHDL polymorph (?).


- "AND" ist letzendlich ein Funktionsaufruf. Was rechts und links vom
"And " sind beiden Argumente, der Funktionswert wird anstatt des "a
AND b" eingestezt.

-vom type der argumente ist abhängig welches AND aufgerufen wird, das
für boolean oder das für std_logic. Es gibt beide mit selbem Namen (das
wird in der Objektorientierten Programmierung als Vorteil gepriesen:
nicht zwei funktionsnamen AND_bool und  AND_std_logic sondern ein AND
und der Simulator erkennt selber an hand des types welches AND
ausgeführt werden muss



-das boolean AND liefert boolean zurück das std AND dagegen std.


-da IF boolean erwartet , crasht es in dem Fall a AND b


falls die dir bi comperaotren unpassend sind, kannst du auch folgendes
Versuchen



 IF (a(index) & b(index)) = "10" THEN


eventuell ist die verkettung "&" im IF nicht statthaft, dann hilft
eine variable und diese verkettung in einer extrazeile

von T.M. (Gast)


Lesenswert?

Überladung hat halrt doch nicht nur Vorteile :-/

Wenn man sich ne Funktion zusammenzimmert, die std_logic in boolean
castet, könnte man ja vielleicht auch sowas schreiben:
1
IF std2boolean(a(index) AND (NOT b(index))) THEN
Kann sein, dass es ähnliches schon gibt. Könnte ja zB. ungefähr so
aussehen:
1
FUNCTION std2boolean (std : IN std_logic) RETURN boolean IS
2
BEGIN
3
  IF ((std = '1') OR (std = 'H')) THEN
4
    RETURN TRUE;
5
  ELSE
6
    RETURN FALSE;
7
  END IF;
8
END FUNCTION std2boolean;

von FPGAkuechle (Gast)


Lesenswert?

Beim Überladen steht immer die Frage ob's das synthesetool noch
versteht. Bei Aufzählungstypen, auch enumeration genannt (boolean ist
z.B ein Enum aus TRUE und FALSE) und std_logic (und artverwandte) gehts
meistens auch gut durch die Synthese.

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.