Zu wenig Makrozellen: Code Optimierung

Gast #2071593
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.
Angehängte Dateien:
Gast #2071614
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;
#2071655
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
Gast #2071682
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?
Moderator (Firma: Titel) Persönliche Seite #2071722
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
#2072261
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.
Gast #2072350
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
#2072405
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
#2072660
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
#2072713
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
Gast #2073538
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren