Konvertierung der Std-Logik in Float in VHDL

Ich bin neu in diesem Bereich. Ich habe ein Problem mit der Umwandlung der Standardlogikeingabe in reale Werte. Ich habe to_floatdie Funktion verwendet, aber es wurde immer ein Fehler angezeigt. Als ich das Paket verwendet habe float_generic_pkg, wurde ein Fehler angezeigt:

Kann in der Bibliothek nicht gefunden werden.

Ich habe auch versucht, eine neue Bibliothek zu erstellen, ieee_proposedaber es zeigte immer noch einen Fehler.

Ich habe es IEEE.numeric_std.allauch mit versucht.

Wieder gab es einen <to_real>nicht deklarierten Fehler.

Muss ich ein anderes Bibliothekspaket verwenden?

Ich verwende ISE Design Suite 14.7. Eine Sache noch: es ist auch für Synthsis. Bitte hilf mir.

Hier ist der Code:

library ieee;
use ieee.std_logic_1164.all; 
use ieee.float_pkg.all; 
use ieee.float_generic_pkg.all; 

entity dafsm is 
port (x : in std_logic_vector (1 downto 0); 
      y : out std_logic_vector (1 downto 0)); 
end dafsm; 

architecture fpga of dafsm is 
   signal r,s : real range 0.0 to 15.0; 
begin 
   r <= to_float(x);
   s <= r * 0.5; 
   y <= to_slv(s); 
end fpga;

Die Fehlermeldungen:

Zeile 4: Kann <float_pkg> nicht in Bibliothek <ieee> finden. Stellen Sie sicher, dass die Bibliothek kompiliert wurde und dass eine Bibliothek und eine Verwendungsklausel in der VHDL-Datei vorhanden sind.
Zeile 5: Kann <float_generic_pkg> nicht in Bibliothek <ieee> finden. Stellen Sie sicher, dass die Bibliothek kompiliert wurde und dass eine Bibliothek und eine Verwendungsklausel in der VHDL-Datei vorhanden sind.
Zeile 12: <real> ist nicht deklariert.
Zeile 14: <r> ist nicht deklariert.
Zeile 15: <s> ist nicht deklariert.
Zeile 16: <y> ist nicht deklariert.

to_float ist korrekt, entweder in VHDL-2008 von ieee.float_pkg oder mit ieee_proposed. Posten Sie also die genaue Fehlermeldung dieser Version und ein Minimalbeispiel, das das Problem verursacht.
Vielen Dank für Ihre Hilfe, Sir. Hier ist der Code: Bibliothek ieee; Verwenden Sie ieee.std_logic_1164.all; Verwenden Sie ieee.float_pkg.all; Verwenden Sie ieee.float_generic_pkg.all; Entity dafsm ist port (x : in std_logic_vector (1 bis 0); y : out std_logic_vector (1 bis 0)); ende dafsm; Architektur fpga von dafsm ist Signal r,s : realer Bereich 0,0 bis 15,0; starte r <= to_float(x); s <= r * 0,5; y <= to_slv(s); FPGA beenden;
Zeile 4: Kann <float_pkg> nicht in Bibliothek <ieee> finden. Stellen Sie sicher, dass die Bibliothek kompiliert wurde und dass eine Bibliothek und eine Verwendungsklausel in der VHDL-Datei vorhanden sind. Zeile 5: Kann <float_generic_pkg> nicht in Bibliothek <ieee> finden. Stellen Sie sicher, dass die Bibliothek kompiliert wurde und dass eine Bibliothek und eine Verwendungsklausel in der VHDL-Datei vorhanden sind. Zeile 12: <real> ist nicht deklariert. Zeile 14: <r> ist nicht deklariert. Zeile 15: <s> ist nicht deklariert. Zeile 16: <y> ist nicht deklariert. Bitte helfen Sie mir, Herr
Stellen Sie die Tools für die Verwendung von VHDL-2008 ein?
Es gibt keine VHDL-2008-Unterstützung in ISE. forums.xilinx.com/t5/Synthesis/VHDL-2008-support-in-ISE-14-7/…

Antworten (1)

Ich habe einige Änderungen an deinem Code vorgenommen. Die Änderungen werden im Folgenden erläutert.

library ieee;
use ieee.std_logic_1164.all; 
library ieee_proposed;
use ieee_proposed.float_pkg.all; 


entity dafsm is 
    port (
        x:      in  std_logic_vector (31 downto 0) := x"0000002A"; 
        y:      out std_logic_vector (31 downto 0)
    ); 
end dafsm; 

