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.
> 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; |
@ 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
Danke fuer den Hinweis, ist eigentlich logisch. Werde ich mir merken und habe ich umgesetzt.
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?
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
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
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.
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...
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
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
@ 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
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
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
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.