Forum: FPGA, VHDL & Co. Multiplizierer im CPLD XC9572


von Bstelboy (Gast)


Lesenswert?

Hi,
habe mal als Test versucht einen 4 * 4 Multiplizierer in ein XC9572 zu 
bekommen. Geht anscheinend nicht, zu komplex.
Hier mein Code:
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 Multiplier1 is
7
Port (A,B      : in  std_logic_vector (3 downto 0);
8
      Produckt : out std_logic_vector (7 downto 0));
9
end Multiplier1;
10
11
architecture Behavioral of Multiplier1 is
12
begin
13
Produckt(7 downto 0) <= A * B;
14
end Behavioral;

Kann man was machen?

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


Lesenswert?

> Kann man was machen?
Bei mir gehts:
1
Macrocells Used  Pterms Used  Registers Used  Pins Used  Function Block Inputs Used 
2
  25/72 (35%)    187/360 (52%)   0/72 (0%)    16/34 (48%)    47/144  (33%)
Mit deiner Beschreibung kommt das selbe raus wie mit meiner:
1
library IEEE;
2
use IEEE.std_logic_1164.all;
3
use IEEE.numeric_std.all;
4
5
entity Multiplier is
6
    Port ( a : in  STD_LOGIC_VECTOR (3 downto 0);
7
           b : in  STD_LOGIC_VECTOR (3 downto 0);
8
           z : out  STD_LOGIC_VECTOR (7 downto 0));
9
end Multiplier;
10
11
architecture Behavioral of Multiplier is
12
begin
13
  z <= std_logic_vector(unsigned(a)*unsigned(b));
14
end Behavioral;

Was machst du falsch?



BTW:
Produkt ohne c  ;-)

von Antti (Gast)


Lesenswert?

JA.

die 4x4 nimmt entweder 24 oder 11 MC in XC95xxXL CPLD
wiese gehts bei dir nicht???

---------------------------

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

entity mult4 is
    Port ( a : in  STD_LOGIC_VECTOR (3 downto 0);
           b : in  STD_LOGIC_VECTOR (3 downto 0);
           p : out  STD_LOGIC_VECTOR (7 downto 0));
end mult4;

architecture Behavioral of mult4 is

signal p1 : STD_LOGIC_VECTOR (7 downto 0);
signal p2 : STD_LOGIC_VECTOR (7 downto 0);
signal p4 : STD_LOGIC_VECTOR (7 downto 0);
signal p8 : STD_LOGIC_VECTOR (7 downto 0);

begin
  p1 <= ("0000" & B)      when a(0)='1' else X"00";
  p2 <= ("000" & B & "0") when a(1)='1' else X"00";
  p4 <= ("00" & B & "00") when a(2)='1' else X"00";
  p8 <= (B & "0000")      when a(3)='1' else X"00";


  --P <= A * B; -- 24 MC
  P <= p1 + p2 + p4 + p8; -- 11 macrocell, ANTTI BRAIN methode


end Behavioral;

-- http://groups.google.com/group/antti-brain?hl=en

von Antti (Gast)


Lesenswert?

uuuups, ich habe a b als integers 0..15 genommen
naja geht in 72 rein so oder so...

Antti

von Antti (Gast)


Lesenswert?

binwohl selbst voll idiot
bitte alles loschen meine dummheiten, muss zwar urlaub machen

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

entity mult4 is
    Port ( a : in  STD_LOGIC_VECTOR (3 downto 0);
           b : in  STD_LOGIC_VECTOR (3 downto 0);
           p : out  STD_LOGIC_VECTOR (7 downto 0));
end mult4;

architecture Behavioral of mult4 is

signal p1 : STD_LOGIC_VECTOR (7 downto 0);
signal p2 : STD_LOGIC_VECTOR (7 downto 0);
signal p4 : STD_LOGIC_VECTOR (7 downto 0);
signal p8 : STD_LOGIC_VECTOR (7 downto 0);

begin

--  p1 <= ("0000" & B)         when a(0)='1' else X"00";
--  p2 <= ("000"  & B & "0")   when a(1)='1' else X"00";
--  p4 <= ("00"   & B & "00")  when a(2)='1' else X"00";
--  p8 <= ("0"    & B & "000") when a(3)='1' else X"00";

  p1 <= (B(3) & B(3) & B(3) & B(3) & B)      when a(0)='1' else X"00";
  p2 <= (B(3) & B(3) & B(3) & B & "0")       when a(1)='1' else X"00";
  p4 <= (B(3) & B(3) & B & "00")             when a(2)='1' else X"00";
  p8 <= (B(3) & B & "000")                   when a(3)='1' else X"00";

  --P <= A * B; -- 24 MC
  P <= p1 + p2 + p4 + p8; -- 11 macrocell, ANTTI BRAIN methode

end Behavioral;

von Bastelboy (Gast)


Lesenswert?

Hallo Antti

danke für deinen VHDL-Code.
Ich weiss leider auch nicht, warum es bei mir nicht mit einem 4*4 
Multiplizierer klappt. Ich benutze ISE Web Pack V6.3 um mit dem Buch vom 
Rainer Jost kompatibel zu sein. (Daran sieht man, das ich nit CPLD und 
VHDL ein absoluter Anfänger bin) Bekomme leider die Fehlermeldung, das 
mein 4*4 Multiplizierer zu komplex für ein XC9572 währe.

Habe mir dann mal deinen zuletzt geposteten VHDL-Code durchgesehen:
Anscheinend ist die Optimierung von dem Tool das du verwendest 
suboptimal.
Es werden 24 Macrozellen gebraucht, und bei deinem nur 11. Super!

So wie du es geschrieben hast ist es meiner Meinung nach für die 
Multiplikation einer Zahl mit Vorzeichen (B) mit einer Zahl ohne 
Vorzeichen (A).

Bei den Multiplikationen gibt's 4 Möglichkeiten:

1.  unsigned * unsigned
2.  unsigned *   signed
3.    signed * unsigned
4.    signed *   signed

Sollte man irgendwo schreiben!!! VHDL kennt ja die Datentypen signed und 
unsigned.

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.