Forum: FPGA, VHDL & Co. Potenzierer in VHDL!


von Flori K. (jasi)


Lesenswert?

Hallo bin gerade dabei mir einen kleinen Potenzierer zu Bauen.
Der hier ist synthetisierbar und läuft.
Kann mir jemand sagen ob ich gravierende Fehler gemacht habe ?

liebe grüße
flori

1
LIBRARY ieee;
2
USE ieee.std_logic_1164.all;
3
USE ieee.std_logic_arith.all;
4
use ieee.numeric_std.all;
5
use ieee.std_logic_unsigned.all;
6
7
ENTITY Pot IS
8
  port (  bas    :in std_logic_vector (3 downto 0);
9
          exp    :in std_logic_vector (3 downto 0);
10
          erg    :inout std_logic_vector (31 downto 0));
11
END ENTITY Pot;
12
13
ARCHITECTURE verhalten OF Pot IS
14
BEGIN
15
  process (bas,exp,erg)
16
      variable basi:integer;
17
      variable expi:integer;
18
      variable ergi:integer;   
19
      begin
20
      ergi:=1;  
21
                                      -- std_logic vektor in int
22
      basi := conv_integer(bas);
23
      expi := conv_integer(exp);
24
                                      --Formel
25
      for i in 3 downto 0  loop
26
          ergi:=ergi*ergi;
27
        if exp(i)='1' then
28
          ergi:=(ergi*basi);
29
        end if;
30
      end loop; 
31
      erg  <= conv_std_logic_vector(ergi, 32); 
32
    end process;
33
              
34
END ARCHITECTURE verhalten;

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


Lesenswert?

> Kann mir jemand sagen ob ich gravierende Fehler gemacht habe ?
Jein, der erste "Fehler" ist schon in der 3. Zeile:
1
LIBRARY ieee;
2
USE ieee.std_logic_1164.all;
3
USE ieee.std_logic_arith.all;
4
use ieee.numeric_std.all;
5
use ieee.std_logic_unsigned.all;
Lass die alten herstellerabhängigen std_logic_arith und 
std_logic_unsigned Packages weg. Die haben eigene Konvertierungen und 
bringen die zusammen mit der standardisierten numeric_std nur 
Verwirrung.
So sieht es besser aus:
1
LIBRARY ieee;
2
USE ieee.std_logic_1164.all;
3
use ieee.numeric_std.all;

>   erg    :inout std_logic_vector (31 downto 0));
Warum ist der Port bidirektional?

>   process (bas,exp,erg)
Der Prozess ist nicht von erg abhängig.
Schreib also
1
   process (bas,exp)
dann klappt das auch mit out anstelle von inout.


> Der hier ist synthetisierbar und läuft.
Ist aber auch sehr ressourcenhungrig...
1
   Number of MULT18X18s                      3 out of 4      75%
und ziemlich langsam:
1
Maximum combinational path delay: 51.225ns
Hier könntest du mit 1 Multiplizierer und einem Sequencer sparsamer 
werden. Die Gesamtzeit, bis das Ergebnis da ist, wird sicher nicht 
geringer, aber die Ressourcen besser genutzt.

von Duke Scarring (Gast)


Lesenswert?

@Flori K.:
> Kann mir jemand sagen ob ich gravierende Fehler gemacht habe?

Ja, deine Testbench kann das. Siehe VHDL Testbench

Duke

von Flori K. (jasi)


Lesenswert?

Vielen Dank für die Tipps.
Hab mein Programm umgeändert.
@Lothar Miller:
Könntest du mir sagen wie ich die Ressourcen Werte ermitteln kann.
Besonders interessier mich, wie du auf den Maximum combinational path 
delay von 51.225ns kommst.
In der Area Report file wird mir dies nicht angezeigt.

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


Lesenswert?

> In der Area Report file wird mir dies nicht angezeigt.
Naja, da wird auch mit Flächen herumgemacht...

Such mal nach Maximum combinational path delay im Synthesereport 
(grobe Näherung) oder im P&R Report (schon besser).

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.