Forum: FPGA, VHDL & Co. CPLD - multifunktionaler Counter


von B.Urner (Gast)


Lesenswert?

Hallo Zusammen,

ich möchte demnächst ein Projekt mit CPLD in VHDL beginnen. Habe bis 
jetzt immer nur was mit AVRs gemacht, mein Wissen zu CPLDs ist also 
relativ mau. Habe mir das Pollin Board mit XC95144XL bestellt und warte 
nur noch bis es ankommt. Ich wollte aber gern vorher schon ausloten, was 
damit alles möglich sein kann.

Als erstes Projekt hab ich mit einen multifunktionalen Counter überlegt.
Dieser soll folgende Funktionen erfüllen.
Als 24bit Binär-Counter dienen, per Clock gesteuert, mit 24 Ausgängen.
Zusätzlich möchte ich aber gern (z.b. wenn ich ein zu definierendes 
Steuerpin auf Low ziehe, oder so ähnlich) auch 24 Eingänge haben (die 
von einem AVR geschalten werden) die dann einfach auf die SELBEN 
Ausgänge geschaltet werden, wie der vom Clock gesteuerte Counter. 
Sozusagen nur als Durchlass von AVR Signalen, bei Bedarf.
Und zu guter Letzt bräuchte ich dann noch (z.b. bei weiterem Steuer-Pin) 
die Möglichkeit, per AVR einen Counter-Stand an den Eingängen 
vorzugeben, woraufhin der Counter nur bis zu diesem "eingestellten" 
Zählerstand zählt, und danach stoppt sowie eine Flanke schaltet (als 
Steuereingang für den AVR).

Meine Frage ist nun eigentlich, ob so eine Funktionalität, vorzugsweise 
mit besagtem CPLD, überhaupt realisierbar ist ;-)
Oder seht ihr hier etwas, was so definitiv nicht umsetzbar ist?
Würde natürlich bei Gelegenheit versuchen mich in die VHDL Sache 
einzuarbeiten und besagtes umzusetzen.
Wenn aber jemand irgendwelche Links zu einem gut verständlichen Einstieg 
bzw. Realisierung von ähnlichen Projekten hat, wäre ich natürlich sehr 
dankbar.

greetz

von Olaf (Gast)


Lesenswert?

Nicht das ich das Datenblatt des 95144 jetzt gelesen habe, aber
der allgemeinen Bezeichnungslage von Xilinx folgend, sind da 144
FlipFlops drin. Du brauchst aber nur 24.
Es waere vielleicht noch interessant das du die Daten seriell
reinschreiben kannst und sie dann einmalig in dein Arbeitsregister
uebernimmst. Dann wuerdest du doppelt soviele FFs brauchen.

Aber dann waer immmer noch genug Platz um da zwei I2C-Bus ICs und etwas 
Logicgemuese reinzubekommen.

Olaf

von B.Urner (Gast)


Lesenswert?

Hmm, mit I2C Schnittstelle wäre sogar noch besser, aber wollte als 
Amateur natürlich nicht zu hoch einsteigen, weiß ja nicht wie schwierig 
das zu programmieren ist.
Das heißt ich könnte eventuell eine I2C Schnittstelle einbauen die immer 
einen Wert in einem Register speichert und der Counter läuft dann jedes 
mal nur bis zu diesem Wert.
Bzw. die zweite Funktion, dass aus dem Register direkt auf die Ausgänge 
geschaltet werden kann (auf Wunsch/Signal)?
Wie viele Makrozellen werde ich dafür voraussichtlich benötigen? Würde 
das vielleicht sogar in ein XC9572XL(-PCG44) mit 72 Makrozellen und 34 
verfügbaren I/O-Pins passen? Das wäre optimal für mich...

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


Lesenswert?

> eventuell eine I2C Schnittstelle einbauen
Mach am Anfang leichter eine SPI-Schnitte rein, das ist nur ein 
Schieberegister und hat nicht das ACK-Gezerre vom I2C... :-/

> Würde das vielleicht sogar in ein XC9572XL(-PCG44)
> mit 72 Makrozellen und 34 verfügbaren I/O-Pins passen?
Mit SPI: ja.
Mit I2C: wenn du es simpel hältst, ja.

von Olaf (Gast)


Lesenswert?

> Hmm, mit I2C Schnittstelle wäre sogar noch besser, aber wollte als
> Amateur natürlich nicht zu hoch einsteigen, weiß ja nicht wie schwierig
> das zu programmieren ist.

