www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Anfängerfrage


Autor: VHDL Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
----------------------------------
use IEEE.NUMERIC_STD.ALL;

---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;

entity Drehung is
  port( a,b : in std_logic_vector  (15 downto 0);
        x,y : out std_logic_vector  (15 downto 0)
            );
end Drehung;


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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
----------------------------------
use IEEE.NUMERIC_STD.ALL;
Entweder, oder, aber nicht zusammen...

Autor: VHDL Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke für deinen ersten Tipp:-)

und wie ist mit anderen Punkten?

gruß

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: VHDL Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :
x <= a * b;

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

Vielen Dank!

Gruß

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity FixedPoint is
    Port ( a : in   STD_LOGIC_VECTOR (15 downto 0);
           b : in   STD_LOGIC_VECTOR (15 downto 0);
           s : out  STD_LOGIC_VECTOR (15 downto 0);
           p : out  STD_LOGIC_VECTOR (15 downto 0));
end FixedPoint;

architecture Behavioral of FixedPoint is
   signal ls : signed(16 downto 0); -- local sum
   signal lp : signed(31 downto 0); -- local product
begin
   ls <= resize(signed(a),ls'length) + resize(signed(b),ls'length);
   lp <= signed(a) * signed(b);
   s <= std_logic_vector(ls(15 downto 0));   -- die unteren Bits verwenden
   p <= std_logic_vector(lp(29 downto 14));  -- die richtigen Bits ausschneiden
end Behavioral;

Autor: VHDL Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
   short i=30000;
   short j=30000;
   short k=i+j;
Welchen Wert wird k hier wohl haben?

Autor: GastausHannover (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:-)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.