Forum: FPGA, VHDL & Co. Zu wenig Makrozellen: Code Optimierung


von Mr. Greenhorn (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Leute,

habe nun mit meinem ersten VHDL Projekt begonnen. Es soll ein kleiner 
Waveform-Generator werden.

Soweit klappt alles ganz gut, aber jetzt sind mir die Makrozellen des 
XC9572XL ausgegangen. Wie optimiere ich den Code denn am besten auf eine 
geringe Nutzung der Zellen hin (siehe Anlage)?

Als blutiger Anfaenger und Hobbyist wuerde mich auch interessieren, wie 
man den VHDL Code noch besser aufbauen kann, oder ob ich einige Don'ts 
drin habe. Pulser.vhd und PwmWave.vhd sind von mir, SineWave.vhd hab ich 
aus dem Netz uebernommen. Wenn jemand mit etwas Erfahrung mal drueber 
schauen wuerde, waere ich sehr dankbar.

Das mit den Makrozellen stoert mich insbesondere, weil ich in die CPLD 
eigentlich noch UART oder zumindest einen I2C-Slave (ja lacht ruhig) 
integrieren wollte, damit die Wellenformen von einer externen Quelle aus 
eingegeben werden koennen. Ausserdem sollte noch ein "arbitrary function 
generator" rein, der Wellenformen aus uebergebenen Daten erzeugt oder 
diese aus einem FIFO liest. Spaeter moechte ich an die CPLD eine 
schnelle Clock (100MHz) anschliessen, damit sehr schnelle Wellenformen 
erzeugt werden koennen. Sind CPLDs fuer solche Aufgaben ueberhaupt 
geeignet, bzw. ist eine derartige Funktionsvielfalt damit ueberhaupt 
realisierbar? Sollte ich vielleicht lieber auf Analog-Technik umsteigen?

Nichtsdestotrotz interessieren mich VHDL und GAL sehr. Vielleicht gibts 
einen besseren Vorschlag fuer ein Hobby-Einsteigerprojekt in die 
Materie.

von Klaus Falser (Gast)


Lesenswert?

> frequencyCounter < dutyCycle

Ein größer oder kleiner Vergleich ist immer aufwendig.
Ich würde das mit einem Vergleich auf Gleichheit ersetzten.
z.B.
1
 
2
if rising_edge(clk) then 
3
   count <= count + 1;
4
   if count = max_value then 
5
      count <= 0: 
6
   end if;
7
   if count = 0 then 
8
      output <= '1';
9
   elsif count = 100 then
10
      output <= '0';
11
   end if;
12
end if;

von Falk B. (falk)


Lesenswert?

@  Mr. Greenhorn (Gast)

>Das mit den Makrozellen stoert mich insbesondere, weil ich in die CPLD
>eigentlich noch UART oder zumindest einen I2C-Slave (ja lacht ruhig)
>integrieren wollte, damit die Wellenformen von einer externen Quelle aus
>eingegeben werden koennen. Ausserdem sollte noch ein "arbitrary function
>generator" rein, der Wellenformen aus uebergebenen Daten erzeugt oder
>diese aus einem FIFO liest.

Jaja, so jung und naiv waren wir alle mal ;-)
Schon mal überschlagen, wiviel FlipFlops und RAM für sowas gebraucht 
werden?
Sowas geht nur in einem FPGA.

>erzeugt werden koennen. Sind CPLDs fuer solche Aufgaben ueberhaupt
>geeignet,

Nein.

> bzw. ist eine derartige Funktionsvielfalt damit ueberhaupt
>realisierbar? Sollte ich vielleicht lieber auf Analog-Technik umsteigen?

Warum? Nimm ein FPGA, das ist nicht schwerer programmierbar als ein 
CPLD.

>Nichtsdestotrotz interessieren mich VHDL und GAL sehr.

GAL ist out.

MFG
Falk

von Mr. Greenhorn (Gast)


Lesenswert?

Danke fuer den Hinweis, ist eigentlich logisch. Werde ich mir merken und 
habe ich umgesetzt.

von Mr. Greenhorn (Gast)


Lesenswert?

Hallo Falk,

