www.mikrocontroller.net

Forum: FPGA, VHDL & Co. [VHDL] Constant must have a value


Autor: A. M. (am85)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Meine Erfahrungen sind noch sehr jung in Sachen Xilinx, VHDL und 
Hardwaredesign. Nun möchte ich aber einen einfachen Paritätsgenerator in 
Form eines IP Cores in mein EDK Design einbinden und den aus einer C 
Anwendung heraus über ein paar vorher per IP Wizard definierten Register 
steuern. Beim Synthetisieren des Designs gibt er mir aber folgende 
Fehlermeldung aus:

ERROR:Xst:774 - ".../pargen_core_v1_00_a/hdl/vhdl/user_logic.vhd" line 
157: Constant must have a value : 'a'.

In Zeile 157 wird die variable "result" deklariert:
function reverseVector (a: in std_logic_vector) return std_logic_vector is
    variable result: std_logic_vector(a'reverse_range);
begin
  for i in a'range loop
    result((a'length-1)-i) := a(i);
  end loop;
  return result;
end;

Um sicher zu gehen, ob der Fehler nicht eigentlich an einer ganz anderen 
Stelle entsteht, habe ich einmal die ganze VHDL Datei angehängt.

Danke schon einmal

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

Bewertung
0 lesenswert
nicht lesenswert
Zum Synthesezeitpunkt ist in der Zeile nach:
function reverseVector (a: in std_logic_vector) return std_logic_vector is
noch nicht bekannt, welche Breite a beim Aufruf haben wird:
    variable result: std_logic_vector(a'reverse_range);
Woher hast du diese Funktion?


Dieser Prozess hier ist sinnlos:
  GENERATOR: process(reg_in) 
    variable p : std_logic;
  begin
  reg_status <= (others => '1'); -- set busy  --- !!! passiert gleichzeitig
   
  p := reg_in(0);
  for i in 1 to 7 loop
    p := p xor reg_in(i);
  end loop;
  
  if reg_conf = "11110000" then
    reg_out <= not p;
  else
    reg_out <= p;
  end if; 

  reg_status <= (others => '0'); -- set ready  --- !!! passiert gleichzeitig, aber die letzte Zuweisung gewinnt  :-o
  end process GENERATOR;
Denn der Prozess wird nicht einfach von oben nach unten abgearbeitet 
(wir sind ja nicht in C oder Assembler oder sonst einer 
Programmiersprache), sondern die Operationen innerhalb des Prozesses 
passieren GLEICHZEITIG. D.h. in einem Prozess gewinnt immer die letzte 
Zuweisung an ein Signal. Und das ist die hier:
  reg_status <= (others => '0'); -- set ready
reg_status wird niemals etwas anderes sein als x"00"    :-o


Du hast noch sehr grundlegende Probleme zum Verständnis der 
Hardwarebeschreibung mit VHDL. Besorg dir das Buch VHDL-Synthese von 
Reichardt&Schwarz und lies das mal durch...

Autor: A. M. (am85)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lothar Miller schrieb:
> Woher hast du diese Funktion?

Hier her: http://www.labbookpages.co.uk/fpgas/edkHowTos/peri...
Genauer unter Punkt "Writing the Peripheral VHDL"

Lothar Miller schrieb:
> Denn der Prozess wird nicht einfach von oben nach unten abgearbeitet
> (wir sind ja nicht in C oder Assembler oder sonst einer
> Programmiersprache), sondern die Operationen innerhalb des Prozesses
> passieren GLEICHZEITIG.

Mh, meine aktivere VHDL Zeit ist schon ein paar Semester her, aber mir 
hängt noch im Hinterkopf, dass in einem Prozess eben nicht alles 
parallel abgearbeitet wird, sondern Schritt für Schritt. Dazu ein Zitat 
aus Herrn Reichardts "Lehrbuch Digitaltechnik":

>4. Im Ausführungsteil von Prozessen [...] sind nur unbedingte >Signalzuweisungen 
und spezielle sequenzielle Anweisungen erlaubt. Diese >Anweisungen werden strikt 
nacheinander ausgeführt.[...].

Entweder widerspricht das deiner Aussage, oder meine Interpretation ist 
nicht ganz korrekt. Ich lasse mich da gerne eines besseren belehren.

Mit der Gültigkeit der letzten Signalzusweisung hast du allerding Recht 
und das.

Lothar Miller schrieb:
> Du hast noch sehr grundlegende Probleme zum Verständnis der
> Hardwarebeschreibung mit VHDL. Besorg dir das Buch VHDL-Synthese von
> Reichardt&Schwarz und lies das mal durch...

Ich würde eher sagen, dass meine letzte Vorlesung bei Herrn Reichardt zu 
lange her ist ;-)

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

Bewertung
0 lesenswert
nicht lesenswert
> Entweder widerspricht das deiner Aussage, oder meine Interpretation ist
> nicht ganz korrekt. Ich lasse mich da gerne eines besseren belehren.
Sie werden sequentiell abgearbeitet, aber zwischen den einzelnen 
Schritten vergeht keine Zeit! Es gibt innerhalb des Prozesses zware 
Ablaufbegriffe wie Vorher und Hinterher, aber keinerler Zeitbegriffe wie 
Früher, Jetzt und Später. Wie gesagt: die letzte Signalzuweisung 
gewinnt.

Autor: A. M. (am85)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lothar Miller schrieb:
> Sie werden sequentiell abgearbeitet, aber zwischen den einzelnen
> Schritten vergeht keine Zeit! Es gibt also keine Zeitbegriffe wie
> Vorher, Jetzt und Später. Wie gesagt: die letzte Signalzuweisung
> gewinnt.

Gut, aus meinem Code ist ja aber schonmal zu erkennen, wie das ganze 
ablaufen soll. Wie könnte man sowas denn sinnvoll in VHDL realisieren?

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

Bewertung
0 lesenswert
nicht lesenswert
> Wie könnte man sowas denn sinnvoll in VHDL realisieren?
In dem speziellen Fall oben brauchst du kein Busy-Flag, weil der Prozess 
sowieso in einer theoretischen Zeit 0 abgearbeitet wird. In der Praxis 
hast du natürlich eine Laufzeit, die dir die maximale Taktfrequenz des 
Designs reduzieren wird.

>>>> gibt er mir aber folgende Fehlermeldung aus: ...
Sieh dir das Original mal genau an:
Bus2IP_Data  : std_logic_vector(0 to C_DWIDTH-1);  -- 32 Bits
data_BUS2IP  : std_logic_vector(31 downto 0);      -- 32 Bits
data_BUS2IP  <= reverseVector(Bus2IP_Data);
Und dann dein Code:
slv_reg0        : std_logic_vector(0 to C_SLV_DWIDTH-1); -- 32 Bits
reg_in          : std_logic_vector(7 to 0);              -- 8 Bits
reg_in           <= reverseVector(slv_reg0);
Fällt dir was auf?  :-o

Autor: A. M. (am85)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lothar Miller schrieb:
> Fällt dir was auf?  :-o

Ich bin mal ganz naiv davon ausgegangen, dass nur die 8 Bits, die mich 
auch wirklich interessieren in den Vektor übertragen werden und der Rest 
im Nirvana verschwindet.

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

Bewertung
0 lesenswert
nicht lesenswert
> Ich bin mal ganz naiv davon ausgegangen
Das wird der Synthesizer ein wenig anders sehen... :-o
Probiers mal so:
reg_in           <= reverseVector(slv_reg0(o to 7));

Autor: A. M. (am85)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lothar Miller schrieb:
> Probiers mal so:
> reg_in           <= reverseVector(slv_reg0(o to 7));

Das macht schon viel mehr Sinn. Ich werds mal ausprobieren.

Autor: A. M. (am85)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mh, ich bekomme leider immer noch die gleiche Fehlermeldung. Prinzipiell 
sollte die Funktion ja aber funktionieren.

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.