Fehler bei Case-Anweisung

OP #531237
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

#531246
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
OP #531389
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
Angehängte Dateien:
Gast #531420
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
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren