Omdat veel mensen graag wel eens met CPLDs of FPGAs willen spelen leek het me wel interessant om te kijken of je een goedkope Altera programmer kon maken zonder lastige componenten. Het is allemaal nog experimenteel maar het lijkt te werken.

De byteblaster van Altera zelf, de programmer die vrij beschikbaar is en op de parallele poort werkt is natuurlijk wel leuk, maar de parallele poort is een oude techniek en steeds meer aan het verdwijnen.

Zelf heb ik een USB Blaster kloon van terasic, die prima werkt. Deze wordt direct in Quartus herkend. Maar toch leek het me handig om nog iets eenvoudigers te hebben, omdat zelfs deze programmers al gauw $50 kosten.

FPGA's worden steeds opnieuw geprogrammeerd volgens een bekend en vrij eenvoudig protocol. Hiervoor kun je zelf ook iets maken, bijvoorbeeld een AVR die de code uit een flashgeheugen leest en dat naar de FPGA schrijft.

Zelf heb ik alleen nog wat met de MAX II serie gewerkt, wat een CPLD is dus met intern flashgeheugen. Deze heeft dus geen configuratieprotocol. De MAX II serie is wel erg mooi en goedkoop om mee te beginnen, dus daar heb ik deze programmer ook een beetje voor gemaakt. Ook zou je zoiets makkelijk op een printje samen met een MAX II kunnen zetten zodat je een prototype module hebt met ingebouwde programmer.

Op de site van Altera staan wat documenten over ISP programmen van MAX-II devices via JAM/STAPL. Dat laatste is een soort taaltje (ASCII of gecompileerd naar een soort bytecode) wat een programma beschrijft. Dit programma bestuurt de JTAG pinnen en programmeert zo het device. Dit kan vanuit de PC via een byteblaster of andere interface, maar ook via een embedded processor die de CPLD flasht.

Het mooie is nu dat Altera de code van de player (interpreter) van deze JAM/STAPL taal online heeft staan, in Windows, DOS en embedded versies. De Windows code werkt standaard via de parallele poort maar je bent vrij dit aan te passen, de code is erg portable geschreven. Quartus kan een JAM/STAPL file als output genereren, die je dan met dit tooltje kunt interpreteren en zo een device kunt programmeren. Het werkt dus niet direct in Quartus maar het gaat allemaal vrij makkelijk.,

Om de programmer nou zo simpel mogelijk te houden heb ik alleen een FTDI chipje (FT232RL, wel bekend) gebruikt.
http://www.madwizard.org/extern/co/jtag/jtagschema.png

Deze chip heeft ook een bitbang mode, waarmee pinnen op de chip direct via software aan en uit gezet kunnen worden. Normaal gesproken is dit niet zo'n succes over USB omdat het USB protocol in packets werkt. Gelukkig heeft het IC een interne buffer die het automatisch op een gegeven kloksnelheid op de pinnen kan doorvoeren (sychronous bit bang mode). Zo kun je in 1 pakket 64 bytes (64x 8 pinnen) doorgeven aan het IC, wat het allemaal een stuk sneller maakt. Het IC sampled ook de pinwaarden elke keer dat ze geschreven worden, zodat je in de read buffer inputs kunt uitlezen. Je hebt natuurlijk wel een probleem als je na 1 byte al direct de inputs moet weten om verder te kunnen, dan heb je alsnog een USB packet per byte nodig. Gelukkig komt dit maar weinig voor, er is maar 1 plek in de code waar inputs (TDO pin trouwens) ook gelezen moeten worden, en die zit in een loop van meestal 16 bits achter elkaar. Zodoende kan dit wel wat geoptimaliseerd worden.

Alles in elkaar gesoldeerd krijg je dan zoiets:
http://www.madwizard.org/extern/co/jtag/jtagftdi.jpg

Na wat klooien met de software is het me gelukt een EPM240 MAXII te programmeren. De hele procedure (erase, program, verify) duurde ongeveer 30 seconden, maar m'n USB blaster kloon doet er in Quartus ook al 24 seconden over. Ik weet niet wat de byteblaster (parallele) of officiele USB blaser programmers voor tijden nodig hebben.

Je zou deze programmer volgens mij ook voor FPGAs en config roms kunnen gebruiken, al kan ik dat helaas nog niet testen (heb nu alleen die EPM240 in een schakeling zitten). Ook weet ik niet of het erg traag wordt met grotere configuraties, het blijft natuurlijk bitbangen over USB. Misschien dat iemand meer kan vertellen over de gemiddelde tijd die het kost om devices te programmeren?

