Zuweisung klappt nicht innerhalb case construct

Gast #2666310
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)
Gast
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.
Gast
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));
Moderator (Firma: Titel) Persönliche Seite
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...
Gast
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.
Gast
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).
Moderator (Firma: Titel) Persönliche Seite
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!

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.