Forum: FPGA, VHDL & Co. Multiplikation


von mr.chip (Gast)


Lesenswert?

Hallo

Eigentlich hat der Spartan ja Multiplizierer drin und laut User Guide 
sollte ISE diese auch verwenden, wenn ein Multiplikationszeichen 
vorkommt.

Nun bekomm ich allerdings folgenden Fehler:

ERROR:HDLParsers:808 - "H:/VHDL/vga/framebuffer_addrgen.vhd" Line 46. * 
can not have such operands in this context.

1
architecture Behavioral of framebuffer_addrgen is
2
  signal saddr : std_logic_vector(16 downto 0);
3
begin
4
  generate_address : process(clk)
5
  begin
6
    if clk = '1' and clk'event then
7
      saddr <= row * 320; -- <== Zeile 46
8
    end if;
9
  end process;
10
  addr <= saddr;
11
end Behavioral;

Was läuft hier falsch?

Gruss
Michael

von Falk B. (falk)


Lesenswert?

@ mr.chip (Gast)

>Was läuft hier falsch?

Da fehlen die richtigen Bibliotheken (mit use . . .) bzw. er mosert, 
weil man std_logic  nicht mit Integer multiplizieren kann. Muss man über 
die Umwandlungsfunktionen hinschreiben.

MFG
Falk

von mr.chip (Gast)


Lesenswert?

Im Userguide steht folgendes Beispiel:
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
entity mult18x18sio is
7
  port ( a : in std_logic_vector(7 downto 0);
8
         b : in std_logic_vector(7 downto 0);
9
         clk : in std_logic;
10
         prod : out std_logic_vector(15 downto 0));
11
  end mult18x18sio;
12
13
  architecture arch_mult18x18sio of
14
    mult18x18sio is
15
    begin
16
      process(clk) is begin
17
        if clkevent and clk = 1 then
18
          prod <= a*b;
19
        end if;
20
      end process;
21
  end arch_mult18x18sio;

Genau die selben Bibliotheken habe auch ich verwendet und auch die 
restliche Struktur ist soweit ich es sehen kann, genau gleich.

von Falk B. (falk)


Lesenswert?

@ mr.chip (Gast)

>Genau die selben Bibliotheken habe auch ich verwendet und auch die
>restliche Struktur ist soweit ich es sehen kann, genau gleich.

Du multiplizierst aber mit einer Konstanten. Versuch mal

saddr <= row * conv_std_logic_vector(320,9);

MFG
Falk

von mr.chip (Gast)


Lesenswert?

Hmm...lesen bildet, und genau lesen bildet sogar noch mehr. Stimmt, er 
mochte den reinen Integer nicht :-)

von Rick Dangerus (Gast)


Lesenswert?

Aber ehe Du einen Multiplikator dafür verbrätst, verwende doch
1
-- x*256 + x*64 = x*320
2
saddr <= std_logic_vector( (row sll 8) + (row sll 6) );
Da brauchst Du nur einen Adder (row sollte unsigned sein).

Rick

von Frank S. (Firma: Keine) (franks)


Lesenswert?

Kann mir an dieser stelle einer sagen was überhaupt

unsigned und signed  bedeutet ?



Gruß

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.