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


von Daniel R. (daniel_r)


Lesenswert?

Hallo,

ich habe folgende Case-Anweisung:
...
1
signal wert1  : integer := 10;
2
...
3
process(clk)
4
begin
5
if rising_edge(clk) then
6
  case data_in(wert1 downto wert1 -3) is
7
    when "0000" => data_out <= '1';
8
    when "0010" => data_out <= '1';
9
    when "1011" => data_out <= '0';
10
    when others => data_out <= '0';
11
  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


von Thomas P. (pototschnig)


Lesenswert?

Das muss eigentlich schon gehen -
ich hab erst so ein Konstrukt erfolgreich synthetisiert:
1
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

von Thomas P. (pototschnig)


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

von Falk (Gast)


Lesenswert?

@Daniel R.

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

MFG
Falk

von Daniel R. (daniel_r)


Angehängte Dateien:

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

von Falk (Gast)


Angehängte Dateien:

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

von Daniel R. (daniel_r)


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

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.