Forum: FPGA, VHDL & Co. Mathematische Operationen, ein Problem?


von PIC N. (eigo) Benutzerseite


Lesenswert?

Hallo zusammen,
ich habe ein schon etwas längeres Programm geschrieben, welches 
angemessen lange (ca. 2-3 min) bei der Syntehe benötigt. Nun habe ich 
das Programm noch um eine letzte wichtige Komponente erweitert, doch 
plötzlich führt die Synthese zu keinem Ende mehr (ich habe über 1 Std. 
gewartet).

Was habe ich erweitert?

Es gibt in meinem Programm eine Integer Signal, welches bei jedem Takt 
um 1 erhöht wird, wenn ich in einem bestimmten Prozess bin. Diese soll 
quasi eine Zeitmessung wiederspiegeln.

Diese Zeit möchte ich nun "auswerten". Mein Systemtakt beträgt 50 MHz. 
Also entspricht ein Takt einer Dauer von 2E-8 Sekunden. Ergo sind 500E3 
Takte = 10ms.

Ich möchte diese Zeit nun in Millisekunden-Stellen aufteilen:

Es gibt vier Stellen:

- Zehntausend entspricht 10.000 ms = 10 s
- Tausend entspricht 1.000 ms = 1 s
- Hundert entspricht 100 ms = 0,1 s
- Zehn entspricht 10 ms = 0,01 s

Das war meine Idee (am Beispiel der Zehntausender Stelle [50 MHz Takt]):
1
signal TIMER: integer;
1
while (TIMER > (500000000)) loop
2
  X := X + 1;
3
  TIMER <= TIMER - (500000000);
4
end loop;

Nach dieser Schleife steht in X die Anzahl "wie oft 10s vorkamen".
Danach kann dann ermittelt werden wie oft 1s vorkam usw. usf.

Doch sobald ich diese while Schleifen in mein Programm einbaue ist 
Feierabend und er Synthetisiert bis zum Sankt Nimmerleinstag..

Was mache ich verkehrt?

Viele Grüße

von Klaus F. (kfalser)


Lesenswert?

Nico M. schrieb:
> Das war meine Idee (am Beispiel der Zehntausender Stelle [50 MHz Takt]):
> signal TIMER: integer;
> while (TIMER > (500000000)) loop
>   X := X + 1;
>   TIMER <= TIMER - (500000000);
> end loop;

Du meinst das doch nicht ernst oder?
Dafür hat man doch schon vor Jahrtausenden die Division erfunden!

von Ermel Hoch (Gast)


Lesenswert?

Nico M. schrieb:
> while (TIMER > (500000000)) loop
>   X := X + 1;
>   TIMER <= TIMER - (500000000);
> end loop;

loop?!

von Klakx (Gast)


Lesenswert?

meinst du wirklich Synthese? mir klingt das eher nach "hängt in der 
Simulation fest"

das code-schnipsel ist ein wenig mager um eine Aussage über den Fehler 
zu treffen.

Ich vermute, dass der Simulator immer in den Process springt und nie 
fertig wird bzw. wird die while schleife nie verlassen.

gruß

von anderes ich (Gast)


Lesenswert?

mach das ganze sequentiell und nicht kombinatorisch! Du generierst dier 
hier sehr viele hintereinandergeschaltete Subtrahierer und Addierer!

VHDL != C

von PIC N. (eigo) Benutzerseite


Lesenswert?

Hallo!

@Klaus Falser: Mit einer Division bekomme ich ständig Fehlermeldungen.
@Ermel Hoch: ?
@Klakx: Ja, ich meine Synthese.

Ich habe mit VHDL so gut wie keine Erfahrung, daher bin ich hier..

Edit:

@anderes ich: Und das soll wie aussehen?

von PIC N. (eigo) Benutzerseite


Lesenswert?

Das ist doch die Schreibweise für eine while Schleife oder?
1
[<label>:] while <expression> loop
2
   -- ...
3
end loop [<label>];

Edit: Habe gerade einen Satz von L.M. gefunden, wo er sagt, dass man 
keine while-loop Schleifen benutzen soll. Mhh, dann muss ich das 
irgendwie anders lösen. Irgendwie komisch wenn man Ewigkeiten nur 
C/C++/Java geproggt hat :-(

von Gustl B. (-gb-)


Lesenswert?

Ich mache auch sowas, bei 100MHz. kombinatorisch geht zwar sehr schnell, 
braucht aber hier extrem viel Logik, daher kann das schon sein dass das 
länger dauert.

Ich habe das in einem getaktetet process:

if    timer                 timer > 99999999 then
      timer <= timer - 10000000;
      sekunden <= sekunde + 1;
elsif timer < 100000000 and timer > 9999999 then
      timer <= timer - 10000000;
      hundert_ms <= hundert_ms + 1;
elsif timer < 10000000 and timer > 999999 then
      timer <= timer - 1000000;
      zehn_ms <= zehn_ms + 1;
elsif timer < 1000000 and timer > 99999 then
      timer <= timer - 100000;
      eine_ms <= eine_ms + 1;
end if;

Also das ist die Zerlegung in Zehnerstellen, dauert aber etwas, also 10 
Takte je Zehnerstelle maximal.

von PIC N. (eigo) Benutzerseite


Lesenswert?

Danke Gustl Buheitel, ich denke, das hilft weiter!

von Ermel Hoch (Gast)


Lesenswert?

Loop ist quatsch, dividiere verwenden ist auch Quatsch. Was du willst, 
ist ein dekadisches Zählwerk. Schau mal hier:

http://www.doulos.com/knowhow/vhdl_designers_guide/tips/sequential_processes/

vorletzter Kasten.

Oder was ähnliches hier:
 http://vhdlguru.blogspot.de/2010/03/digital-clock-in-vhdl.html

MfG,

von Gustl B. (-gb-)


Lesenswert?

Ja, logo, das ist vielleicht wirklich das Beste gleich das Zählwerk so 
zu bauen dass es die richtigen Zeiteinheiten ausspuckt.

Der zweite Link zeigt gut wie das geht.

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.