www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Fehler bei Case-Anweisung


Autor: Daniel R. (daniel_r)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe folgende Case-Anweisung:
...
signal wert1  : integer := 10;
...
process(clk)
begin
if rising_edge(clk) then
  case data_in(wert1 downto wert1 -3) is
    when "0000" => data_out <= '1';
    when "0010" => data_out <= '1';
    when "1011" => data_out <= '0';
    when others => data_out <= '0';
  end case;

Dies ist nur ein Beispielcode, da der Original-Code alles unnötig 
kompliziert machen würde. Data_in ist ein 8-Bit Vector, data_out ist ein 
1-Bit Vector.
Es erscheint folgende Fehlermeldung:
ERROR:HDLParsers:839 - Selector (Slice name of type std_logic_vector) is 
an unconstrained array.

Scheinbar hapert es am Case-Selektor. Wie kann man diesen Fehler 
umgehen, sodass die Case Anweisung dynamisch(je nach Wert1) agiert?

Vielen Dank

Daniel


Autor: Thomas Pototschnig (pototschnig)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das muss eigentlich schon gehen -
ich hab erst so ein Konstrukt erfolgreich synthetisiert:
addr <= adrgen_addr((31-masksize) downto (31-(masksize+(LENGTH-1))));
masksize ist auch ein integer. LENGTH ist ein integer per generic {}; 
definiert.

Also eigentlich wundert mich das, dass das bei dir nicht geht.

Ich glaub eher, dass das Problem nicht in dem kleinen Schnippsel zu 
suchen ist - kannst du mal alles posten?

Mfg
Thomas Pototschnig

Autor: Thomas Pototschnig (pototschnig)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ah mom mal ...

data_out ist ein std_logic_vector?

Evtl gibts mit data_out <= '1'; ein Problem.

Versuchs mal mit data_out <= "1";

Mfg
Thomas Pototschnig

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Daniel R.

Bitte VOLLSTÄNDIGE VHDL-Files posten (am besten als Anhang), solche 
Schnipsel sind im allegemeinen nicht ausreichend.

MFG
Falk

Autor: Daniel R. (daniel_r)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

@Thomas:
Leider liegt es nicht an data_out <= "1";... data_out war im Beispiel 
std_logic;

Im Anhang liegt das komplette VHDL-File. Es dient später als Component. 
Das ganze soll folgendes bewerkstelligen:
1.Umrechnen von binären Eingangsdaten in 4-Bit BCD
2.Umrechnen von 4-Bit BCD in 7-Segment-Kodierung
3.Multiplexen der 7-Segment Anzeigen(10 darzustellende Stellen auf 4 
reale Stellen)
4.Durchschieben der Zahlen/Buchstaben auf der Anzeige(Laufschrift)

Die Case Anweisung(ziemlich unten im Code) soll nun in Abhängigkeit von 
digit_counter je 4 Bit aus dem BCD-Register(alle Zahlen stehen in BCD 
drin) holen, diese in 7-Segment-Kodierung umrechnen und dann ins 
Ausgaberegister(segment_shiftreg) an der richtigen Stelle in 
Abhängigkeit von digit_counter wieder einfügen.

Scheinbar gefällt ihm da was nicht... Ich kann es mir nicht erklären. 
Bei einem festen Wert im Case-Selektor(z.B. 7 downto 4) geht alles 
problemlos. Sobald der Wert von einem Signal abhängig ist erscheint der 
o.g. Fehler.

Vielen Dank für Eure Mühe.


Daniel

Autor: Falk (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
@Daniel R.

>Leider liegt es nicht an data_out <= "1";... data_out war im Beispiel
>std_logic;

Tut es auch nicht. Aber deine wilden variablen Vektorindizes bringen 
VHDL ins Schwitzen. Das geht vielleicht in C, VHDL ist hier ein wenig 
anders.

Deine erste Fehlermeldung hab ich beseitigt durch einen Workaround. 
Allerdings kommt jetzt ne neue Fehlermeldung. Die hat das gleiche 
Problem, du arbeitest hier zu viel mit variablen Indices. Das ist in 
VHDL nicht so einfach und üblich. Definier einen neunen Datentyp ala

type my_array is array of std_logic_vector(7 downto 0);

Dan kannst du über die Definition

signal my_data_array: my_array;

auf die einzelnen Elemtente deine Daten für die einzelnen Stellen 
verteilen. Der Zugriff ala

my_data_array(digit_counter) = "10101010";

sollte dann passen.

Im Anhang liegt das komplette VHDL-File. Es dient später als Component.

MfG
Falk

Autor: Daniel R. (daniel_r)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja. Mit C hab ich nix zu tun. Das das bisschen rumrechnen schon zuviel 
ist -.-
Auf nen Array hab ich eigentlich gar keine Lust. Erst wieder alles 
reinpacken... Aber wird wohl nicht anders gehen.
Ich melde mich..
Vielen Dank!

Daniel

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.