Forum: FPGA, VHDL & Co. Diskreter Multiplizierer in VHDL


von Klaus P. (Gast)


Lesenswert?

Moin,

ich wollte mal wissen, wie man einen Multiplizierer in VHDL beschreibt, 
der aus diskreter Logik aufgebaut ist. Mir ist erst einmal als Ansatz 
das "schriftliche multiplizieren" gekommen, aber vielleicht gibt es ja 
auch schlauere Ideen. So baut man ja schon eine ganz schöne Logikwolke 
auf, v.A. wenn die Faktoren größer werden

Hier mal eine Dummy Implementierung, wie ich mir die schriftliche 
Multiplikation in VHDL vorstelle:
1
signal a : unsigned(2 downto 0);
2
signal b : unsigned(2 downto 0);
3
signal p : unsigned(5 downto 0);
4
5
 
6
variable vP : unsigned (p'range)
7
begin
8
  vP := (others => '0');
9
  for i in a'range loop
10
    vP := vP(4 downto 0) & '0'; -- vP * 2
11
    if a(i) = '1' then
12
      vP := vP + b;
13
    end if;
14
  end loop;
15
  P <= vP;
16
end;

von Mampf F. (mampf) Benutzerseite


Lesenswert?

Klaus P. schrieb:
> Hier mal eine Dummy Implementierung, wie ich mir die schriftliche
> Multiplikation in VHDL vorstelle:

(Fast) genauso schnell hast du das mit einem VHDL-Tool deiner Wahl im 
Simulator ausprobiert.

Dann könntest du uns funktionsfähigen Code zeigen.

Oh wait ... das ist ja richtig übel, was du da gebaust hast.

Der naivste aller Ansätze ... Ich schau mal, ob ich was gutes für dich 
finde.

: Bearbeitet durch User
von Mampf F. (mampf) Benutzerseite


Lesenswert?

Versuch mal das C-Stückchen nach VHDL zu portieren:
1
#include<stdio.h>
2
3
int main() {
4
    int left = 1342;
5
    int right = 3211;
6
    
7
    int sum=0;
8
    while (left != 1) {
9
        left >>= 1;
10
        right <<= 1;
11
        if (left & 0x1) {
12
            sum += right;
13
        }
14
    }
15
    printf("%d\n", sum);
16
    
17
    return 0;
18
}

Der läuft auf Hardware dann richtig gut.

Ich könnte es selbst schnell machen, aber ich weiß ja schon wie es geht.

Gibt auch ein Video dazu, wie das multiplizieren genau funktioniert:

https://www.youtube.com/watch?v=aVrJIhgHqrw

: Bearbeitet durch User
von Armleuchter Auspuster (Gast)


Lesenswert?

Klaus P. schrieb:
> ich wollte mal wissen, wie man einen Multiplizierer in VHDL beschreibt,
> der aus diskreter Logik aufgebaut ist. Mir ist erst einmal als Ansatz
> das "schriftliche multiplizieren" gekommen,

Alter, besorg die einen Grundlagentext, da musst du dir nichts aus den 
Finger saugen

https://de.wikipedia.org/wiki/Dadda-Tree-Multiplizierer
https://de.wikipedia.org/wiki/Wallace-Tree-Multiplizierer
https://en.wikipedia.org/wiki/Binary_multiplier

Andraka kennt noch ein paar mehr:
http://www.andraka.com/multipli.php

Und die Frage nach einem diskreten Multiplizierer in VHDL ist reichlich 
zweckfrei, weil die Architektur (Xilinx, Altera, ASIC-lib) entscheidend 
ist und nicht die benutzte Beschreibungssprache.

Wurde auch schon öfters hier durchgekaut, einfach mal das Archiv 
benutzen:
Beitrag "Multiplizierer in VHDL"

von chris (Gast)


Lesenswert?

Hier ist einer im Angebot:
Beitrag "Re: VHDL Grundlagen : Rechnen"

von Vancouver (Gast)


Lesenswert?

Wenn Du von "diskreter Logik" sprichst, meinst vermutlich so etwas wie 
Gatterebene. Noch diskreter wären Transistoren, aber damit tut man sich 
etwas schwer in VHDL.
In deiner Implementierung  gibt es aber nirgendwo Gatter. Stattdessen 
gibt es Variablen und Schleifen. Hast du da vielleicht ein 
"VHDL-Programm" geschrieben?

Zum Verständnis: Eine Multiplikation in VHDL beschreibt man 
üblicherweise mit p <= a*b und überlässt es der Synthese, daraus eine 
Gatterschaltung zu erzeugen (das ist die Aufgabe der Synthese).
Zu Übungszwecken kannst (und solltest) du natürlich auch den 
Multiplizierer mal "diskret" formulieren. Dazu darfst du nur Gatter und 
Flipflops verwenden, oder im VHDL-Sprech: Kombinatorische Ausdrücke und 
getaktete Prozesse. Oder Gatterprimitive, wenn du es auf die ganz harte 
Tour machen willst, aber das muss wirklich nicht sein.
Also schau dir mal die Multipliziererverfahren an, die oben schon 
verlinkt wurden, und versuche daraus mal eine Gatterschaltung zu machen, 
und die formulierst du dann in VHDL. Als Einstieg könntest du erst mal 
mit einem Addierer anfangen.

Und lass die Finger von Schleifen und Variablen. Als Anfänger 
fabrizierst du damit nur Unfug. Diese Konstrukte haben in VHDL eine 
andere Bedeutung als in Programmiersprachen.

von Mampf F. (mampf) Benutzerseite


Lesenswert?

Vancouver schrieb:
> Und lass die Finger von Schleifen und Variablen. Als Anfänger
> fabrizierst du damit nur Unfug. Diese Konstrukte haben in VHDL eine
> andere Bedeutung als in Programmiersprachen.

FULL ACK ... das, was er da oben versucht hat zu formulieren, wäre 
unsynthetisierbar - und unrettbar.

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


Angehängte Dateien:

Lesenswert?

Mampf F. schrieb:
> Versuch mal das C-Stückchen nach VHDL zu portieren
Dein C-Code macht das selbe wie die VHDL Beschreibung vom TO Klaus P. 
Bei dessen VHDL-Code muss man nur noch ein paar Syntaxfehler beheben und 
dann simuliert der schon ganz gut.

Mampf F. schrieb:
> das, was er da oben versucht hat zu formulieren, wäre unsynthetisierbar
Hmmm, ich sehe da nichts, was der Synthesizer nicht kapieren könnte. Ein 
paar Addierer und jeweils ein Mux davor. Das sollte er schon noch 
hinbekommen...

Und tatsächlich: die beiden nötigen Addierer und die Handvoll Mux passen 
letztlich in 17 Stück 4er-LUTs.

: Bearbeitet durch Moderator
von Wuerg (Gast)


Lesenswert?

Mampf F. schrieb:
> https://www.youtube.com/watch?v=aVrJIhgHqrw

Wozu wieder ein aufgebähtes Video, um so wenig Information zu 
vermitteln?
Dann doch lieber:

https://www.arndt-bruenner.de/mathe/index/indexframe.htm

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.