Forum: FPGA, VHDL & Co. Timer in CPLD mit µC konfigurieren, wie?


von Schmidt (Gast)


Lesenswert?

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

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

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.

: Bearbeitet durch User
von Mampf F. (mampf) Benutzerseite


Lesenswert?

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.

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


Lesenswert?

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.

von Schmidt (Gast)


Lesenswert?

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

von Joe F. (easylife)


Lesenswert?

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...

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


Lesenswert?

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

: Bearbeitet durch Moderator
von Joe F. (easylife)


Lesenswert?

Lothar M. schrieb:
> Oder die MachXO FPGAs

Stimmt. Die sind auch saugünstig und haben ihr Bootflash gleich 
eingebaut, wenn ich mich richtig erinnere.

von Schmidt (Gast)


Lesenswert?

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

von Schmidt (Gast)


Lesenswert?

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

von Achim S. (Gast)


Lesenswert?

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.

von Joe F. (easylife)


Lesenswert?

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.

von Schmidt (Gast)


Lesenswert?

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

von Achim S. (Gast)


Lesenswert?

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.

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


Lesenswert?

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.

: Bearbeitet durch Moderator
von Schmidt (Gast)


Lesenswert?

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

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


Lesenswert?

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... 
?

: Bearbeitet durch Moderator
von Bronco (Gast)


Lesenswert?

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).

von Schmidt (Gast)


Lesenswert?

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

von Schmidt (Gast)


Lesenswert?

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

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.