Forum: FPGA, VHDL & Co. VHDL diviedieren-x stellen nach rechts verschieben


von Mario (Gast)


Lesenswert?

Hallo,
hab mal ne Frage.

Ich möcht gerne eine 24 bit Zahl durch 128 teilen. da 128 ein vielfaches 
von 2 is, heißt es ja dass die 24 bit zahl um acht stellen nach rechts 
verschoben werden muss. Wie genau implementiert man, dass die bits alle 
richtig verschoben werden.Danke.

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


Lesenswert?

Mario schrieb:
> Ich möcht gerne eine 24 bit Zahl durch 128 teilen
signed oder unsigned?
> Wie genau implementiert man, dass die bits alle richtig verschoben werden.
Man schreibt (mit den passenden Datentypen) einfach
ergebnis <= wert/128;
Den Rest macht der Synthesizer...

von Uli (Gast)


Lesenswert?

Ich würde nur 7 Stellen wegstreichen und davor gfs auch noch runden.

von Mario (Gast)


Lesenswert?

Hallo,

Danke für die Antwort, ich wills lieber mit der Verschiebefunktion 
probieren. Dazu hab ich folgendes gemacht:
1
if div_counter = "1001" then
2
    div_counter <= (others => '0');
3
else
4
    for i in 1 to 23 loop
5
        freq(i-1) <= freq(i);
6
    end loop;
7
end if;

Erst wollte ich einen Dividierer über den core generator des Spartan 
drei generieren, aber er nimmt zuviele Ressourcen weg.

Den zähler zählt bei jeder steigenden Flanke. Sobald er die 8 
überschritten hat, soll er null werden, ansonsten soll er halt den Wer 
um 8 STellen nach rechts verschieben. aber irgenwie klappt das nicht so 
ganz.

Danke für euere Hilfe.

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


Lesenswert?

Mario schrieb:
> Danke für die Antwort, ich wills lieber mit der Verschiebefunktion
> probieren.
Du hast meinen Post nicht gelesen? Oder nicht verstanden?
DAS MACHT DER SYNTHESIZER von ganz allein.
Zudem muss da gar nichts geschoben werden. Sondern da wird auf dem 
FPGA lediglich etwas ein wenig anders verdrahtet. Und aus diesem Grund 
ist der VHDL Code unnötig und vor allem unnötig kompliziert.

> Den zähler zählt bei jeder steigenden Flanke. Sobald er die 8
> überschritten hat, soll er null werden,
Also nach 9 Takten? Oder Denkfehler?
> ansonsten soll er halt den Wer um 8 STellen nach rechts verschieben.
Warum verschiebt er dann den Wert nicht einfach mit jedem Takt um 1 nach 
rechts?

> aber irgenwie klappt das nicht so ganz.
Du DENKST falsch. Du denkst in Software.
Beantworte die Frage: wie würdest du deine SCHALTUNG mit Zählern, 
Schieberegistern, Logischen Verknüpfungen und Flipflops aufbauen?

Kurz: vergiss einfach C oder Basic oder sonstwas. Was du mit VHDL 
machst, ist Hardware...

> aber irgenwie klappt das nicht so ganz.
Wie wäre es, wenn du mal den ganze Quelltext hier als VHDL-Datein 
anhängst?

von Jaro (Gast)


Lesenswert?

Ui, Lothar hat die Fassung verloren. :-)
Ist ja auch zu schlimm mit den Möchtegern VHDl-ern

von Seennoob (Gast)


Lesenswert?

@Jaro Jeder fängt mal klein an !

von Jaro (Gast)


Lesenswert?

Dass man binär nicht dividieren muss sondern schiebt, war mit schon als 
12Jähriger klar und beim ersten PLD mit 19 an der Uni habe ich direkt 
umverdrahtet, statt zu Schieben und das alles, ohne, dass es mir einer 
gesagt hätte. Sowas ist augenscheinlich klar.

Auch das mit dem Runden war mir sofor klar.

Frage an den TE: Wieviel muss Du addieren, bevor du durch 128 teilst?

von Stefan W. (wswbln)


Lesenswert?

Jaro schrieb:
> Dass man binär nicht dividieren muss sondern schiebt, war mit schon als
> 12Jähriger klar [...] Sowas ist augenscheinlich klar.
>
> Auch das mit dem Runden war mir sofor klar.

Fein! Du hast unsere volle Bewunderung!

Aber zurück zum Thread: Das Problem beim TE liegt viel tiefer und wurde 
von Lothar (et.al.) spätestens bei der vierten oben veröffentlichten 
VHDL-Zeile klar erkannt: Er denkt in sequenzieller Software und nicht in 
paralleler Hardware.

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.