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:
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.
Versuch mal das C-Stückchen nach VHDL zu portieren:
1
#include<stdio.h>
2
3
intmain(){
4
intleft=1342;
5
intright=3211;
6
7
intsum=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
return0;
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
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.
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.
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.