Forum: FPGA, VHDL & Co. Zuweisung klappt nicht innerhalb case construct


von Bodo (Gast)


Lesenswert?

Ich möchte einen std_logic_vector innerhalb von case mit Werten belegen:

wenn Vektor = 0..63 dann
Fall "0" ->  Output = 3
Fall "0" ->  Output = 5
Fall "63" ->  Output = 8

Der Vektor ist ein "14 downto 0" und die Zahlen kommen aus MATLAB.

Egal wie ich es kontruiere, Xilinx will nicht.

Normalerweise verwende ich z.B. sowas:
1
constant XYZ : std_logic_vector (10 downto 0) := STD_LOGIC_VECTOR(to_unsigned( 456,11));

Das hat aber hier im case nicht geklappt. Hilfsweise benutze ich oft 
auch sowas:
1
value_sx <= STD_LOGIC_VECTOR(unsigned(empty15) + 201);

... wobei ich oben "empty15" als leeren Vektor mit 15 Bit deklariere. 
Damit kriegt die Synthese die richtige Länge mit und das klappt.

Diese Zeile synthetisiert nun in meinem Programm ebenfalls, jedoch nur 
ausserhalb des case Konstruktes! Sie funktioniert innerhalb der case 
Anweisung nicht!
1
case  unsigned (input)  is
2
   when  0  => value_sx <= STD_LOGIC_VECTOR(unsigned(empty15) + 201);
3
   when  1  => value_sx <= STD_LOGIC_VECTOR(unsigned(empty15) + 562);


WARUM GEHT DAS NICHT????

Andere Frage: wie sollte eine VHDL Zuweisung einfacher zu machen sein?

Ich verwende die Bibliotheken:

   use ieee.std_logic_1164.all;
   use ieee.std_logic_unsigned.all;
   use ieee.numeric_std.all;


Wie gesagt geht es aus funktioneller Sicht nur darum, in insgesamt 64 
Fällen (input Vektor) einen Ausgangsvektor (14 downto 0) eine von 64 
Stützstellen zuzuweisen. Die Werte habe ich aus MATLAB als *.txt Liste.




Mit CONV_STD_LOGIC VECTOR  etc habe ich es nicht hinbekommen.

(p.S. ich MUSS diese Bibs nehmen)

von MG (Gast)


Lesenswert?

Hallo Bodo,

welche Fehlermeldung gibt der VHDL-Compiler aus?

Wahrscheinlich ist das Problem die zweite Bibliothek.

  use ieee.std_logic_unsigned.all;

Diese wird in Verbindung mit der Bibliothek "std_logic_arith" benutzt, 
welche als obsolete gehandelt wird. Siehe auch 
Beitrag "IEEE.STD_LOGIC_ARITH.ALL obsolete". Werden diese Bibliotheken 
und die numeric_std genutz, so kann es durchaus zu Problemen kommen. 
Auskommentieren dieser Bibliothek in deinem Code sollte helfen.

MFG M.G.

von MG (Gast)


Lesenswert?

Achja,

es müsste die Konvertierung auch anders gestaltet werden.
1
when  0  => value_sx <= STD_LOGIC_VECTOR(to_unsigned(201, value_sx'length));
2
when  1  => value_sx <= STD_LOGIC_VECTOR(to_unsigned(562, value_sx'length));

Eventuell kann die Konvertierung von "input" auch nicht in der 
Case-Abfrage genutzt werden. Erstell dir ein Hilfsignal vom Typ Integer 
und weis diesem das konvertierte input-Signal zu.
1
signal input_int : integer range 0 to 2**input'lenght-1;
2
3
begin
4
...
5
6
input_int <= to_integer(unsigned(input));

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Bodo schrieb:
> (p.S. ich MUSS diese Bibs nehmen)
Böse, böse. Wer sagt das?

> Normalerweise verwende ich z.B. sowas:
1
   constant XYZ : std_logic_vector (10 downto 0) := STD_LOGIC_VECTOR(to_unsigned( 456,11));
> Das hat aber hier im case nicht geklappt.
Und warum nicht? Welche Fehlermeldung hast du bekommen?


So funktioniert das auf jeden Fall bei mir:
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use ieee.numeric_std.all;
4
5
entity out4Bits is
6
    Port ( outVector : out  STD_LOGIC_VECTOR (3 downto 0));
7
end out4Bits;
8
9
architecture Behavioral of out4Bits is
10
constant zero : unsigned (3 downto 0) := "0000";
11
begin
12
  outVector <= std_logic_vector(zero + 13); 
13
end Behavioral;

Unschön nur, dass es dann beispielsweise da keinen Fehler gibt:
1
  outVector <= std_logic_vector(zero + 33);
Da kommt einfach nur "0001" raus...

von Bodo (Gast)


Lesenswert?

ich habe jetzt den Frontteil auf

case input
when "0000" umgestellt und es geht.

Bliebe die Frage, wie man in VDHL einem Vector eine Zahl zuordnet, ohne 
den Umweg des Leervektors.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Bodo schrieb:
> Bliebe die Frage, wie man in VDHL einem Vector eine Zahl zuordnet, ohne
> den Umweg des Leervektors.
Mit Hilfe von Konvertierungen und Casts. Siehe dazu den 
Beitrag "Re: Zuweisung klappt nicht innerhalb case construct"
und die Übersicht für die numeric_std: 
http://www.lothar-miller.de/s9y/archives/14-Numeric_Std.html

von Bodo (Gast)


Lesenswert?

Die Numeric Geschichte kenne ich, aber ich muss die Vektrozuweisung 
verwenden und kann nicht den gesamten Code ändern - leider.

Die Zuweisung habe ich ja richtig, ich verwende eben nicht "length" 
sondern den ausdrücklichen Wert (und der stimmt).

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Bodo schrieb:
> Bliebe die Frage, wie man in VDHL einem Vector eine Zahl zuordnet, ohne
> den Umweg des Leervektors.
Ist beantwortet.
Bodo schrieb:
> Die Numeric Geschichte kenne ich, aber ich muss die Vektrozuweisung
> verwenden und kann nicht den gesamten Code ändern - leider.
Wenn du fragst: "wie komme ich schnell von A nach B?"
Und die Antwort lautet: "Über C!"
Du dann leider sagen musst: "Da darf ich nicht lang."
Dann hast du Pech gehabt.

> Die Zuweisung habe ich ja richtig, ich verwende eben nicht "length"
> sondern den ausdrücklichen Wert (und der stimmt).
Heute noch. Aber wehe, du machst den Vektor mal ein Bit länger oder 
kürzer. Dann suchst du eben die 153 Stellen, wo du den "ausdrücklichen" 
Wert hingeschrieben hast...


Da war noch was:
> Bodo schrieb:
>> (p.S. ich MUSS diese Bibs nehmen)
> Böse, böse. Wer sagt das?
Es geht hier nicht mal drum, dass es unschön ist, diese Bibliotheken 
zusammen zuverwenden, sondern es ist eine Fehlerquelle!

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.