Forum: FPGA, VHDL & Co. Verdammt ineffizienter Code?


von Viktor B. (coldlogic)


Lesenswert?

Hi Leute,
Ich hätte da das folgende Problem: Ich hab mal für ein größeres Projekt 
in VHDL einen Baustein implementiert, der am SPI angeschlossen wird und 
12 mal servotaugliches PWM liefert. Nun wollte ich das natürlich auf 
einem CPLD laufen lassen, die Wahl fiel auf die von Xilinx, weil ich mit 
dem ISE arbeite. Das Problem ist - das Projekt passt nur auf den ganz 
großen Coolrunner II! Obwohl es im Grunde ein 5-Bit-Demultiplexer, ein 
22- und 13 8-Bit-Zähler und ca. 32 8-bit-Register sind. Von den Outputs 
her hätte der kleinste gereicht, und der war auch der Einzige, den ich 
einigermaßen löten konnte. Hab ich mich um Größenordnungen verschätzt 
(ist auch das erste Mal, das ich so was mache)?

Den Code kann ich leider gerade nicht posten, da der aus vielen Dateien 
besteht, von denen ein paar noch sehr WIP sind. Aber auch die Dateien 
sind klein bzw. sollten es sein.

Irgendeine Idee, woran es liegen kann? Was ist so der häufigste Fehler, 
der zu einer Hardwarebedarfexplosion führt?

MfG

von TestX (Gast)


Lesenswert?

Liegt wahrscheinlich an deinem Code...ohne den kann man schlecht eine 
Aussage treffen...

Nebenbei ist auch die Frage relevant wozu du das überhaupt machen willst 
? Ein rein akademisches Problem ?

von Schreiber (Gast)


Lesenswert?

Viktor B. schrieb:
> Ich hätte da das folgende Problem: Ich hab mal für ein größeres Projekt
> in VHDL einen Baustein implementiert, der am SPI angeschlossen wird und
> 12 mal servotaugliches PWM liefert. Nun wollte ich das natürlich auf
> einem CPLD laufen lassen

Sowas kann man auch auf einem AVR-Tiny laufen lassen. Erfordert aber 
etwas Hirnschmalz und Basic oder C statt VHDL.

von Viktor B. (coldlogic)


Lesenswert?

Update: Hab mal das Ganze abschnittsweise gefitted. Sieht aus, als ob 
keine der Komponenten jetzt irgendwie viiiel mehr benötigt als die 
anderen. Heißt also entweder kein Fehler oder er ist überall.

Anbei die .htm fitter report Datei. Vielleich ist da was Auffälliges zu 
sehen.


TestX schrieb:
> Nebenbei ist auch die Frage relevant wozu du das überhaupt machen willst
> ? Ein rein akademisches Problem ?

Es ist ein Teil eines Autopiloten. Wird entweder an einen RPi oder µC 
angeschlossen. Wollte ich nur als Hobbyprojekt machen

von Sebastian E. (Gast)


Lesenswert?

Kenne jetzt den CoolRunner nich im Detail, aber ich erinnere mich, dass 
CPLDs z.T. sehr wenige Flipflops haben. Evtl. ist das der Grund für den 
hohen Ressourcenbedarf.

von Viktor B. (coldlogic)


Lesenswert?

Schreiber schrieb:
> Viktor B. schrieb:
>> Ich hätte da das folgende Problem: Ich hab mal für ein größeres Projekt
>> in VHDL einen Baustein implementiert, der am SPI angeschlossen wird und
>> 12 mal servotaugliches PWM liefert. Nun wollte ich das natürlich auf
>> einem CPLD laufen lassen
>
> Sowas kann man auch auf einem AVR-Tiny laufen lassen. Erfordert aber
> etwas Hirnschmalz und Basic oder C statt VHDL.

Das erfordert wahrscheinlich nicht mehr Hirnschmalz als ich schon beim 
Erlernen von VHDL reingesteckt hab. Bei einer Implementierung im AVR 
leidet die Genauigkeit, weil man die Bits jeweils manuell hin und her 
wackeln muss (oder hat etwa irgendein Tiny 12 Timer?).

von C. A. Rotwang (Gast)


Lesenswert?

Viktor B. schrieb:
> Obwohl es im Grunde ein 5-Bit-Demultiplexer, ein
> 22- und 13 8-Bit-Zähler und ca. 32 8-bit-Register sind. Von den Outputs
> her hätte der kleinste gereicht, und der war auch der Einzige, den ich
> einigermaßen löten konnte. Hab ich mich um Größenordnungen verschätzt
> (ist auch das erste Mal, das ich so was mache)?

Du hast garnicht geschätzt, dann dann wäre es dir leicht aufgefallen das 
104 Zähler-FF und 256 Register-FF kaum in ein PLA aka CPLD passen können 
das 1 FF pro User-IO hat. Der Coolrunner-II ist kein FPGA sondern ein 
PLD.

https://www.xilinx.com/support/documentation/data_sheets/ds090.pdf S.5