De software zal ik nog beschikbaar stellen, nu is het nog een quick and dirty testversie.

ze doen iets gelijkaardig in die altera programmers zelf
alleen om de latency te overkomen bij usb gaan ze bytes sturen en laten het 'geschuif' over aan een kleine cpld ( zoals in dei terasic ook gedaan wordt trouwens )

het enige probleem is dat geen enkele van die 'klonen' (zoals terasic)in AS mode kan werken. en das heel vervelend , je kan immers geen serial config memories programmeren voor fpga's terwijl ze aan de fpga zelf hangen...

Op 1 januari 2007 20:11:02 schreef free_electron:
ze doen iets gelijkaardig in die altera programmers zelf
alleen om de latency te overkomen bij usb gaan ze bytes sturen en laten het 'geschuif' over aan een kleine cpld ( zoals in dei terasic ook gedaan wordt trouwens )

Dat zou inderdaad schelen, nu stuur je 1 bit als een aantal bytes (bit veranderen en klok pulsen). Maarja dan moet je weer een CPLD kunnen programmeren en dat is nou net het probleem :) Ook heeft die JAM/STAPL code groepen van 16 bits wat dan zelfs met optimale doorvoer (geschuif in hardware dus) alsnog neer zou komen op packets van een paar bytes. Dit lijkt trouwens alleen nodig (in grote aantallen) voor de verify, programmeren is grotendeels one way verkeer.

het enige probleem is dat geen enkele van die 'klonen' (zoals terasic)in AS mode kan werken. en das heel vervelend , je kan immers geen serial config memories programmeren voor fpga's terwijl ze aan de fpga zelf hangen...

Volgens terasic kan hun programmer ook in AS mode werken.

Update!
Goed nieuws op het bitbang-programmer front, ik heb al wat dignen erover gepost in het
FPGA waarom zoweinig nieuwe gebruikers? topic, maar om dat niet verder te vervuilen zal ik even in dit oorspronkelijke topic verder gaan.

Een paar dagen terug zag ik dat Quartus SVF (serial vector format) als output kan genereren (formaat hier). Dit is een tekstbestandje met JTAG instrcuties, heel eenvoudig en dus veel beter te optimaliseren dan mijn oorspronkelijke idee met JAM/STAPL omdat je daar gebonden bent aan het algoritme (en buffering) dat JAM/STAPL gebruikt.

Ik heb wat testjes gedaan allemaal met dezelfde hardware als hierboven, en een redelijk goede buffering gevonden. De snelheidsverhoging is enorm, hij is nu zelfs een factor 5 sneller dan m'n USB blaster kloon!

Ik heb een SVF gegenereerd voor een EPM240 (kleinste MAX II) en daarmee getest. Ook al worden niet alle cellen gebruikt, de SVF is even groot ongeacht het gebruik van het device (hele geheugen wordt steeds geprogrammeerd). Dus dit is ook echt de maximumtijd.

Resultaat:

Checking ID: 0.031 s
Erase:       1.500 s
Program:     2.563 s
Verify:      0.907 s
Finish:      0.046 s

Total:       5.047 s

Zoals ik eerder al zei, m'n USB blaster doet over hetzelfde ongeveer 25 seconden. Alles is met behoud van de juiste delays, kleine delays (elke 16 program bits is er een delay van 100uS) worden als loze bytes gebitbanged omdat dan de datastroom niet onderbroken hoeft te worden. Effectief geeft dit zo'n 24kbit/s wat via JTAG naar binnen geschoven wordt. Dat klinkt traag maar de 'firmware' is maar iets van 60kbit.

Tot nu toe heb ik de SVF even met het betere edit-werk omgezet naar een berg C++ code maar het moet vrij eenvoudig zijn er een programmer voor te schrijven.

Net nog even gekeken hoe zo'n SVF er voor een cyclone 2 uit ziet, daar zijn geen delays (wel logisch omdat het ram is en geen flash) en worden alle bits er in een keer in gegooid ipv groepjes van 16. Dat kan dus ook makkelijk efficient op deze manier gedaan worden.

Dan zou het ook mooi zijn er nog configuration devices mee te programmeren in AS mode (EPCS1 devices etc.). AS interface is bekend dus daar moet wel iets zelf voor te bouwen zijn.

Als ik het goed begrijp zit hier gewoon een POF file plat in het geheugen?

juist.
de sfv beschrijft eigenlijk exact welke pin trnasities er moetne gebeuren.
al het protocol en alle dingen zijn dus al uitgewerkt het eneige wat je moet doen is die sfv interpreteren en naar buiten sturen.