Wat leren we vandaag ? Logica maken in CPLD/FPGA met SystemVerilog

Op vrijdag 14 november 2025 21:10:38 schreef free_electron:
- knight rider

Dat is een leuke.
Heb ik ooit ontworpen voor en geprogrammeerd in een GAL16V8.

Tijd voor ene volgend projectje

Een tellertje hebben we al gebouwd, een schuivertje dan maar ....



module schuiver
(
   input logic CLK, RESET, LOAD, ENABLE, LEFTright,
   input logic [7:0] ingang,
   input logic shift_in,     // hier komt onze data ingeschoven
   output reg [7:0] uitgang

);

always_reg  @(posedge CLK) begin
    if (!ENABLE) uitgang<=uitgang
end
endmodule

Volg even mee met het "denkproces":

Bovenstaande is onze basisconstructie. Dit gaat haast altijd terugkomen, niet noodzakelijk met alle signalen maar in grote trekken de volgorde van definities en opzet van de logica.

We hebben controlesignalen, in- en uitgangen gedefinieerd, alsook de module naam (schuiver)
Alles is synchroon met de clock (always @(posedge clk))
En als niet ge-enabled is kopieren we gewoonweg de bestaande uitgang terug.

Wat willen doen ? Even nadenken.
Het LEFTright signaal schuift Links (1) of rechts (0) ( ik hanteer UPPERCASE voor actief hoog en lowercase voor actief laag in signaalnamen die een functie schakelen. )
We willen de schuiver ook op nul kunnen zetten door middel van RESET
En we willen kunnen parrallel laden door middel van LOAD.
De binnenkomende bit komt op data_in.

Welke volgorde willen we hanteren ?
Reset heeft natuurlijk hoogste prioriteit.
Enable heeft tweede prioriteit.
Parallel laden derde
en de links/rechts laagste functie.

Even vertalen in pseudo-engels:


if (reset) uitgang <=0
if (!enable) uitgang <=uitgang 
if(load)  (uitgang  <=ingang)
if(leftright) uitgang << else uitgang >>

Maar .. we vergeten dat de hoogste prioriteit in verilog onderaan komt. Dus die hap moet ondersteboven komen.

Hoe schuiven we in verilog ?
-----------------------------------------
Er zijn schuif operatoren.

<< en >> schuiven bestaande data maar kunnen niets toevoegen. Dit werkt op unsigned ( deze schuiver houdt geen rekening met het hoogste bit.
<<< en >>> schuiven signed data.

Bits die "verdwijnen" (links of rechts) worden ingevuld met een logische nul.
Je geeft gewoon op hoe ver je wilt schuiven


x <= x <<3  // schuif drie plaatsen naar links

Das leuk maar hoe krijgen we er nu nieuwe data in ?

We weten reeds dat we met stukjes van een vector (zo een [y:x] ding) kunnen werken.

Voor schuiven naar links kunnen we dus in princiepe het volgende doen:


uitgang[0] <=data_in  // haal nieuw bit op
uitgang[7:1] <=uitgang[6:0]   // gooi de laagste 7 bit op de hoogste 7 bit.

Omdat beide regels terzelfdertijd uitgevoerd worden gaat dat laagste bit niet verloren. Maar dit zaait verwarring. Dit is als een wiskundige formule zonder haakjes en met impliciete operaties. 3 x + 5. Wie komt er eerst ? PEMDAS .. parenthesis , exponent, multiply divide add subtract). En die "operand" tussen 3 en x is vermenigvuldigen, maar die schrijven we niet. Allemaal verwarrend en een mogelijke bron van "fauten". Een moment van onoplettendheid en je bent er aan voor de moeite. Doen we dus niet !

We kunnen concatenaties maken van vectoren en bits. (iemand die weet wat een mooi nederlands woord is voor concatenate ? groeperen ? aaneenschakeling ? samenvoeging ? we houden het op samenvoeging)

De {} symbooltjes laten ons toe om dat te doen. Dit maakt een nieuwe vector aan die bestaat uit een samenvoeging, van links naar rechts, van de opgegeven signalen of vectoren (of deelvectoren)

Voor links schuiven kunnen we dus een samenvoeging maken van de 7 bits en data_in


