Forum: FPGA, VHDL & Co. Anfängerfrage


von VHDL Anfänger (Gast)


Lesenswert?

Hallo zusammen,

Ich hab ein Xilinx Spartan 3A Board, ISE 10.1.03

Meine Frage sind:

1. Wie kann ich wissen, welche Version von VHDL ich benutze, ob VHDL 93 
oder 2008..

2. Wie kann ich den Paket IEEE.Fixed_Pkg einbinden um zu benutzen?

3. Ich möchte eine Vektor-Drehung um 60° in VHDL implementieren. So ist 
meine Vorstellung:

Input      : a, b
             mit -1 <= a,b <= 1
Bitbreite  : 16-bit in fixed-point I2Q14; so dann liegen a und b:
              -2 <= a,b < 2 - 2^(-14)

Output     : x, y
Bitbreite  : 16-bit in fixed-point I2Q14; so liegen dann x und y auch:
              -2 <= x,y < 2 - 2^(-14)

====> Drehung um 60°:

           x = 1/2*a        -   sqrt(3)/2*b;
           y = sqrt(3)/2*a  +   1/2*b;

Ich hab nur einen kleinen Vorschlag für die sqrt(3)-Division gekriegt,
somit braucht man keine Multiplikation und Division mehr.

sqrt(3)~ 1 + 1/2 + 1/4 - 1/64 - 1/512 - 1/2048


Meine Frage ist:

Wie kann ich dies realisieren, wenn ich a,b und x,y als Input, 
Output-Port ansehe wie etwa:
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
use IEEE.NUMERIC_STD.ALL;
7
8
---- Uncomment the following library declaration if instantiating
9
---- any Xilinx primitives in this code.
10
--library UNISIM;
11
--use UNISIM.VComponents.all;
12
13
entity Drehung is
14
  port( a,b : in std_logic_vector  (15 downto 0);
15
        x,y : out std_logic_vector  (15 downto 0)
16
            );
17
end Drehung;

vielen Dank für eure Tips:-)
Gruß

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


Lesenswert?

1
use IEEE.STD_LOGIC_ARITH.ALL;
2
use IEEE.STD_LOGIC_UNSIGNED.ALL;
3
----------------------------------
4
use IEEE.NUMERIC_STD.ALL;
Entweder, oder, aber nicht zusammen...

von VHDL Anfänger (Gast)


Lesenswert?

danke für deinen ersten Tipp:-)

und wie ist mit anderen Punkten?

gruß

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


Lesenswert?

> und wie ist mit anderen Punkten?
Ich rechne bisher immer alles ganzzahlig und definiere mir meinen 
Dezimalpunkt in Gedanken.


>         x = 1/2*a        -   sqrt(3)/2*b;
>         y = sqrt(3)/2*a  +   1/2*b;
Was gilt hier? Von links nach rechts?
          x = (1/2)*a        -   (sqrt(3)/2)*b;
Oder andersrum?
          x = 1/(2*a)        -   sqrt(3)/(2*b);

Wenn ich mir das vergegenwärtige, wird es die erste Variante sein...
Dann ist es aber abartig simpel, denn (1/2) = konstant und (sqrt(3)/2) = 
konstant. Du brauchst also eigentlich nichts zu rechnen. Das nimmt dir 
der Synthesizer ab.

von VHDL Anfänger (Gast)


Lesenswert?

Lothar Miller schrieb:
> Ich rechne bisher immer alles ganzzahlig und definiere mir meinen
> Dezimalpunkt in Gedanken.

danke dir^^

kannst du mir mal ein beispiel im falle I2Q14 erklären?

zb.:

a = -0.5  --->  a = "11.10 0000 0000 0000"
b = -1.125 ---> b = "10.11 1000 0000 0000"
a,b,x : 16-bit signal
Wenn ich so in VHDL schreibe :
1
x <= a * b;

dann sollte x 32-bit lang sein. Wie kann ich den richtigen 16-bit, I2Q14 
x-Wert kriegen?

