www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Fehler in Deklaration von Resolution Function


Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
subtype bit_32 is bit_vector(31 downto 0);        --
type bit_32_array is array (bit range <>) of bit_32;

function resolve_bit_32 (driver : in bit_32_array) return bit_32;


Hallo zusammen, vielleicht kann mir einer helfen. Obige Funktionen und 
Typen habe ich in einer Package deklariert. Versuche ich das ganz 
Konstrukt zu simulieren, kommt folgende Fehlermeldung, die ich nicht 
ganz verstehe:


Resolution functions not supported on any type other than enumeration 
and scalar types.

Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
subtype bit_32 is bit_vector(31 downto 0);
type bit_32_array is array (integer range <>) of bit_32;

function resolve_bit_32 (driver : in bit_32_array) return bit_32;

Sorry bei mir hat sich ein kleiner Fehler eingeschlichen. Es muss 
natürlich integer range heißen.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was macht resolve_bit_32()?

Ein bit ist ein Aufzählungstyp ('0','1'), ein bit_vector nicht mehr.

Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

diesen Zusammenhang hatte ich auch schon gefunden. Es geht darum, wie 
kann ich einen 32Bit Bus Signalen treiben, wenn er ein bidirektionales 
Signal ist und ich nicht den Datentyp std_logic verwenden will. Mir geht 
es explizit darum, dieses Konstrukt für ein bit_vector Signal zu 
beschreiben.
Wäre es aber vielleicht möglich, dass der ModelSim Simulator vom Xilinx 
Packet, dass nur nich auflösen kann?
Die Funktion resolve_bit_32 ist einfach eine Auflösungsfunktion für 
Signale mit multiplen Treibern.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Die Funktion resolve_bit_32 ist einfach eine Auflösungsfunktion für
> Signale mit multiplen Treibern.
Wie sieht die aus?
Das muß dann explizit ein MUX sein.

> wie kann ich einen 32Bit Bus Signalen treiben, wenn er ein bidirektionales
> Signal ist und ich nicht den Datentyp std_logic verwenden will
Gar nicht. Denn es ist ja gerade der Trick bei std_logic, dass es den 
Typ Z (sowie W, L und H) gibt, der sich gegen eine harte 0 oder 1 
rezessiv zeigt.
Bei einem Bit gibt es nur 1 und 0, beide sind gleich stark, da kann 
nichts aufgelöst werden...

Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank, jetzt ist es klar. Da habe ich wieder etwas dazu gelernt 
;-))

Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, ich habe jetzt nur noch mal ne Nachfrage des Verständnisses 
wegen.

Wenn ich mit mehreren 32 Bit Signalen auf auf einen Bidirektionalen Port 
zugreifen möchte, werden alle 32 Bit Signale in ein Array geschrieben. 
Dieses Array wird durch eine For Schleife in der Auflösungsfunktion 
durchgearbeitet und OR verknüpft mit dem resultierenden Port in etwa so:

driver ist vom Typ in bit_32_array und
result : bit_32;(siehe oben)

for in driver'range loop
    result:=result or driver(i);
end loop;
return result;

Durch so eine Verknüpfung von 32Bit Signalen mit einem Integer Array 
könnten Zustände entstehen, die weder 0 oder 1 haben. Aus diesem Grund 
wird obige Fehlermeldung ausgegeben?
Wenn man anstelle eines Datentyps bit_vector den Typ std_logic_vector 
verwendet, würde die Auflösung deshalb funktionieren, weil der std_logic 
Datentyp mehr als nur die Zustände 0 und 1 darstellen kann.

Habe ich das so richtig verstanden?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> würde die Auflösung deshalb funktionieren, weil der std_logic Datentyp
> mehr als nur die Zustände 0 und 1 darstellen kann.
Und weil es dafür eine Auflösungsfunktion gibt...
Das steht aber in jedem halbwegs brauchbaren VHDL-Buch.
http://objectmix.com/vhdl/208460-what-difference-b...
http://tams-www.informatik.uni-hamburg.de/applets/...

Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Danke für die Antworten. Ändere ich aber den bit_vector in 
std_logic_vector erscheint derselbe Fehler.

subtype bit_32 is std_logic_vector(31 downto 0);
type bit_32_array is array(integer range <>) of bit_32;

function resolve_bit_32(driver : in bit_32_array) return bit_32;

function resolve_bit_32 (driver: in bit_32_array) return bit_32 is

  constant float_value: bit_32 :=X"0000_0000";
  variable result: bit_32 := float_value;

  begin
    for i in driver'range loop
      result := result or driver(i);
    end loop;
    return result;
end resolve_bit_32;

Es erscheint folgende Fehlermeldung:

Resolution functions not supported on any type other than enumeration 
and scalar types

Warum geht das std_logic_vector nicht auf array (integer range <>)
bzw.
Wie kann ich es lösen.

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.