www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Division von STD_LOGIC_VECTOR


Important announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: hans (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
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

Autor: Dimi S. (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Als beispiel kann ich diese Implementierung empfehlen:

http://opencores.org/websvn,filedetails?repname=pl...

Division von 2 32bit vectoren dauert 32 Takte.

Bei Altera' Quartus und Xilinx ISE kann man es mittels
Core-Generator erledigen. Ist aber Hardwarespezifisch.

MfG

Autor: hans (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Dimi S., danke für die Info

Autor: hans (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
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
constant MODE_DIV  : std_logic := '1';
 und
 constant MODE_MULT : std_logic := '0';
 setze?

Jedoch welche Länge muss der Wert muss
signal count_reg   : std_logic_vector(? downto 0);
 besitzen?


Grüße,

hans

Autor: hans (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
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 ;-)

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

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Dimi S. schrieb:
> Als beispiel kann ich diese Implementierung empfehlen:
Ich diese hier  ;-)
http://www.lothar-miller.de/s9y/archives/29-Divisi...

Autor: hans (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Vielen Dank Lothar,

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?

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

Autor: Drill Tutor (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
>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ß

Autor: knut (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Wenn ich es mit zwei 36 Bit Werten (welche jetzt zwar nicht den vollen 
Bereich ausnutzen)
dividend <= std_logic_vector(to_unsigned(52215,36));
    divisor  <= std_logic_vector(to_unsigned(3534,36));

versuche, kommt zwar der richtige Quotient raus, jedoch ein falscher 
Rest.

Jedoch musste ich dazu ja auch den
Generic ( b  : natural range 4 to 36 := 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?

Autor: JBB (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
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.

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

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
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....

Autor: Tom (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
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:
dividend32 <= divident[0:31]
 wenn Dividend vorher ein 36 Bit Signal ist ?

Autor: Tom (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
nein, so geht es schon mal nicht :(

Autor: Tom (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
  dividend36 <= std_logic_vector(to_unsigned(15579,36));
  dividend <= dividend36(35 downto 4); 

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.

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

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
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.
?

Autor: Tom (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
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.

  dividend36 <= std_logic_vector(to_unsigned(15579,36));       
  dividend <= dividend36(35 downto 4);
        divisor  <= std_logic_vector(to_unsigned(110,32));

    wait for 5 ns;
    start <= '1';
    wait for 25 ns;
    start <= '0';
    wait for 50 ns;

.
.
.




Oder kann ich das so gar nicht umsetzen?

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




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 erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net