Es sagt ja auch keiner das du das einbauen musst. Ich wollte dir nur
zeigen was machbar ist. Ich habe I2C in einem XC9536, also dem kleinsten
CPLD, eingebaut und der ist dadurch zu etwa 70% gefuellt. 
Funktionalitaet etwa wie ein PCF8574.

> Würde das vielleicht sogar in ein XC9572XL(-PCG44) mit 72 Makrozellen
> und 34 verfügbaren I/O-Pins passen? Das wäre optimal für mich...

Das sollte kein Problem sein. Im uebrigens kannst du ja schon jetzt
losprogramieren. Die ISE sagt dir schon ob es da reinpasst.

Allerdings ist I2C-Bus wohl wirklich nicht das beste fuer einen 
Anfaenger. Ich muss auch zugeben das ich da einiges im Internet gefunden 
und uebernommen habe. Es gibt da naemlich zwei kleine Probleme.

1. Du brauchst einen Pin der gleichzeitig Ein und Ausgang ist. Da muss 
man wohl ein bisschen von der reinen Verilog-Lehre abweichen und ein 
spezielles Konstruct von Xilinx waehlen.

2. Normalerweise wird immer und zurecht empfohlen syncrone Designs zu 
machen die mit einem externen Takt arbeiten. Das haette aber nicht mehr 
ins CPLD gepasst.

Dagegen ist SPI sehr einfach. Kann man ja schon daran sehen das man ein 
einfaches Schieberegister aus der 74er oder 40er Serie an SPI 
anschliessen kann. SPI ist ja auch kein Bus, sondern wildes geklapper 
mit Datenleitungen das an die Beduerfnisse von nur wenigen FFs 
enthaltenen Schieberegister angepasst ist. :-)

Olaf

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


Lesenswert?

> SPI ist ja auch kein Bus, sondern wildes geklapper mit Datenleitungen
> das an die Beduerfnisse von nur wenigen FFs enthaltenen
> Schieberegister angepasst ist. :-)
Naja, da könnte sich Widerspruch regen. Sieh dir mal die original 
Motorola-Spec an.

Dass man da auch Schieberegister anschliessen kann, dürfte eigentlich 
als Vorteil gewertet werden. Die galvanische Entkopplung ist trivial, 
der Bus ist pfeilschnell (z.B. kein Adressprotokoll-Overhead), er 
arbeitet Vollduplex (gleichzeitiges Empfangen und Senden) und zudem ist 
die Bezeichnung SPI lizenzfrei ;-)


> Da muss man ein bisschen von der reinen Verilog-Lehre abweichen ...
und in VHDL beschreiben. Aber das will B.Urner sowieso machen.
Wobei ich mir vorstellen könnte, dass man auch in Verilog ohne Tricks 
einen bidirektionalen Tristate-Puffer beschreiben kann.

von B.Urner (Gast)


Lesenswert?

> 1. Du brauchst einen Pin der gleichzeitig Ein und Ausgang ist. Da muss
> man wohl ein bisschen von der reinen Verilog-Lehre abweichen und ein
> spezielles Konstruct von Xilinx waehlen.

muss dieser Pin wirklich als Ein und Ausgang deklariert werden? 
Vielleicht hab ich mich auch nicht perfekt ausgedrückt. Würde eigentlich 
immer einen Wert vorgeben, bis zu dem gezählt werden soll. Zurücklesen 
muss ich an diesem 'Bus' (sei es nun I2C oder SPI) aber nicht. Lieber 
wäre es mir der CPLD schaltet irgendwo eine Flanke raus, wenn er den 
vorgegebenen Wert erreicht hat und aufhört mit zählen.
Das sollte doch die Komplexität diese Schieberegisters etwas verringern 
oder?

> Es sagt ja auch keiner das du das einbauen musst. Ich wollte dir nur
> zeigen was machbar ist.

nene, das is ne super Idee. Aber wie gesagt meine Erfahrungen sind 
beschränkt und fürs erste werde ich sicherlich mit dem Pollin Code zum 
Board ein bissel rumspielen und modifizieren um ein klein wenig zu 
lernen.
Habt ihr vielleicht sonst noch paar nützliche Links oder PDFs, für die 
SPI oder I2C Geschichte in VHDL? Würde mir sicherlich alles 
weiterhelfen, danke schonmal :-)

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


Lesenswert?

Du bist nicht der Erste, der sowas macht. Such mal hier im Forum nach
1
+VHDL +SPI +Slave

Oder probiers mal auf meiner HP ;-)
http://www.lothar-miller.de/s9y/categories/26-SPI-Slave

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.