architecture fpga of dafsm is 
    function to_string(inp: std_logic_vector) return string is
        variable image_str: string (1 to inp'length);
        alias input_str:  std_logic_vector (1 to inp'length) is inp;
    begin
        for i in input_str'range loop
            image_str(i) := character'VALUE(std_ulogic'IMAGE(input_str(i)));
        end loop;
        -- report "image_str = " & image_str;
        return image_str;
end;
    signal r,s : real range  0.0 to 15.0;  
begin 
    r <= to_real(to_float(x));
    s <= r * 0.5; 
    y <= to_slv(to_float(s));
monitor: 
    process(s)
    begin
        report "y = " & to_string(to_slv(to_float(s)));
    end process;
end architecture fpga;

Diese analysiert, ausgearbeitet und simuliert.

Die Veränderungen:

  • Ich habe die Kontextklausel geändert, einschließlich einer Bibliotheksreferenz für ieee_proposed, alles nicht benötigte entfernt.
  • „x“ und „y“ waren zu kurz, um sie zu verwenden. Als ersten Versuch habe ich sie auf Länge 32 erhöht. Ich kann mich aus dem Stegreif nicht an die Mindestlänge erinnern, das können Sie herausfinden, indem Sie die Dokumentation auf der oben genannten Website lesen oder den Quellcode des Pakets lesen. Es kann kürzer sein, ich wusste, dass 32 funktionieren würden.
  • Ich habe einen Standardwert für "x" hinzugefügt (das Hex-Äquivalent von 42 dezimal). Dies ist so, dass ich Ihr Design ohne das Schreiben einer Testbench erstellen könnte.
  • Ich habe eine Funktion to_string[std_logic_vector return string] hinzugefügt, dies wurde auf ghdl durchgeführt, das nicht IEEE Std 1076-2008-konform ist, und die Funktion war nicht verfügbar. Ich habe die Funktion so geschrieben, dass sie dem Standard entspricht, Abschnitt 5.7 Zeichenfolgendarstellungen (ich hatte das herumliegen). Es wird hier nur benötigt, um zu überprüfen, ob die Eingabe 42 mal 0,5 21 ist.
  • Das Paket float_pkg wird von der VHDL-2008 Support Library- Webseite bezogen, ein sorgfältiges Lesen bietet einen Download-Link für die -1993-kompatible Version.
  • Es gibt Änderungen an Ihren gleichzeitigen Signalzuweisungen. Es gibt keine wirklichen Konvertierungsroutinen nach/von std_logic_vector. alles wird durch den neuartigen Schwimmer geleitet.
  • Ich habe einen Monitor hinzugefügt, um uns mitzuteilen, was das Ergebnis ist.

Sie haben alle anbieteridentifizierenden Informationen sorgfältig aus Ihren Fehlermeldungen entfernt, und ich habe ihre Implementierungen sowieso nicht, ich habe ghdl verwendet.

Ich habe zuerst die Quellen in einem Verzeichnis namens ieee_proposed kompiliert, um eine Bibliothek ieee_proposed zu erstellen:

ghdl -a --work=IEEE_VORSCHLAG standard_textio_additions_c.vhdl ghdl -a
--work=IEEE_VORSCHLAG standard_textio_additions_c.vhdl ghdl -a --work=IEEE_VORSCHLAG std_logic_1164_additions.vhdl ghdl -a --work=IEEE_VORSCHLAG numeric_std_additions.vhdl ghdl -a --work =IEEE_VORSCHLAG numeric_std_unsigned_c.vhdl ghdl -a --work=IEEE_VORSCHLAG Fixed_float_types_c.vhdl ghdl -a --work=IEEE_VORSCHLAG fix_pkg_c.vhdl ghdl -a --work=IEEE_VORSCHLAG Float_pkg_c.vhdl





Wir brauchen das alles nicht, um Ihren Code zu demonstrieren, aber es gibt sie.

Analysieren, ausarbeiten und simulieren Sie dann Ihren Code:

ghdl -a -P./ieee_proposed dafsm.vhdl
ghdl -e -P./ieee_proposed dafsm
ghdl -r dafsm
dafsm.vhdl:33:9:@0ms:(Berichtshinweis): y = 0000000000000000000000000000000
dafsm.vhdl:33:9 :@0ms:(Hinweis melden): y = 00000000000000000000000000010101

Es gibt zwei Ausgänge, weil es ein Initialisierungsereignis gibt, sbevor szugewiesen wird r * 0.5. Hinweis: Ich habe den Monitorprozess sensibel für gemacht, sda y eine Ausgabe ist und nicht in einer Prozesssensitivitätsliste erscheinen kann. Ich habe den Wert neu erstellt, yder zugewiesen wurde.

Das zweite ist das Ergebnis, 15 in Hex ist 21 Dezimal.

Das -P./ieee_proposed weist ghdl an, im aktuellen Verzeichnis nach einem Unterverzeichnis library ieee_proposed zu suchen (der Name des Verzeichnisses ist derselbe wie der der Bibliothek). Ich hätte es in den Bibliothekssuchpfad von ghdl einfügen können, es schien für diese Demonstration unnötig zu sein.

Die Verwendung anderer Tools kann variieren.

David Bishop versichert uns, dass dies für Synthesen geeignet sein sollte. Ich habe es nicht selbst versucht.

Bitte nutzen Sie die Dokumentation auf der oben genannten Webseite.