Vielen Dank!

Gruß

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


Lesenswert?

> a = -0.5  --->  a = "11.10 0000 0000 0000"
> b = -1.125 ---> b = "10.11 1000 0000 0000"
Da bedeutet, dass du das Komma um den Faktor 2**14 = 16384 verschoben 
hast. Also so:
 a = -0.5  --->  a = "1110 0000 0000 0000" = -8192/16384
 b = -1.125 ---> b = "1011 1000 0000 0000" = -18432/16384
Jetzt mußt du dir "nur" bei der Multiplikation die Bits um das Komma 
"herausschneiden":

 xhilf = a * b;
 xhilf = "0000 1001 0000 0000 0000 0000 0000"
 x =       "00 1001 0000 0000 00"
   =       "0010 0100 0000 0000" = 9216/16384 = 0,5625

In VHDL geht das etwa so:
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.NUMERIC_STD.ALL;
4
5
entity FixedPoint is
6
    Port ( a : in   STD_LOGIC_VECTOR (15 downto 0);
7
           b : in   STD_LOGIC_VECTOR (15 downto 0);
8
           s : out  STD_LOGIC_VECTOR (15 downto 0);
9
           p : out  STD_LOGIC_VECTOR (15 downto 0));
10
end FixedPoint;
11
12
architecture Behavioral of FixedPoint is
13
   signal ls : signed(16 downto 0); -- local sum
14
   signal lp : signed(31 downto 0); -- local product
15
begin
16
   ls <= resize(signed(a),ls'length) + resize(signed(b),ls'length);
17
   lp <= signed(a) * signed(b);
18
   s <= std_logic_vector(ls(15 downto 0));   -- die unteren Bits verwenden
19
   p <= std_logic_vector(lp(29 downto 14));  -- die richtigen Bits ausschneiden
20
end Behavioral;

von VHDL Anfänger (Gast)


Lesenswert?

vielen dank Lothar, nach dem urlaub bin ich back:-) ich werde mals 
ausprobieren.

wie ist mit dem paket IEEE.Fixed_Pkg? kann mal einfach einbinden und in 
hardware synthesieren lassen. Dann muss man sich auf overfow nicht 
aufpassen muss, oder?

guten rutsch ins 2010 noch:-)

gruß

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


Lesenswert?

> kann mal einfach einbinden und in hardware synthesieren lassen.
Probiers aus...

> Dann muss man sich auf overfow nicht aufpassen muss, oder?
Auch bei einem uC, der vordefinierte Datentypen hat, mußt du auf den 
Überlauf achten:
1
   short i=30000;
2
   short j=30000;
3
   short k=i+j;
Welchen Wert wird k hier wohl haben?

von GastausHannover (Gast)


Lesenswert?

Lothar Miller schrieb:
> Probiers aus...

Lothar Miller schrieb:
>> kann mal einfach einbinden und in hardware synthesieren lassen.
> Probiers aus...

ich hab so gemacht, es kommt syntax-fehlermeldung mit xilinx ise 10

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.fixed_pkg.ALL;

ERROR:HDLParsers:3014 - "C:/ise10_proj/arithmetic_ver2/arithm1.vhd" Line 
24. Library unit fixed_pkg is not available in library IEEE.
WARNING:HDLParsers:3481 - Library work has no units. Did not save 
reference file "xst/work/hdllib.ref" for it.

fehlt mir etwas?

Lothar Miller schrieb:
>> Dann muss man sich auf overfow nicht aufpassen muss, oder?
> Auch bei einem uC, der vordefinierte Datentypen hat, mußt du auf den
> Überlauf achten:   short i=30000;
>    short j=30000;
>    short k=i+j;
> Welchen Wert wird k hier wohl haben?

stimmt, es kommt overflow,weil short ist nur 16bit-integer oder ein 
maximum 32767. Ich denke man muss sicher sein dass overflow nicht kommt, 
aber wie? ich muss mals ausprobieren:-)

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.