Das ist eben der wesentliche Unterschied zwischen Gate-Array 
("Schachbrett" aus FF) und einem PLAD (Grosses FanIn-Netzwerk mit 
abschliessenden optionalen FF). Siehe auch CPLD

Mit Code-effizienz hat dein Problem nix zu tun, dagegen mit mangelnden 
Grundlagen-Kenntnissen. OK, die Hersteller machen es dir nicht leicht, 
da wird auch schon mal ein FPGA als CPLD bezeichnet.

von ich (Gast)


Lesenswert?

Deinen Angaben über Zähler und Register nach brauchst du >350 FlipFlops.
Der kleinste CoolRunner II hat 32, nur die ganz großen haben dann mal 
glaub ich 512. Ich denke da liegt dein Problem, entweder du sparst bei 
den Zählern&Registern oder nimmst einen FPGA, der hat mehr FlipFlops.

von Schreiber (Gast)


Lesenswert?

Viktor B. schrieb:
> Bei einer Implementierung im AVR
> leidet die Genauigkeit, weil man die Bits jeweils manuell hin und her
> wackeln muss (oder hat etwa irgendein Tiny 12 Timer?).

Man muss ja keinen Tiny 12 nehmen, ich würde mal über den Tiny2313 
nachdenken, der hat genug Pins UND einen Timer.

Davon abgesehen, bei 20MHz Taktfrequenz kann man so ein paar PWM-Signale 
auch ganz ohne Timer erzeugen.

von Michael B. (laberkopp)


Lesenswert?

Viktor B. schrieb:
> Irgendeine Idee, woran es liegen kann

Der XC2C32A hat nur 32 MacroCells, also FlipFlops, und 56 Macroterme, 
also Bitabhängigkeiten.

Und du brauchst mindestens 382 FlipFlops, und für jeden Ausgang die 
x<counter Verknüpfung mit 8 bit, was mehr asl 56 Macroterme sein werden.

CPLD sind einfach nicht leistungsfähig genug.

von C. A. Rotwang (Gast)


Lesenswert?

Schreiber schrieb:
> Viktor B. schrieb:
>> Nun wollte ich das natürlich auf
>> einem CPLD laufen lassen
>
> Sowas kann man auch auf einem AVR-Tiny laufen lassen.

Oder schau doch mal nach einem "dummen" Peripherie-IC mit extra viel 
PWM-Kanälen:
http://www.linear.com/product/LT8500
https://www.sparkfun.com/products/retired/10136 (!abgekündigt!)
Beitrag "16 PWM Signale I2C"


Es muss nicht immer was programmierbares sein.

von Carl D. (jcw2)


Lesenswert?

Was ist "servotaugliches PWM"?
Falls das bedeutet auf 12 Leitungen alle 20ms einen 1..2ms Puls zu 
erzeugen, dann wird der Tiny quenglig wegen Langeweile.

: Bearbeitet durch User
von Viktor B. (coldlogic)


Lesenswert?

FÜr den Projekt hab ich generell versucht, FPGAs durch CPLDs zu 
ersetzen. Die FPGAs sind einfach ein Overkill. Das Mapping an dem 
kleinsten Spartan 6 z.B. hat ergeben, das nur 30% der Ressourcen genutzt 
werden. Zugegeben, wenn ich an meinem Atmega 328 rumspiele, erreiche ich 
sogar 0% (wenn es mal wieder hängen bleibt), ist aber trotzdem nicht 
weniger sinnvoll.

P.S. Ich hab mal eine Idee zur Optimisation. Die werde ich später noch 
ausprobieren, soll aber den Bedarf an FF's drastisch senken

von C. A. Rotwang (Gast)


Lesenswert?

Viktor B. schrieb:
> FÜr den Projekt hab ich generell versucht, FPGAs durch CPLDs zu
> ersetzen. Die FPGAs sind einfach ein Overkill. Das Mapping an dem
> kleinsten Spartan 6 z.B. hat ergeben, das nur 30% der Ressourcen genutzt
> werden.

Bei Lattice sollte es noch kleineres an FPGA geben (die evtl. irriger 
weise als CPLD bezeichent werden). Und 30% sind kein Overkill sondern 
genug Reserven für timing-Probleme und zukünftige Features. Overkill ist 
da eher das externe Konfig-speicher und die mehrfachen Supply-Voltages.

Altera drückt z.Z mit dem Flex10 einen kleinen und schaltungstechnisch 
einfachen (single-supply Option) FPGA auf den Markt:
http://www.elektroniknet.de/markt-technik/halbleiter/cpld-fpgas-fuer-1-50-dollar-in-hohen-volumina-113411.html

Und wenn die PWM das PLD nicht füllt kannst du fa auch deinen SPI-Master 
mit reinscheiben.

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


Lesenswert?

Viktor B. schrieb:
> Die FPGAs sind einfach ein Overkill.
Sieh dir Lattice MachXO2 an. Das sind exakt die Bausteine, die du als 
"FPGA-Ersatz" suchst....

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.