dachte GAL waere ein Oberbegriff fuer FPGAs und CPLDs. Werde mal gucken, 
obs FPGAs gibt die

1.) bastlerfreundlich sind (am besten THT Sockel)
2.) bei den ueblichen Verdaechtigen zu bekommen sind

Es war sehr aufwendig das Board fuer meine CPLD zu entwerfen, zu aetzen 
und zu loeten, es dauert bestimmt wieder 3 Wochenenden um ein Board fuer 
eine FPGA zu erstellen. Schade, dass CPLDs fuer sowas zu klein sind. Vor 
allem bei den FPGAs braucht man doch viel Peripherie, wie externe 
Speichermedien, wenn ich nicht irre. Ein Starterkit zu kaufen kommt fuer 
mich nicht in Frage, dass geht gegen die Bastler-Ehre.

Dann schwenke ich das Projekt mal um auf eine Servo-Steuerung. Ich 
denke, die Ansteuerung von einem Servo-Array sollte auch mit UART noch 
zu verwirklichen sein.

Aber was ich echt gerne wissen wuerde: Was hat denn jetzt im Code den 
groessten Einfluss auf die Anzahl der benutzten Macrozellen?

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


Lesenswert?

Mr. Greenhorn schrieb:
> dachte GAL waere ein Oberbegriff fuer FPGAs und CPLDs.
Nein. PLD ist der Oberbegriff für "Programmable Logic Devices"

> Werde mal gucken, obs FPGAs gibt die ...
Vergiss es. Kein aktuelles FPGS kann die erste Forderung erfüllen.

> Ein Starterkit zu kaufen kommt fuer
> mich nicht in Frage, dass geht gegen die Bastler-Ehre.
Schnitzt du deine Transistoren auch noch selber?
Du kannst mit einem FPGA noch hinreichend viel Basteln, und dabei lernst 
du mehr, als die 1001. Platine auf Lochraster aufzubauen...

> Aber was ich echt gerne wissen wuerde: Was hat denn jetzt im Code den
> groessten Einfluss auf die Anzahl der benutzten Macrozellen?
Die nötigen Flipflops. Dieses 9572 hat nur 72 Speicherzellen.

> Aber was ich echt gerne wissen wuerde: Was hat denn jetzt im Code den
> groessten Einfluss auf die Anzahl der benutzten Macrozellen?
Das hier:
type memory_type is array (0 to 29) of integer range -128 to 127;
Das wären (so gesehen etwas vereinfacht) schon mal 30*8 FFs = 240 
Speicherzellen...  :-o

von Thomas R. (tinman) Benutzerseite


Lesenswert?

Mr. Greenhorn schrieb:

> Werde mal gucken, obs FPGAs gibt die
>
> 1.) bastlerfreundlich sind (am besten THT Sockel)

GODIL module von OHO-Elektronik kannst du locker als "bastlerfreundige 
FPGAs" betrachten, z.b. GODIL_XC3S250E

http://shop.trenz-electronic.de/catalog/product_info.php?products_id=632

von Purzel H. (hacky)


Lesenswert?

Die heutigen Tools lassen doch eine Simulation zu. Daher sollte man 
unbedingt eine Simulation laufen lassen, bevor man sich fuer ein 
spezifisches Bauteil entscheidet, ausser man ist sicher, es auch 
hineinzukriegen. Eine erste Vorabklaerung ist moeglich, indem man eine 
Speicherstelle als eine Makrozelle setzt.

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


Lesenswert?

Ein Oschi schrieb:
> Eine erste Vorabklaerung ist moeglich, indem man eine
> Speicherstelle als eine Makrozelle setzt.
Das ist aber insbesondere bei konstanten Arrays evtl. irreführend, weil 
die ja auch hart in der Kombinatorik verdrahtet werden könn(t)en und 
dann keine Speicherzellen brauchen...

von Duke Scarring (Gast)


Lesenswert?

Mr. Greenhorn schrieb:
> Spaeter moechte ich an die CPLD eine
> schnelle Clock (100MHz) anschliessen, damit sehr schnelle Wellenformen
> erzeugt werden koennen. Sind CPLDs fuer solche Aufgaben ueberhaupt
> geeignet,

