mikrocontroller.net

Forum: FPGA, VHDL & Co. Comparator Simulationsproblem


Autor: T.M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
  p0 :PROCESS (a, b) IS
  BEGIN
    less    <= '0';
    equal   <= '1';
    greater <= '0';
    FOR index IN a'RANGE LOOP
      IF a(index) AND (NOT b(index)) THEN
        equal   <= '0';
        greater <= '1';
        EXIT;
      ELSIF (NOT a(index)) AND b(index) THEN
        less  <= '1';
        equal <= '0';
        EXIT;
      END IF;
    END LOOP;
  END PROCESS p0;

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
=============================

Autor: T.M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe es jetzt folgendermassen geändert, damit läuft der Simulator
ohne zu Murren:
ARCHITECTURE rtl1 OF gle IS
BEGIN

  p0 :PROCESS (a, b) IS
  BEGIN
    less    <= '0';
    equal   <= '1';
    greater <= '0';
    FOR index IN a'RANGE LOOP
      IF (a(index) = '1') AND (b(index) = '0') THEN
        equal   <= '0';
        greater <= '1';
        EXIT;
      ELSIF (a(index) = '0') AND (b(index) = '1') THEN
        less  <= '1';
        equal <= '0';
        EXIT;
      END IF;
    END LOOP;
  END PROCESS p0;

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
=============================

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: T.M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: FPGAküchle (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: T.M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
IF std2boolean(a(index) AND (NOT b(index))) THEN
Kann sein, dass es ähnliches schon gibt. Könnte ja zB. ungefähr so
aussehen:
FUNCTION std2boolean (std : IN std_logic) RETURN boolean IS
BEGIN
  IF ((std = '1') OR (std = 'H')) THEN
    RETURN TRUE;
  ELSE
    RETURN FALSE;
  END IF;
END FUNCTION std2boolean;

Autor: FPGAkuechle (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.