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


von Tobias (Gast)


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.

von Tobias (Gast)


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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Was macht resolve_bit_32()?

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

von Tobias (Gast)


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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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

von Tobias (Gast)


Lesenswert?

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

von Tobias (Gast)


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?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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-between-types-std_logic-std_ulogic.html
http://tams-www.informatik.uni-hamburg.de/applets/hades/webdemos/00-intro/03-stdlogic/resolution.html

von Tobias (Gast)


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.

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.