Forum: FPGA, VHDL & Co. numeric_std - integer - Division durch 0


von ein_Gast (Gast)


Lesenswert?

Hallo zusammen,

ich habe ein VHDL Modul in einem FPGA bekommen und bei einem bestimmten 
Registerwert verhält es sich komisch.
Leider habe ich keine Tools zur Simulation da bzw. habe auch keinen 
Zugriff auf das FPGA Design, damit ich mir Debugleitungen herauslegen 
könnte.

Darin enthalten ist:
1
GENERIC(
2
    input_clk   : INTEGER := 5_000_000); -- 5MHz
3
  PORT(
4
...
5
    bus_clk     : IN     STD_LOGIC_VECTOR(15 downto 0); --register
6
...

Mit diesem Generic und dem Regsiter wird ein Teiler berechnet.
1
divider <= (input_clk/(to_integer(unsigned(bus_clk)) * 100));

Was passiert, wenn das Register den Wert 0 hat?
Dann habe ich eine "verbotene" Division durch 0.
Wie verhalten sich die Tools in einem solchen Fall?

Compilieren und die Synthese laufen offenbar auf dem FPGA durch... also 
muss der Fall irgendwie angefangen bzw. interpretiert werden. Nur wie?

Vielen Dank!

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


Lesenswert?

ein_Gast schrieb:
> Compilieren und die Synthese laufen offenbar auf dem FPGA durch...
Was wird aus diesem unglaublich naiven / gemacht? Macht die Toolchain da 
echt eine kombinatorische 16-Bit-Division rein? Das wäre ja unglaublich 
langsam und aufwändig...

> also muss der Fall irgendwie angefangen bzw. interpretiert werden. Nur wie?
Eine Division durch Null liefert ein undefiniertes Ergebnis. Wobei mich 
dieser sehr naive Umgang mit der Division doch überaus nachdenklich 
stimmt. Ist bus_clk evtl. eine Konstante? Oder hat bus_clk einen 
konstanten Wert?

von ein_Gast (Gast)


Lesenswert?

Die Division hat mich auch stutzig gemacht.
Ich verwende auch lieber Integer zum rechnen, teile dann aber bewusst 
nur durch 2**n Werte, so dass die Synthese dann nur shiften muss und 
nicht übel rechnen.

bus_clk ist ein variabler Port und kann mit Hilfe eines Registers 
beschrieben werden. Und als solches wird es hoffentlich auch von der 
Synthese behandelt.

Vielleicht gibt es vom Designer irgendwelche Vorgaben oder Empfehlungen, 
dass bus_clk nur 2**n sein darf. Diese sind mir aber nicht bekannt und 
so habe ich es beliebigen bus_clk Werten getestet.

Ich finde die Sache auch sehr unglücklich.
Habe aber leider nur den bit-Stream und keine weiteren Details zum 
FPGA-Design. Nur die Quellen...

Vielen Dank!

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


Lesenswert?

ein_Gast schrieb:
> Vielleicht gibt es vom Designer irgendwelche Vorgaben oder Empfehlungen,
> dass bus_clk nur 2**n sein darf. Diese sind mir aber nicht bekannt
Und auch dem Synthesizer nicht. Der muss dann eine kombinatorische 
Division durchführen. Irgendwas ist da ganz arg faul...

ein_Gast schrieb:
> habe auch keinen Zugriff auf das FPGA Design
Oder doch?
> keine weiteren Details zum FPGA-Design. Nur die Quellen...
Naja, was will man mehr?
Sind da noch weitere solcher Merkwürdigkeiten im Code?

ein_Gast schrieb:
> bei einem bestimmten Registerwert verhält es sich komisch.
Wie vermittelt sich diese Komik? Hat das was mit der Ecke hier zu tun?

von Strubi (Gast)


Lesenswert?

Moin,

da schreit einer "bad practise" aus dem Hintergrund..
Der Divider als solcher sollte in das Register, was bei dieser 
Umrechnung passiert, entscheiden sonst die Tools selber und das kommt 
öfters nicht gut. Der Simulator fängt DIV0 ab, aber für die Synthese ist 
das undefiniert. Erstaunlich, dass aus der Division überhaupt was 
synthetisiert wird. Um welche Toolchain geht es?
Ansonsten mein Fazit: Dem Ursprung dieser Praktik nachgehen und den 
Lieferanten rügen :-)

Grüsse,

- Strubi

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


Lesenswert?

Strubi schrieb:
> Erstaunlich, dass aus der Division überhaupt was synthetisiert wird.
Man müsste es mal wieder ausprobieren wie im 
Beitrag "Rechnen mit unsigned vs. signed und einer division"

: Bearbeitet durch Moderator
von Gustl B. (-gb-)


Lesenswert?

Tatsache, gestern hab ich in einem Kurs erklärt wie man die Division 
durch eine Konstante die keine Zweierpotenz ist als Multiplikation mit 
einer Zahl und Division durch eine Zweierpotenz macht aber ... ein 
Teilnehmer hat einfach /3 in VHDL geschrieben und das hat anstandslos 
synthetisiert. War dann ein fetter kombinatorischer Dividierer. Die 
Frage ist jetzt nur aus Interesse:
Seit wann geht das? ISE hat das sicher nicht gemacht, aber war das bei 
VIVADO schon von Anfang an dabei oder ist das erst in einer der letzten 
Versionen dazugekommen?

von Duke Scarring (Gast)


Lesenswert?

Gustl B. schrieb:
> Seit wann geht das? ISE hat das sicher nicht gemacht
Keine Ahnung, aber auch die ISE kann das schon (getestet auf Spartan3E).

Duke

von Gustl B. (-gb-)


Lesenswert?

Stimmt, hier auch. Aber ich kann mich noch sehr deutlich an eine 
Fehlermeldung erinnern früher als ich versuchte durch eine Konstante zu 
teilen die keine Zweierpotenz war. Hm ... seltsam oder eine 
Fehlwahrnehmung.

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


Lesenswert?

Gustl B. schrieb:
> früher
Ja, da ging das noch nicht.
Aber der Klügere gibt nach und deshalb geht es heute. Altera (Synplify) 
konnte das schon vor Xilinx (XST).

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.