uitgang <= {uitgang[6:0],data_in}

Om rechts te schuiven draaien we de orde gewoon om, en nemen we de hoogste bits:


uitgang <= {data_in,uitgang[7:1]}

Je kan die schuif operator (<< en >>) dus eigenlijk herschrijven als


uitgang <= {uitgang[6:0],1'b0}   // left

of


uitgang <= {1'b0,uitgang[7:1]}  // right

De signalen in een samenvoegsel hoeven niet in- en uitgangen te zijn, maar kunnen nummers bevatten. Ik kan daar dus netjes een 1-bit nul (1'b0) in stoppen. Specifieer dan wel altijd hoeveel bits je daar wilt ! anders krijg je een 32 bit waarde.


// dit is onze basisopdracht : schuiven !
if (LEFTright) uitgang[7:0] <= {uitgang[6:0],data_in};
else uitgang[7:0] <= {data_in,uitgang[7:1];

// behalve als we moeten laden, dan doen we dit. (dit heeft hogere prioriteit. Denk aan die multiplexer-boom. Deze staat iets dichter bij het register.
if (LOAD)  uitgang  <= ingang;

// Behalve als we niet enabled zijn. Dan houden we de huidige waarde vast. deze staat nog dichter bij het register.)
if (!ENABLE) uitgang <= uitgang ;

// Maar, als er een reset komt speelt niets van het bovenstaande een rol. Deze staat dichtst bij het register
if (RESET) uitgang <=8'b0;

En daar is ie dan. zonder commentaar : 5 regels klare code.
Wil je een versie waar het laden ook kan als ie niet enabled is : verplaats die lijn.

Met if - then - else en begin/end bomen is dat een gepruts van jewelste. En als je vergeet een tak te definieren loop je het risico om voor rare situaties te komen staan. Jamaar, deze conditie kan in de praktijk niet optreden. Hebben we al vaker gehoord.

Scheduled logic ? heeeeeel eenvoudig ! En nooit onafgedekte takken.

Als ik iets compileer met de 5M570ZT100C5 zie ik dat pin39 en 88 ook 3V3 VCC hebben. Ik zie op je pdf dat je enkel de 2 andere pinnen als VCC 3V3 verbonden heb. Bij een 5M240ZT100 zijn die I/O pinnen zoals op je tekening. Moet er hiervoor iets aangepast worden op je tekening?

Op vrijdag 14 november 2025 20:27:32 schreef free_electron:
[...]
De (hopelijk) finale versie staat hier : https://github.com/vincent-himpe/CPLD-Board-V/blob/main/CAD/PDF/CPLD-C…

Feedback graag.

Even een blik geworpen:

  • R22 is in jouw schema 1k, in het application example staat deze als 2k2 (en in figure 7.1 als 2k)
  • Jij pakt de OSCO output voor de Altera clk, is het niet wijzer die gewoon direct vanuit X1 te pakken via een laagohmig serieweerstandje? Alhoewel dit best zal werken voldoe je zo niet aan "In this case the output of the oscillator would drive OSCI, and OSCO should be left unconnected."

Ziet er strak uit verder, PCB layout ook.

Vandaag lagen er in Rosmalen wat Cyclone II development borden voor 8 Euro.
Met schakelaartjes, displays etc.
Was wel met de Cyclone II dus al van "efkes geleden".
Deze volgens mij :

Ah crap. de 570 heeft een andere pinning ! We zitten dus vast op de 240. Pech.
Nog steeds logica zat om mee te spelen.

1k / 2k2 maakt niet zoveel uit. ik probeer het aantal verschillende weerstandwaardes te beperken. Je betaalt voor elke rol die ze op de machiene moeten zetten ... ik moet nog eens uitvlooien of de 12k in hun "basic" pakket zit. , indien ja verander ik alle 10k naar 12 k. spaart 3$ uit om een rol te plaatsen.

De oscillator in de ftdi is een straffe inverter. die kan best 4 loads aan. Dat cmos oscillatortje moet 5 ingangen sturen ( de 4 clocks op de CPLD )en de ftdi. ik gebruik de oscillator inverter in de ftdi als buffer.

de 570 past niet op dit bord. ik kan het herwerken maar dan wordt het 570 only .... in princiepe heb ik genoeg I/O op de 570. (die heeft "slechts" 74 i/o ipv 79 zoals de andere)

ik heb nodig :
48 6x8 voor user i/o
12 voor de seriele poort opde ftdi en leds (8 data +4 controle)
4 voor de twee encoders ( eigenlijk 6 maar de "push" van de encoder hang ik aan de drukknopjes. dus met 4 kan het.
8 voor drukknoppies

1 ( minstens 1 clock )
-----
73. de 570 heeft er 74 ...

hier kan ik mee spelen :
4 clock ingangen. kan gereduceerd naar 1 of 2

dev_oe en dev_clr zijn ookk als i/o te gebruiken dus die MOET ik gebruiken op een 570

hmmmm
maar dit is wel een flinke rework .... moet ik serieus over nadenken. ik wil dit ding per se zondag buiten krijgen. ik wil het zelf ook gebruiken om mijn logica voor de curvetracer te testen ....

Als ik de boel verander naar een 570 zitten we vast op die. we kunnen geen goedkopere versie maken .. Bij LCSC is het bprijsverschil tussen een 240 en 570 niet groot . Bij digikey/mouser WEL. TME heeft ze niet ...
Farnell is knettergek met zijn prijzen. Beide zijn 11+ euro ...

welke grote electroboeren zijn er nog in europa ?

ik kan later een 570 versie maken. keuzes keuzes keuzes ...

IK dacht dat het de bedoeling was om deels bestukt biJLCPCB te bestellen of gebruik je een ander. Maar dat maakt niet zoveel uit want daar hebben ze die 570 toch wel.
Het gaat mij er toch ook niet om dat het heel goedkoop moet zijn. En ik geloof je dat 240 ook groot genoeg is maar voor 1 of 2 euro meer een 570 heeft dan wel mijn voorkeur.

Maar mij maakt het niet zoveel uit welke keuze je maakt. Er is hier gelukkig geen goed of fout. Misschien is voor goedkoop gaan dan een optie.

ik ga de 240 variant bestellen bij jlcpcb. ondertussen werk ik aan de v570. heb al ene nieuwe gihub folder aangemaakt. : https://github.com/vincent-himpe/CPLD-Board-V570

Op zaterdag 15 november 2025 16:26:18 schreef free_electron:
De oscillator in de ftdi is een straffe inverter. die kan best 4 loads aan. Dat cmos oscillatortje moet 5 ingangen sturen ( de 4 clocks op de CPLD )en de ftdi. ik gebruik de oscillator inverter in de ftdi als buffer.

Van die oscillator (Y322512MNCCZ) vind ik geen datasheet. In de datasheet van de FTDI vind ik geen drive specs van de OSCO pin. Tja...

SCHEMA UPDATE : https://github.com/vincent-himpe/CPLD-Board-V570/blob/main/CAD/PDF/CPL…

ik heb ondertussen een aantal andere zaken gecontroleerd :
- de 27R weerstand is geen BASIC, 22R wel -> switched. spaart 3$ handling kosten.
- 12K en 10K zijn beide BASIC dus dat laat ik gerust. kost niks.

Zo leer ik ook nog eens hoe je bestukte pcb zo efficiënt mogelijk kan bestellen.
Van 0 - 1 tot PCB met FPGA + componenten O-) _/-\o_

Tips voor JLCPCB (assemblage):

Verifieer dat je componentne uit het BASIC gamma kiest. jlcpcb.com/parts en klick het vinkje "basic" aan.
Die componenten zitten op hun assemblagestraat.

Als je componenten gebruikt die niet in BASIC zitten betaal je kosten om de rol te monteren. Ze moeten die rol laten komen, ze laden , er terug af halen en ze terug "sealen"

Niet alle condenstoren / weerstanden zitten in BASIC. je moet soms waardes aanpassen.

Als je componenten gebruikt die niet in BASIC zitten betaal je kosten om de rol te monteren.

Dan lijkt mij het logisch dan ook zoveel mogelijk waardes aan te passen dat ze dan of in basic of in die extra reel zitten.

OK, de routing aanpassen viel mee. nog wat 'elbow grease' en we hebben de V570 layout.

Ik zag dat de flash van de 5M570ZT100C5 maar 1000 write cycles aankan. Met wat hobbyen kun je best over die limiet gaan. Even wat debuggen en je bent zo heel wat versies verder?

Die chip is trouwens best duur.

1000 cycles is al heel wat. Bij JLCPCB kost ie iets onder de 7$ .. dat is wat ? 6 euro ?
en die 1000 cycles is wat ze garanderen. in de praktijk gaat dat wel wat langer mee.

[Bericht gewijzigd door free_electron op (33%)]

1000 cycles. Als je dan gemiddeld 10x per dag hem programmeert en je dat niet elke dag doet gaat het 1 jaar mee.

Bij arduino ben ik bv heel vaak de code aan het aanpassen om alle info op het display goed te krijgen, maar voor het eigenlijke programma zijn er veel minder veranderingen. Dus als je het slim doet duurt het dan best lang voor je over de 1000 zit.

Maar denk ik voor de rest wel een goede tip begin bij een goedkoop bordje en maak daar de meeste fouten voordat je een duurdere neemt zodat je niet te snel door die 1000 cycles van je dure bordje zit.

Maar ik zat net even te zoeken naar het verschil tussen een clpd en een FPGA.
Voor zover ik het begrijp een clpd heeft flash en een fpga gebruikt externe flash wat tijden het booten moet worden geprogrammeerd.

Maar van de week begreep is ik dat de meeste clpd ook gewoon fpga zijn.

Niet dat ik het naadje van de kous wilt weten want als ik een fpga bordje zou kopen dan lees ik toch de datasheet. Maar ik ben wel een beetje nieuwsgierig wat nu tegenwoordig nog de verschillen zijn.

[Bericht gewijzigd door benleentje op (49%)]

voorlopige release pack : https://github.com/vincent-himpe/CPLD-Board-V570/blob/main/CAD/PDF/CPL…

Verschil cpld en fpga heb ik eerder in dit topic al uitgelegd : de granulariteit van de blokken.
FPGA is veel fijner met veeeel meer routing.

Er zijn tegenwoordig ook FPGA met ingebouwde flash.

1000 flash cycles is relatief weinig vergeleken bij de 100.000 cycles voor een eeprom.
Bij FPGA's met externe boot eeprom kun je de eeprom vervangen bij einde levensduur maar dat zul je niet snel bereiken in dat geval.

....

[Bericht gewijzigd door benleentje op (97%)]

IK krijg een foutmelding 404 als ik je laatste link wil openen.

Vandaag lagen er in Rosmalen wat Cyclone II development borden voor 8 Euro.
Met schakelaartjes, displays etc.

Deze dus. Zou wel willen weten waar ik ze voor 8,- kan krijgen.
Maar stuur dan even een PM want ik wil niet teveel ruis toevoegen.

https://nl.aliexpress.com/item/1005004653041039.html?dp=Cj0KCQiA5uDIBh…

Even wat gestoeid bij JLCPCB

Board bestukt met all SMD onderdelen ( de thru hole zet je er zelf op : headers, usb en power connector en het schakelaartje ) . Komt op 148$ voor 5 stuks. Dus net geen 30$ ofte 26 Euro. komt nog shipping bij.

Er zit in die prijs 24$ aan "extended fees" om non-basic onderdelen te laden. Dat is dik 8$ per bord.
Ik kijk nog of ik dat kan vermijden. De FTDI en CPLD zijn onvermijdbaar. maar er staat nog ander snot op dat ik misschien kan vervangen.

Na wat prutswerk krijg ik hem op net geen 145 voor 5 stuks. Die ESD diode vliegt er af en ik gebruik een andere regelaar( nog steeds een 1117 maar verandert van Onsemi naar AMS). Nog even kijken of ik een andere ferrit kan vinden. Zou nog eens 3$ sparen ...

joepie, andere ferrite gevonden. nog eens 3$ er af ...

ik ga de clock oscillator ontdubbelen. de CPLD krijgt zijn eigen oscillator. die dingen kosten slechts 16 cent.
Het probleem is dat, als de CPLD nog leeg is ( uit de fabriek), en tijdens programmeren, hij zijn pinnen hoog trekt via interne weerstanden. Als dit de clock van de FTDI saboteert krijg je een kip-ei probleem... de FTDI start niet, je kan de CPLD niet laden om de pull up te disablen waardoor de FTDI niet start ....

Zoals iemand al opmerkte : FTDI specifieert de drive strength van hun OSCO pin niet ...

Voorzichtigheid is de moeder van de porseleinkast... T'zou jammer zijn.

Production pack voor JLCPCB hier : https://github.com/vincent-himpe/CPLD-Board-V570/blob/main/CAD/PDF/CPL…

De PDF toon de correcte BOM en bestukking zoals ze gedaan gaat worden. Niet geinstalleerde componenten zijn verwijderd uit de views.

Je laatste links geven bij mij error 404. Maar niet zo erg enkele van je vroegere(ook niet allemaal) gaan wel.
Ik gebruik een verilog IR remote module en een oude TV bediening. Ik heb die even gecompileerd voor zowel de CPLD240 of de CPLD570. De uitgang is een byte waarde die ik op 8 ledjes uitgeeft. Hierdoor heb ik 44 extra toetsen, dus ook een numeriek klavier.
OP de CPLD240 heb ik 165 / 240 ( 69 % ) LE's.
Op de 5M570ZT100C5 heb ik 165 / 570 ( 29 % ) LE's.
Je heb al snel meer reserve als je de 540 neemt. Op een oud MAX II boardje en een EPM2210F324C5 is dit: 165 / 2,210 ( 7 % ).

Maar ik heb ook dit boardje van Trenz:
https://www.trenz-electronic.de/en/MAX1000-IoT-Maker-Board-16kLE-32-MB…
Die heeft een MAX10: 10M16SAU169C8G chip met 16K LE's en na compilatie heb ik:
164 / 15,840 ( 1 % ) LE's.
Dit is een boardje dat je zomaar plaatst op een breadboardje en direct aansluit op de USB van de PC. Programmeren gaat via dezelfde USB. Trenz heeft hiervoor de programmer tool beschikbaar. Dat boardje heeft verder nog heel veel o.a.
- 64MBit SDRAM (16-bit data bus).
- 64Mbit Flash Memory.
- One 3-axis accelerometer.
- 8x analoog 12bit ADC.
- Arrow USB Programmer2 on-board for programming; JTAG Mode.
- Volledig schema.
- Uigebreide datasheet en gebruikers handleiding. enz...
Hier in Europa iets vinden die goede kwaliteit heeft en betaalbaar blijft vindt je niet heel veel. Trenz komt van Duitsland en binnen 3 dagen heb je zo een boardje en kost €58 met btw, zonder verzending. Je kun je een beetje afvragen of het hier bij ons nog loont om zoiets te maken en bestukken.

Als er hier iemand wil instaan om toch een reeks te laten bestukken dan wil ik nog steeds mee doen. Met het Trenz boardje zou iedereen binnen een week al de proeven kunnen volgen.
Maar je uitleg voor de FPGA zoals je begonnen was zou ik ten zeersten willen op prijs stellen en zeker meevolgen. Laat dit zeker niet schieten, het is zo waardevol. Er zijn altijd nog meer volgers dan uitvoerders!

Die website van Trenz is kloterij. ik probeer de driver van hun programmer te download en draai alleen rondjes. ze gooien je van hie rnaar daar om uiteindelijk terug bovenaan te landen. niks download. en gans hun structuur zit verborgen achter javascript in plaats van directe links. je kan zelfs geen right-click open in new window doen. wachten wachten en nog eens wachten ... kloterij !
Met dergelijke pipo's werk ik niet meer.

-edit- de dowloads staan hier : https://www.trenz-electronic.de/Downloads/?path=Trenz_Electronic/Softw…

Als je het probeert via de pagina van het product blijf je rondjes draaien. die links zijn gebroken en dat javascript gooit je terug op de top pagina.

Die driver is trouwens niet van hen maar van ARROW. En ik vermoed dat zelfs die een verkapte vorm is van een open-source project ...

[Bericht gewijzigd door free_electron op (35%)]