Forum: FPGA, VHDL & Co. numeric_std - sauber +2 rechnen und Übersicht geht flöten


von Andi (loopy83)


Lesenswert?

Hallo zusammen,

ich überarbeite gerade ein altes Design und wollte gleich wegen den 
hilfreichen Hinweisen von Lothar 
(http://www.lothar-miller.de/s9y/categories/16-Numeric_Std) die 
numeric_std einpflegen.

alt:
1
LIBRARY ieee;
2
USE ieee.std_logic_1164.ALL;
3
USE ieee.std_logic_arith.ALL;
4
USE ieee.std_logic_unsigned.ALL;
5
...
6
type   array_data is array (0 to 7) of std_logic_vector( 7 DOWNTO 0);
7
signal s_data     : array_data;
8
type   array_ergebnis is array (0 to 7) of std_logic_vector(11 DOWNTO 0);
9
signal s_ergebnis : array_ergebnis;
10
...
11
12
FOR I IN 0 TO 7 LOOP
13
  s_ergebnis(i) <= ("000000" & s_data(i)(s_data(i)'HIGH DOWNTO 2)) + conv_std_logic_vector(2, s_ergebnis(i)'LENGTH);
14
END LOOP;


neu:
1
LIBRARY ieee;
2
USE ieee.std_logic_1164.ALL;
3
USE ieee.numeric_std.ALL;
4
...
5
type   array_data is array (0 to 7) of std_logic_vector( 7 DOWNTO 0);
6
signal s_data     : array_data;
7
type   array_ergebnis is array (0 to 7) of std_logic_vector(11 DOWNTO 0);
8
signal s_ergebnis : array_ergebnis;
9
...
10
11
FOR I IN 0 TO 7 LOOP
12
  s_ergebnis(i) <= std_logic_vector(to_unsigned((to_integer(unsigned("000000" & s_data(i)(s_data(i)'HIGH DOWNTO 2))) + 2), s_ergebnis(i)'LENGTH));
13
END LOOP;

Abgesehen, dass es mega unübersichtlich wird, will es auch nicht so 
recht klappen.
Ich würde ungern irgendwelche Zwischensignale/-variablen verwenden. Dann 
hat man später noch mehr Probleme das Design zu verstehen.

Kann mir jemand helfen den Knoten lösen?

Vielen Dank!
Andi :)

von VHDL hotline (Gast)


Lesenswert?

Dein Knoten ist der, dass du bei der Signaldeklaration gleich unsigned 
verwenden solltest. Dann entfällt das ganze Gecaste, höchstens einmal zu 
den entity-Ports.

Falls du die slv unbedingt behalten willst, dann besser so:

Das hier
1
FOR I IN 0 TO 7 LOOP
2
  s_ergebnis(i) <= ("000000" & s_data(i)(s_data(i)'HIGH DOWNTO 2)) + conv_std_logic_vector(2, s_ergebnis(i)'LENGTH);
3
END LOOP;

wird zu
1
s_ergebnis(i) <= std_logic_vector(unsigned( ("000000" & s_data(i)(s_data(i)'HIGH DOWNTO 2)) + 2));

Der Operator + ist für unsigned + integer schon definiert. Du castest 
dein data einmal zu unsigned, addierst mit einem integer und castest das 
zurück nach slv.

von VHDL hotline (Gast)


Lesenswert?

Korrektur:
1
s_ergebnis(i) <= std_logic_vector(unsigned( ("000000" & s_data(i)(s_data(i)'HIGH DOWNTO 2)) ) + 2);

von Andi (loopy83)


Lesenswert?

Mhm... ausgezeichnete Idee... direkt mir unsigned rechnen!
War wohl zu einfach, um selber darauf zu kommen *Kopf => Tisch*

Vielen Dank!
Andi :)

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.