Hallo Allerseits,
ich möchte in VHDL eine synthetisierbare Division durchführen. Nun
möchte ich einen std_logic_vector(35 downto 0) durch einen
std_logic_vector(23 downto 0) dividieren. Beides sind positive Werte.
Dazu würde ich den Dividenden und den Divisor erst einmal in Typ
unsigned konvertieren, um mit diesen besser rechnen zu können.
Nun meine Frage: Welcher Algorithmus ist für eine solche Division am
geeignetsten? Gibt es für solch eine Aufgabe einen fertigen Baustein?
Da mein Dividend und Divisor eine unterschiedliche Länge aufweisen,
sollte man den kleinen Wert dann mit 0en auffüllen, um auf die gleiche
Länge zu kommen?
Viele Grüße,
hans
Wo finde ich denn das mlite_pack ? Und füge ich das nur in das
Stammverzeichnis meiner Top Level Entity ein?
Kann das Design ohne weiteres auf 36 Bit modifiziert werden, indem ich
lediglich die 31 durch die 35, die 32 durch die 36 ersetze und
hans schrieb:> Wo finde ich denn das mlite_pack ? Und füge ich das nur in das> Stammverzeichnis meiner Top Level Entity ein?
Ist das die vhdl Datei unter plasma\trunk\vhdl\mlite_pack.vhd?
Dann habe ich sie gefunden ;-)
Vielen Dank Lothar,
was ich jedoch noch nicht so richtig verstanden habe, was die natural
range 4 to zu bedeuten hat.
1
Generic(b:naturalrange4to32:=32);-- Breite
Die Breite ist doch dadurch auf 32 vorinitialisiert, oder verstehe ich
falsch?
Um das Design für zwei 36 Bit Werte zu benutzen, muss doch nur der b
Generic Parameter auf 36 modifziert werden, oder verstehe ich das
nochmals falsch? ;)
Vielen Dank,
hans
>was ich jedoch noch nicht so richtig verstanden habe, was die natural>range 4 to zu bedeuten hat.>Generic ( b : natural range 4 to 32 := 32 ); -- Breite>Die Breite ist doch dadurch auf 32 vorinitialisiert, oder verstehe ich>falsch?
Nein, da wird nichts "vorinitialisiert", es besagt nur, das wenn bei der
Instanziierung keine Generic mapping angegeben wird, dann steht b auf
32.
"natural range" isat hier typdefinition mit bereichseinschränkung. Beim
generic mapping sollten nur Integer von 4 bis 32 angegeben werden. Die
range - Überprüfung muss aber in der simulation meist extra angeschaltet
werden, ob sich die Synthese drum schert ist auch noch fraglich. Ob das
Mosul auch mit einer bereichserweiterung auf 36 bit zufriedenstellend
funktioniert, kannst du nur durch Simu/test überprüfen.
Gruß
versuche, kommt zwar der richtige Quotient raus, jedoch ein falscher
Rest.
Jedoch musste ich dazu ja auch den
1
Generic(b:naturalrange4to36:=36);-- Breite
setzen, da ansonsten die Fehlermeldung
"tb_division.vhd" Line 46: Expression has 36 elements ; expected 32 "
kommt, welche bestimmt darauf hinweisen ...
Drill Tutor schrieb:> Beim> generic mapping sollten nur Integer von 4 bis 32 angegeben werden
verstehe ich das richtig?
Es ist in der Regel möglich, die Eingangsvektoren (Definitionsbereich)
so zu schieben, dass die Teilung immer mit 32 geschehen kann, was auch
Sinn macht, weil die Grösse des Ausgangsvektors (Wertebereich) auch
beschränkt ist.
hans schrieb:>> Um das Design für zwei 36 Bit Werte zu benutzen, muss doch nur der b>> Generic Parameter auf 36 modifziert werden, oder verstehe ich das>> nochmals falsch? ;)> Generic ( b : natural range 4 to 36 := 36 ); -- Breite
Dann solltest du aber vorher schon noch nachsehen, ob du den Algorithmus
einfach so einfach aufbohren kannst. Aber: ausprobieren kann nicht
schaden....
Ich habe mal eine ganz blöde Frage:
Ich könnte doch einfach die niederwertigsten 4 Bit weg lassen und dann
den tollen Divisionsalgorithmus von LM nehmen? Da sind doch gerade mal
16 im Dezimalen bei einer 32 Bit Zahl.
Ich habe nur gerade echt ein Brett vorm Kopf. Kann ich dann einfach
sagen:
Hmm, so funktioniert es auch nicht.
In der Testbench von LM wird zwar jetzt divisor und dividend36 richtig
angezeigt, jedoch ist dividend, quotient und remainder 0.
Tom schrieb:> Hmm, so funktioniert es auch nicht.
Was funktioniert so auch nicht?
> In der Testbench von LM wird zwar jetzt divisor und dividend36 richtig> angezeigt, jedoch ist dividend, quotient und remainder 0.
?
Guten Morgen,
Lothar Miller schrieb:> Was funktioniert so auch nicht?
ich möchte Deinen Divisionsalgorithmus verwenden. Divisor und Dividend
haben eine Länge von 32 Bit. Wenn ich nun die niederwertigsten 4 Bit
Werte eines 36 Bit Signals weg lassen würde und die übrig gebliebenen 32
Bit Werte deinem Dividenden in der Testbench zuordne, kommt bei
Dividend, Quotient und Remainder 0 heraus. Dem Dividend wird kein Wert
zugeorndet.