Ich hab mein CPLD-Testboard schon mit über 200 MHz laufen lassen. Das 
geht, aber für die von Dir gedachten Funktionen ist ein CPLD zu klein.

Die angepeilten 100 MHz sind auf einem aktuellen Spartan6 eher zu 
schaffen, als auf einem älteren Spartan3 bzw. Spartan3E.

Duke

von Joerg W. (joergwolfram)


Lesenswert?

Man könnte an das CPLD ein externes RAM anschließen und die Wellenformen 
generell nur von dort aus "abspielen", damit sollte es machbar sein. Bei 
100MHz wird das allerdings schon eng und das RAM sollte schon 16 Bit 
breit sein, damit man mit 12-15ns Zugriffzeit auskommt. Als 
Schnittstelle würde ich dann lieber SPI nehmen, das lässt sich 
wesentlich "Makrozellen-ärmer" realisieren.

Jörg

von Ulf (Gast)


Lesenswert?

>Ich hab mein CPLD-Testboard schon mit über 200 MHz laufen lassen

Was genau war das ?

von Falk B. (falk)


Lesenswert?

@  Ein Oschi (hacky)

>Die heutigen Tools lassen doch eine Simulation zu.

Die alten auch schon.

>Daher sollte man
>unbedingt eine Simulation laufen lassen, bevor man sich fuer ein
>spezifisches Bauteil entscheidet,

Nö, das sagt einem der Simulator keine Sekunde. Sondern der Fitter, der 
packt nämlich die Logik in die ICs.

MFG
Falk

von Joerg W. (joergwolfram)


Lesenswert?

Die Sinustabelle kann man auch über eine CASE Konstruktion machen und 
damit sozusagen hart verdrahten. Dann wird es höchstens eng mit den 
Produkttermen bzw. man bekommt vom Fitter (ungewollte) "burried nodes" 
also Zwischensignale erzeugt, die einem das Timing versauen können.
1
case clockCounter is
2
    when "00001" => sineOut <= "00001000";
3
    ....
4
    when others => sineOut <= "00000000";
5
end case;

Jörg

von Duke Scarring (Gast)


Lesenswert?

Ulf schrieb:
>>Ich hab mein CPLD-Testboard schon mit über 200 MHz laufen lassen
> Was genau war das ?

Ein Impulsformer (Trigger rein, eine einfache Signalform raus), mit 
Zählern realisiert. Auf einem XC9536XL-10C, offiziell spezifiziert mit 
bis zu 100 MHz.

Duke

von Mr. Greenhorn (Gast)


Lesenswert?

Das Problem ist, richtige FPGAs kannst du als Bastler nur als fertiges 
Modul nutzen und das ist dann ziemlich teuer (vgl. GODIL).

Ich hab mir den ganzen Tag Gedanken um Applications gemacht und bin zu 
dem Entschluss gekommen, dass eine CPLD eigentlich hauptsaechlich zur 
schnellen Bearbeitung von massiv parallelen Signalen gedacht ist.

Ich denke, als Projekt damit werde ich dann einen Logic-Analyzer in 
Angriff nehmen. Das sollte eigentlich mit einer CPLD leicht machbar 
sein. Ich packe einfach ein paar SRAM Module aufs Board die ich von der 
CPLD fuellen lasse und dann per UART oder USB auslese und am PC 
auswerte. Ich habe sowas noch nie gemacht, denke aber, dass die 
Schwierigkeit wohl beim Synchronisieren von Lese- und Schreibprozessen 
sein duerfte. Deswegen wuerde ich mehrere Puffer nuzten und ueber ein 
Signal melden wann ein Puffer ausgelesen werden kann. Mit genuegend 
Puffern sollte das dann doch klappen. Das ist jedenfalls das Konzept.

Hat jemand vielleicht noch ein paar gute Tipps dafuer?

von kyrel (Gast)


Lesenswert?

Hallo Greenhorn,

ma als Einstimmung, kannst Du Dir ma das hier anschauen:

http://www.wiesolator.de/index.php?area=Projekte&topic=CPLD-Scope

wünsche viel Spass


kyrel

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.