Hallo,
ich würde mich gerne etwas mit CPLDs auseinander setzen. Ich habe vor,
mir einen mehrstufigen Timer für kurze Pulsfolgen zu bauen.
Hierfür würde ich im CPLD mehrere Counter (16 oder 24 Bit) aufbauen
wollen und vom CLK oder über einen Vorteiler ansteuern lassen.
Um aber zu einem gewünschten Zeitpunkt einen Impuls auszulösen, benötige
ich einen Vergleichswert, den ich gerne extern vorgeben würde, z.B.
durch einen Mikrocontroller. Ich möchte nicht für jede Konfiguration den
CPLD neu programmieren müssen, sondern das soll im Betrieb vornehmbar
sein. Sonst würde der CPLD nicht lange leben...
Habt ihr eventuell Erfahrungen oder kennt Appnotes, wo so etwas
hinsichtlich Hardware und Software beschrieben wird? Derzeit würde ich
für jeden Counter ein Vergleichsregister einplanen wollen, das ich vor
dem Auslösen der Counter mit dem Mikrocontroller beschreibe. Aber wie
könnte eine solche Schnittstelle am sinnvollsten aussehen? Es müssen 16
oder 24Bit-Worte an mehrere Register übergeben werden. Und das möglichst
einfach. Macht man das "altmodisch" über Daten- und Adressleitungen? Das
wären einige.
Ich würde mich freuen, wenn ihr mir da einen Standardweg aufzeigen
könntet. Ich bin da sicherlich nicht der Erste, der das versucht.
Mit Gruß
Schmidt
Schmidt schrieb:> Macht man das "altmodisch" über Daten- und Adressleitungen? Das> wären einige.
Man definiert sich ein Registermodell ähnlich wie bei einem normalen
Peripheriebaustein, welches in dem CPLD/FPGA umgesetzt wird. Die Breite
der Busanbindung richtet sich dann nach der Zahl der hierfür
reservierbaren Pins und muss nicht einmal die gleiche Wortbreite wie der
Microcontroller oder die im CPLD realisierten Zähler haben. Statt eines
separaten Adressbusses kann man auch die Daten und Adressen multiplexen.
Ich habe erst kürzlich solch eine Anbindung mit D[5..0], /RD, /WR, ALE
realisiert.
Auch der umgekehrte Weg ist ggf. möglich. Sobald man höhere
Übertragungsraten zwischen CPLD/FPGA und Microcontroller/Mikroprozessor
benötigt, sollte man darüber nachdenken, den Prozessor gleich als
Softcore in ein FPGA zu packen. Ich bin derzeit sogar mit einem
derartigen Projekt befasstt, wobei hierbei u.a. ausschlaggebend war,
dass man mittlerweile solche Softcore-Projekte sehr komfortabel in
Xilinx Vivado realisieren kann und auch ein Abgleich der Registermodelle
in der programmierbaren Logik und in der Software erfolgt.
Schmidt schrieb:> Hierfür würde ich im CPLD mehrere Counter (16 oder 24 Bit) aufbauen> wollen
Da würde ich dir den Tipp geben, das vorher in VHDL zu beschreiben und
synthetisieren zu lassen, damit du weißt, welcher CPLD reicht.
Ich hatte für eine 16*8 Dot-Matrix-Anzeige das mal gemacht. Hätte einen
Speicher von 32Bits * 8 gebraucht und selbst das hat in den größten CPLD
der XC95xx-Reihe nicht mehr gepasst.
Ansonsten ist es relativ einfach.
Du kannst in den CPLD ein Schieberegister einbauen. An die Pins nach
außen hängst du das SPI-Interface des Mikrocontrollers, was faktisch
auch nichts anderes als ein Schieberegister ist. So bekommst du die
Daten schonmal easy rüber.
Dann könntest du noch eine weitere Leitung für z.B. Command und Data
vorsehen.
Beispiel:
C/D auf high: Das was übertragen wird ist die Adresse des Timers, den du
setzen möchtest.
C/D auf low: Das ist dann der eigentliche Wert für den Timer, den du
zuvor selektiert hast.
Wenn du nur 8Bit-weise überträgst, könntest du auf diese Art auch
Byte-weise deine 24/32Bit Register adressieren.
Aber wie gemeint, mach erstmal die Beschreibung in VHDL ... Wenn du
weißt, wieviel Resourcen das benötigt, dann das richtige Bauteil dazu
auswählen.
Schmidt schrieb:> Es müssen 16 oder 24Bit-Worte an mehrere Register übergeben werden
Dann vergiss CPLD mit ihren paar wenigen Registern am besten gleich
wieder.a
Andreas S. schrieb:> Ich habe erst kürzlich solch eine Anbindung mit D[5..0], /RD, /WR, ALE> realisiert.
Ich würde da ein SPI Interface nehmen.
Hallo,
vielen Dank für eure schnellen Antworten. Dann lag ich ja nicht ganz
falsch.
Der Weg über SPI interessiert mich, da er Leitungen und Aufwand spart.
Ist der Gedanke dann der, dass das Schieberegister gleich den
Vergleichswertregistern entspricht und ich über VHDL einfach jedem
Counter einen Bereich des Schieberegisters als Vergleichsregister
zuordne? Dann könnte ich die "Gestalt" der Register einfach über die
Bitfolge des SPI-Streams konfigurieren. Das wäre flexibel.
Ich kenne mich mit VHDL nur ganz wenig aus. Ebenso habe ich erst wenig
Erfahrung mit CPLDs. Wenn ich ein 16Bit Zähler oder ein Register
aufsetze, wieviele FFs müsste ich hierfür bei der Synthetisierung
einplanen? Je Bit nur eines? Wenn ich z.B. 5 Counter planen würde zu 16
Bit und zu jedem ein Vergleichsregister, so wären das 160 zu Speichernde
Bits.
Derzeit plane ich einen alten MaxII von Altera zu versuchen, der jedoch
nur 240 LEs aufweist. Das dürfte zu knapp werden.
Ich danke euch für eure Hilfe.
Mit Gruß
Schmidt
Ein Thema wäre noch, was passiert während das Schieberegister neu
beschrieben wird.
Solange die Bits noch nicht an der entgültigen Position sind, hast du
falsche Werte in deinen Vergleichsregistern.
Entweder hältst du die Pulsgenerierung solange an (z.B. solange die CS_N
Leitung low ist), oder du benötigst 80 weitere FF, um dem
Schieberegister ein paralleles Storage Register zu gönnen.
Guck' dir vielleicht auch mal die ECP2 FPGAs von Lattice an, da gibst du
vielleicht 2-3 EUR mehr aus als für den CPLD, hast aber in der kleinsten
Version gleich tausende von FFs...
Schmidt schrieb:> Wenn ich ein 16Bit Zähler oder ein Register aufsetze, wieviele FFs> müsste ich hierfür bei der Synthetisierung einplanen? Je Bit nur eines?> Wenn ich z.B. 5 Counter planen würde zu 16 Bit und zu jedem ein> Vergleichsregister, so wären das 160 zu Speichernde Bits.
Soweit korrekt, wenn es denn ganz ohne Vorteiler direkt mit dem
"Mastertakt" geht. Zudem kommt noch das Interface dazu, das je nach
nötiger Synchronisation (dürfen die Vergleichsregister zu beliebigen
Zeiten manipuliert werden, oder muss das im "Nulldurchgang" des Zählers
passieren?) nochmal 40-200 Flipflops braucht.
Fazit: CPLDs taugen für sowas nicht. Oder man muss gleich am Anfang
"herumtricksen". Und das ganz ohne Erfahrung, wie ein "richtiges"
HDL-Design auszusehen hat.
Joe F. schrieb:> Guck' dir vielleicht auch mal die ECP2 FPGAs von Lattice an, da gibst du> vielleicht 2-3 EUR mehr aus als für den CPLD, hast aber in der kleinsten> Version gleich tausende von FFs...
Oder die MachXO FPGAs, die von Lattice auch als Brücke vom CPLD
beworben werden:
http://www.latticesemi.com/en/Products.aspx
Hallo,
danke für die Informationen. Ja, natürlich müssen weitere Baugruppen für
die Interfaces und die Taktung berücksichtigt werden. Dann wird es
vermutlich wirklich knapp bis unmöglich.
Der Grund, warum ich auf CPLDs schaue (nach meinem Kenntnisstand):
1. Nichtflüchtiger Speicher und somit kein Konfigurations EEprom oder µC
notwendig.
2. Fixe Gatterlaufzeiten. Ich möchte einen sehr eng bestimmbaren
Zeitraum zwischen zwei Timern erreichen können, ohne Gatterlaufzeiten
berücksichtigen zu müssen.
3. Einfachere Spannungsversorgung (3,3V) -> einfacheres Layout.
4. Sehr günstige Entwicklungsboards von Altera (AliE..) und frei
verfügbare Entwicklungsumgebung (Quartus).
Ich werde mir die anderen beiden Vorschläge mal ansehen. Habt ihr da
Erfahrungen mit?
Mit Gruß und Dank
Schmidt
Noch etwas vergessen:
ihr habt offenbar mit den Lattice-Bausteinen Erfahrung. Könntet ihr mir
einen Baustein empfehlen, der:
1. mit 3,3V läuft (oder von hier abgeleitet werden kann), und 3,3V
kompatibele IOs hat? Ich würde gerne auf Pegelwandler verzichten, wenn
es geht.
2. möglichst kein BGA-Package hat, gut verfügbar und preiswert ist?
Mit Gruß
Schmidt
Lothar M. schrieb:> Zudem kommt noch das Interface dazu, das je nach> nötiger Synchronisation (dürfen die Vergleichsregister zu beliebigen> Zeiten manipuliert werden, oder muss das im "Nulldurchgang" des Zählers> passieren?) nochmal 40-200 Flipflops braucht.
Diesen Synch-Aufwand kann man ein Stück weit reduzieren, wenn man den
Zielwert für den Zähler nicht als Vergleichswert behandelt sondern als
Reload-Wert eines Abwärtszählers: dann erfolgt die Übernahme geänderter
Werte ganz von selbst nur beim Nulldurchgang. Außerdem muss man nicht
beliebige 16-Bit-Werte miteinander vergleichen (was bei der üblichen
und/oder-Logik von CPLDs hässliche Terme gibt), sondern man kann den
Zählerwert fest mit 0 vergleichen.
Im Endeffekt benötigt man dann an Macrozellen n*16 für die Zähler plus
n*16 für die Reloadwerte plus n für die Pulsausgänge plus eine Handvoll
für das SPI und den Clock. Geht aber nur, wenn es sich um eine reine
Timer-Anwendung handelt (also ein Nadelpuls mit progammierbarer
Wiederholrate). Wenn es stattdessen PWM-Ausgänge werden sollten, wäre
der zusätzliche Aufwand an Makrozellen nicht zu vermeiden.
Schmidt schrieb:> Dann wird es> vermutlich wirklich knapp bis unmöglich.
Das ist das schöne an der Logikentwicklung: du kannst dein Design schon
mal (mit kostenlosen Werkzeugen) entwerfen und synthetisieren lassen,
ohne dass du schon einen konkreten Baustein kaufst. Dann siehst du
direkt, welcher Baustein ausreichen würde und welcher nicht und kannst
auch im Nachhinein den Baustein ändern.
Ungünstig wäre nur, wenn du den ersten Entwurf mit der Software eines
Herstellers machen würdest, und dann für den endgültigen Aufbau auf
einen anderen Hersteller umschwenken müsstest.
Schmidt schrieb:> 1. Nichtflüchtiger Speicher und somit kein Konfigurations EEprom oder µC> notwendig.
MachXO -> eingebaut
> 2. Fixe Gatterlaufzeiten. Ich möchte einen sehr eng bestimmbaren> Zeitraum zwischen zwei Timern erreichen können, ohne Gatterlaufzeiten> berücksichtigen zu müssen.
Über welche Frequenzen reden wir denn?
> 3. Einfachere Spannungsversorgung (3,3V) -> einfacheres Layout.
-> MachXO. 3V3 - fertig.
Hallo,
@Achim
Ja, da stimme ich dir zu. Ich habe mich bislang ein wenig mit Quartus
auseinander gesetzt und würde das Projekt auch gerne hiermit erarbeiten.
Die Lernkurve liegt also noch vor mir. Daher frage ich lieber
rechtzeitig nach Alternativen. Es besteht ein Hardwareentwurf, aber da
ich darum wusste, habe ich mich noch nicht auf einen Baustein
festgelegt.
Alternativ könnte ich den Entwurf auch mit der Cyclon-Serie versuchen.
Dann würde ich mit dem Tool weiter arbeiten können. Aber die Cyclons mit
Beinchen benötigen halt eine externe Konfiguration, was die Sache wieder
kompliziert macht. Aber ja, eine Abschätzung des Designs wäre möglich.
Der Vorschlag mit dem Abwärtszähler ist super. Vielen Dank. Da müsste
ich nur sehen, wie ich den Sollwert beim Zählerreset übergebe.
Entspricht bei den FPGAs ein LUT einer Macrozelle? Liegen die FFs als
Hardwarekomponente vor oder werden die auch aus LUTs synthetisiert?
@alle
Die MachX0 scheinen deutlich günstiger zu sein für meinen
Einsatzbereich. Angestrebte Ausgangsfrequenz derzeit 50MHz.
Hat einer einen Vorschlag für ein konkretes Bauteil in z.B. TQFP?
Mit Gruß und Dank
Schmidt
Schmidt schrieb:> Der Vorschlag mit dem Abwärtszähler ist super. Vielen Dank. Da müsste> ich nur sehen, wie ich den Sollwert beim Zählerreset übergebe.
Na ja, irgendwie in der Art:
if zaehler=x"0000" then
zaehler<=zaehler_reload;
Puls <= '1';
else
zaehler<=zaehler - 1;
Puls <= '0';
end if;
Und zaehler_reload ist halt Teil des Schieberegisters, das SPI-mäßig
gefüllt wird.
Schmidt schrieb:> Hat einer einen Vorschlag für ein konkretes Bauteil in z.B. TQFP?
Nimm einen MachXO2 lcmxo2-640hc-4tg100c mit 640 Logikzellen. Ist im
TQFP 100 und mit OnChip Regler für die Corespannung. Zusammen mit dem
eingebauten Oszillator die Faust aufs Auge für den Anwendungsfall
hier...
> Entspricht bei den FPGAs ein LUT einer Macrozelle? Liegen die FFs als> Hardwarekomponente vor oder werden die auch aus LUTs synthetisiert?
Blätter mal durch ein Datenblatt eines MachXO. Du wirst sehen, dass 1
Flipflop hinter einer 4er Lookup Tabelle sitzt. Diese LUT kann also nur
4 Eingänge kombinatorisch verknüpfen. Ein kompletter Produktterm eines
CPLDs hat ein Vielfaches an Eingängen. Aber beim FPGA macht es einfach
die Menge und die einfache Verdrahtung.
Hallo Lothar,
vielen Dank für den Hinweis. Ich habe gleich mal nachgesehen und der
fällt preislich ja wirklich hervorragend aus. Ein größerer MAXII oder
MAXV kostet ein Vielfaches.
Ich habe festgestellt, dass Lattice offenbar drei IDEs anbieten. Warum
denn das? Anscheinend ist aber Lattice Diamond das Programm der Wahl.
Kannst du das bestätigen?
Wie sieht das mit Programmern aus? Ich habe einige Programmer gefunden,
die anscheinend wie die USBBlaster vom Altera aufgebaut sind. Fallen aus
Fernost jedoch etwas teuerer aus. Muss ich da auf etwas spezielles
achten oder sind die über alle Familienmitglieder von Latticde
kompatibel?
Leider konnte ich keine günstigen Evalboards oder einfache
Breakoutboards mit rudimentärer Peripherie aus gleicher Quelle finden.
Hast du hier evtl. eine Bezugsquelle oder könntest einen Tipp
aussprechen?
Bei Altera wüsste ich um die Komponenten. Mit Lattice hatte ich noch nie
Kontakt.
Vielen Dank!
Mit Gruß
P.S. so kommt man von einer spezifischen Frage auf einen kompletten
Systemumstieg... :)
Schmidt
Schmidt schrieb:> Ich habe festgestellt, dass Lattice offenbar drei IDEs anbieten. Warum> denn das?
Alt, Neu und Anders...
Bei Xilinx gibt's das zur Zeit auch mit ISE und Vivado.
> Anscheinend ist aber Lattice Diamond das Programm der Wahl.> Kannst du das bestätigen?
Ja.
> habe einige Programmer gefunden, die anscheinend wie die USBBlaster> vom Altera aufgebaut sind. Fallen aus Fernost jedoch etwas teuerer aus
Mit ein wenig Recherche bist du für knapp 20 Euronen im Rennen...
Ich nehme zum Drauflosbasteln das hier, da ist der Programmer auch
schon drauf :
http://www.latticesemi.com/Products/DevelopmentBoardsAndKits/MachXO2BreakoutBoard.aspx> so kommt man von einer spezifischen Frage auf einen kompletten> Systemumstieg... :)
Was ich gelernt habe: kuschele dich nicht zu sehr an 1 Toolchain oder an
1 Bauteilfamilie oder an 1 Hersteller.
Oder wie der Volksmund sagt: auch andere Mütter haben schöne Töchter...
?
Schmidt schrieb:> 2. Fixe Gatterlaufzeiten. Ich möchte einen sehr eng bestimmbaren> Zeitraum zwischen zwei Timern erreichen können, ohne Gatterlaufzeiten> berücksichtigen zu müssen.
Wenn ich dazu etwas anmerken darf:
Du tust Dir einen großen Gefallen, wenn Du alle Schaltvorgänge synchron
zu einem einzigen Takt machst.
Das Synthese-Tool kümmert sich dann darum, dass die Gatterlaufzeiten
eingehalten werden (sofern Du Deine Timings korrekt definiert hast).
Hallo,
vielen Dank für den Hinweis.
Leider bin ich die letzten Tagen etwas eingebunden, daher habe ich noch
nicht viel Zeit für das Projekt investieren können. Aber ich habe mir
schon ein Evalboard für die Lattice-Chips besorgt.
Ich bin bislang sowieso davon ausgegangen, dass es einen zentralen Clk
gibt, auf den ich alle Unterfunktionen synchronisiere.
Ich halte euch auf dem Laufenden.
Mit Gruß und Dank
Schmidt
Hallo,
ich wollte mich für die Tipps und Hinweise für meinen FPGA/CPLD-Einstieg
bedanken.
Mittlerweile läuft die SPI-Schnittstelle bislang fehlerfrei und auch die
Zähler tun was sie sollen. Ich habe viel daran gelernt.
Mit Gruß und Dank
Schmidt