mikrocontroller.net

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


Autor: Bstelboy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
habe mal als Test versucht einen 4 * 4 Multiplizierer in ein XC9572 zu 
bekommen. Geht anscheinend nicht, zu komplex.
Hier mein Code:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity Multiplier1 is
Port (A,B      : in  std_logic_vector (3 downto 0);
      Produckt : out std_logic_vector (7 downto 0));
end Multiplier1;

architecture Behavioral of Multiplier1 is
begin
Produckt(7 downto 0) <= A * B;
end Behavioral;

Kann man was machen?

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

Bewertung
0 lesenswert
nicht lesenswert
> Kann man was machen?
Bei mir gehts:
Macrocells Used  Pterms Used  Registers Used  Pins Used  Function Block Inputs Used 
  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:
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;

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

architecture Behavioral of Multiplier is
begin
  z <= std_logic_vector(unsigned(a)*unsigned(b));
end Behavioral;

Was machst du falsch?



BTW:
Produkt ohne c  ;-)

Autor: Antti (Gast)
Datum:

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

Autor: Antti (Gast)
Datum:

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

Antti

Autor: Antti (Gast)
Datum:

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

Autor: Bastelboy (Gast)
Datum:

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

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.