rew
four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Waarom laat je de encoder-interpreter op "slechts" 1kHz lopen? Dat zal allicht werken voor de 12 stappen per omwenteling encoder die je met de hand bedient (zoals FE op z'n max-bordje wil zetten), maar ik heb gewerkt met een 10000 steps per omwenteling encoder (40000 als je iedere overgang telt). Origineel deed die 1 omwenteling per seconde. dus 100 microseconde per 4 counts. Ondertussen draait ie richting de 2 omwentelingen per seconde, dus maar slechts ongeveer 3 microseconde per kwart stap.
Die encoder-statemachine moet dus minstens 1000x sneller om dat ding bij te houden.
Iets andere soort encoder, maar werkt met precies dezelfde FPGA code, mits je niet te veel extra delers gaat toepassen..... Haal drie negens uit je code en hij zal 9 of 10 LE's minder gebruiken en nog steeds in jou testgeval werken, maar ook voor die heftige encoder....
Ja je hebt gelijk. Ik dacht laten we het kalm aan doen maar ondertussen had ik hem al op een veel hogere clock staan. Ik gebruik als test zo een eenvoudige encoder zoals op free_electron zijn boardje.
Update:
Ik heb hem nu direct aan de 50MHz clock gehangen. Vroeger werkte ik doorgaans op een 1MHz clock maar mijn encoders waren hoogstens 100 pulsen/toer. Nu nog 16LE's nodig. Direct met 50MHz clock.
Hier de verbeterde versie:
module encoder(
input CLK_50, // CLK_50MHz
input enc_p1, // pin enc_p1
input enc_p2, // pin enc_p2
output reg[7:0] leds // 8 leds output
);
reg [2:0] enc_p1_reg;
reg [2:0] enc_p2_reg;
reg enc_ena;
reg dir_sel;
always @(posedge CLK_50)
begin
enc_p1_reg[2:0] <= {enc_p1_reg[1:0], enc_p1}; // inlezen encoder
enc_p2_reg[2:0] <= {enc_p2_reg[1:0], enc_p2};
enc_ena <= enc_p1_reg[1] ^ enc_p1_reg[2] ^ enc_p2_reg[1] ^ enc_p2_reg[2];
dir_sel <= enc_p1_reg[1] ^ enc_p2_reg[2];
if(enc_ena)
begin
if (dir_sel) // richting +
leds <= leds +1;
else // richting -
leds <= leds -1;
end
end
endmodule
[Bericht gewijzigd door fotoopa op (48%)]
rew
four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
haha! een verbetering die -25 LE's kost! 
Je kan nog "commentaar" toevoegen.
ena is een signaal wat precies 1 klok hoog is als er een verandering is in 1 van de twee inputs en anders niet.
Je ZOU een paar register bitjes kunnen uitsparen door ipv de twee clocks vertraagd, de 1 klok vertraagd bitjes te pakken.
Als je de "1 klok vertraagd" inputs zou gebruiken naast de "huidige waarde" dan krijg je race condities, dat wil je niet. De garantie dat "ena" dan pre verandering precies 1x hoog is, die heb je dan niet meer.
De programmeer stijl om "dan maar een klok extra vertraagde versie" te gebruiken ipv het absolute minimum, daar kan ik achter staan. Je bespaart iets op het "denkwerk" en dat is het duurste in zo'n project.
[Bericht gewijzigd door rew op (89%)]
Kijk als we hier 20 nieuwe users CPLD/FPGA zouden hebben, kunnen we toch een zee van eenvoudige voorbeelden verwachten. Laat ze maar komen.
rew
four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Ik wil mijn KITT wel posten, maar ik vind dat als je dit soort voorbeelden kant en klaar aangeeft, dan copy-paste men het voorbeeld en leert weinig. Het zelf uitdenken van zoiets is waar je van leert. En het ledje heen-en-weer is dan een mooi zichtbare uitvoer, voor een leuk beginners-projectje.
Als beginner heb je kant en klare voorbeelden nodig. Vergeet niet dat je nog zoveel hindernissen moet doorlopen vooraleer je een klein programmatje door Quartus heen kunt downloaden naar een kant en klaar boardje. Arduino is zo veel meer gekent door de vele bestaande online voorbeelden. Als starter moet je eerst iets kunnen voelen dat werkt. Zoeken vanaf null geeft helaas bijna altijd opgeven.
benleentje
Golden Member
Op woensdag 26 november 2025 17:01:50 schreef rew:
Ik wil mijn KITT wel posten, maar ik vind dat als je dit soort voorbeelden kant en klaar aangeeft, dan copy-paste men het voorbeeld en leert weinig. Het zelf uitdenken van zoiets is waar je van leert. En het ledje heen-en-weer is dan een mooi zichtbare uitvoer, voor een leuk beginners-projectje.
In het begin heb je goede voorbeelden nodig. Zolas de hello world voor een CLPD
En je leert er veel van, hoe quartus werkt hoe je de programmer moet aansluiten hoe je het programma naar de CLPD moet downloaden.
En als je dat eenmaal gedaan hebt dan ga je kleine dingen in het programma aanpassen en kijken of die verandering ook echt doet wat je denkt dat het moet doen.
Je leert van dingen doen en ook van in het begin domweg kopiëren. Want ondanks dat je het gekopieerd heb moet je de rest van alle andere handelingen wel goed doen.
rew
four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Ik heb twee software gasten die stage lopen. Die leren niets van dingen copieren. Vragen een dag later gewoon weer of ik het voor kan doen. Kunnen niet eens een file in de editor krijgen.
nonius
set SCE to AUX.
Ik heb twee software gasten die stage lopen. Die leren niets van dingen copieren.
Verschillende mensen leren op verschillende manieren. Ik ben in elk geval een 'kopieerder'....
"There are three kinds of men. The one that learns by reading. The few who learn by observation. The rest of them have to pee on the electric fence for themselves." Will Rogers
Op donderdag 27 november 2025 05:33:09 schreef rew:
Ik heb twee software gasten die stage lopen. Die leren niets van dingen copieren. Vragen een dag later gewoon weer of ik het voor kan doen. Kunnen niet eens een file in de editor krijgen.
En hebben ze al iets zinsvol gedaan zonder kopieren?
rew
four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Het lijkt er op dat "dingen met de handen maken" ze beter ligt. Dus printjes solderen e.d. gaat goed.
Van school moet ik "minstens 1x per week" een software opdracht geven. Ik denk dat dit een compromis is tussen: "minstens 4 dagen in de week met software bezig zijn" en bedrijven (zoals ik) die roepen, "maar dan doen ze helemaal niets nuttigs".
rew
four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Het lijkt er op dat "dingen met de handen maken" ze beter ligt. Dus printjes solderen e.d. gaat goed.
Van school moet ik "minstens 1x per week" een software opdracht geven. Ik denk dat dit een compromis is tussen: "minstens 4 dagen in de week met software bezig zijn" en bedrijven (zoals ik) die roepen, "maar dan doen ze helemaal niets nuttigs".
rew
four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
(Connection refused by site, hit reload to confirm form resubmission).
Het lijkt er op dat "dingen met de handen maken" ze beter ligt. Dus printjes solderen e.d. gaat goed.
Van school moet ik "minstens 1x per week" een software opdracht geven. Ik denk dat dit een compromis is tussen: "minstens 4 dagen in de week met software bezig zijn" en bedrijven (zoals ik) die roepen, "maar dan doen ze helemaal niets nuttigs".
rew
four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Op woensdag 26 november 2025 14:55:41 schreef fotoopa:
Hier de verbeterde versie:
Wat ik me in de drie-dagen-offline nog realiseerde is dat het verstandig is om nog even (in comments) uit te leggen dat je encoders "simpel en verkeerd" en "goed" kan doen.
In het simpel-en-verkeerd geval wacht je op een opgaande flank van het ene encoder signaal en gebruik je de andere om "op" of "neer" te tellen.
Dit gaat fout als er wat debounce nodig is op 1 van je signalen: Te weten als ie rond de opgaande flank van je "flanken" signaal gaat staan jitteren, dan zie je steeds een positieve flank en tel je steeds in dezelfde richting omdat het andere signaal nog steeds diezelfde waarde heeft. Je zult in dat geval goed moeten debouncen om te zorgen dat dit zich niet voordoet.
Als je het GOED doet, tellen zowel de op als de neergaande flanken. En in het geval van op 1 overgang gaan staan jitteren, dan gaat er steeds een count bij-en-af. Dit is wat er subtiel in dit Verilog programma gebeurt. (Subtiel genoeg dat ik eerst dacht dat dit een simpel-en-verkeerd implementatie was!).
Op zondag 9 november 2025 16:41:36 schreef free_electron:
Een ander voorbeeld : maak een programme wat een 8 bit getal inleest en de bits omdraait (lsb en msb swap)
Dat is flink wat werk in een computerprogramma.In programmeerbare logica ?
uitgang[7:0] = ingang[0:7]Benodigde logica ? NIKS. Alleen wat draden !
in werkelijkheid zal de synthesizer een foutmelding geven omdat het bit order in de vector (een waarde langer dan 1 bit is een vector. er zijn geen bytes, integers , signed of andere dingen. het is 1 bit of een array van bits met een gegeven lengte en orde: een vector) anders is.
je omzeilt dit door het op te breken in stukjes voor de synthesizer:
uitgang[7] = ingang[0] uitgang[6] = ingang[1] ... uitgang[0] = ingang[7]Je kan dit ook in een lus doen.
for (i=0,i<8,i++) begin uitgang[i] = ingang[7-i] endDie lus wordt dan uitgevoerd tijdens de synthese en het resultaat is nog steeds draden !
Lussen in een synthesetaal worden gebruikt om logische functies te herhalen.
Dit geeft aan hoe krachtig een synthesetaal + programmerbare logica is in vergelijking met een programmeertaal en een processor.
Dat probleem kwam ik tegen bij het inlezen van de bitjes van een E-paper module via SPI met AVR.
Die bitjes in het byte moesten achterstevoren ingelezen worden.
Oplossingen: https://omarfrancisco.com/reversing-bits-in-a-byte/
Vooral die hocus pocus in C intrigeerde me (listing 2)
Zie ook Stackoverflow: https://stackoverflow.com/questions/2602823/in-c-c-whats-the-simplest-…
Uiteindelijk lijkt me de beste (snelst werkende) oplossing een tabelletje van 256 bytes. Tegenwoordig hebben AVR's veel grotere flash geheugens. Genoeg ruimte voor tabelletjes dus.
In assembly de instructies "rol" en "ror" gebruiken in een loop is simpel en zeer snel om bits in een byte om te draaiien en kost slechts enkele bytes en geen storage (maar daar is heden ten dage plenty van).
rew
four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Op donderdag 4 december 2025 09:54:30 schreef Spog2:
Oplossingen: https://omarfrancisco.com/reversing-bits-in-a-byte/
Vooral die hocus pocus in C intrigeerde me (listing 2)
ERG slecht leesbaar daar omdat er ergens << niet goed voor HTML ge-escaped is. (CO doet dat wel goed: ik kan gewoon << typen).
In een AVR (en de meeste andere processors) kan je meestal bij het instellen van de SPI module aangeven welke kant ie op moet shiften en dus welk bitje eerst gaat.
Die ATTINY 2313 heeft geen SPI module, maar USI: Universal Serial Interface. Ik dacht dat die ook zo'n linksaf of rechtsaf bitje had, maar kennelijk niet. Of in ieder geval in de 2313 niet.
@Bobosje, dat kan inderdaad. Dan gebruik je het carry bitje als extra storage tussen de twee shifts. Heb je wel twee registers nodig.
int reverse (int a)
{
int b=0;
for (int i=0;i<8;i++) {
b <<= 1;
b |= a & 1;
a >>= 1;
}
return b;
}wordt door gcc voor AMD64 gecompileerd naar:
movl $8, %edx
xorl %eax, %eax
.p2align 4,,10
.p2align 3
.L2:
movl %edi, %ecx
addl %eax, %eax
sarl %edi
andl $1, %ecx
orl %ecx, %eax
subl $1, %edx
jne .L2
ret
6 instructies binnen de loop.
ARM en AVR zijn vergelijkbaar. (op AVR moest ik daarvoor de declaratie naar 8bits char veranderen).
Het kan dus met ongeveer 3 instructies binnen de loop. (rol, ror, dec).
Op donderdag 4 december 2025 14:39:27 schreef rew:
[...]
In een AVR (en de meeste andere processors) kan je meestal bij het instellen van de SPI module aangeven welke kant ie op moet shiften en dus welk bitje eerst gaat.
Ik liep er tegenaan bij deze 200x200 E-paper van Waveshare: https://www.waveshare.com/product/displays/e-paper/epaper-3/1.54inch-e…
Ik wou de "9 bit SPI" (zie page 7 Datasheet )gebruiken omdat die met slechts 3 draden toe kan.
Dat is geen echte SPI, maar moest (meen ik te herinneren) via serial USART. De Commandrichting en Leesrichting gebruiken een tegengesteld formaat LSB-MSB / MSB-LSB. Dat was niet snel om te schakelen naar mijn idee, de snelste routine met de minste draden leidde tot het byte om te keren via tabelletje.
Ik gebruik Atmega 1284P
Vandaag mijn nieuw Cyclone10LP boardje aangesloten. Het programmeren verliep eerst niet zo vlot. Dus eerst nog even de laatste releases bijgenomen. Ze hebben in de laatste versie een grotere flash configuratie chip gebruikt. Als je de userguide bijneemt om te zien hoe je de programmer moet instellen dan staat daar natuurlijk nog de oude kleine flash device nog vermeld. T'ja dan maar opnieuw de procedure doorlopen om te zien hoe je indirect zo een flash moet configureren. En ja dat zijn toch nog wat verschillende stappen. Maar goed na wat foutieve instellingen ben ik toch geslaagd om het voor elkaar te krijgen. Probleem is dat je alles in een maal moet goed doen, nieuwe display aansluiten, de juiste I/O pinnen selecteren enz. Maar hier staan de beide versies, eentje met de MAX1000 en eentje met de Cyclone10LP:
Beide boardjes hebben dezelfde pinout volgorde. De aansluiting is net hetzelfde voor beiden. Je kunt zo de displays omwisselen, alle verbindingen nu zijn dezelfde. Bij de Cyclone10LP zijn er 464 LE's gebruikt van de 24624.
Device 10CL025YU256C8G
Total logic elements 464 / 24,624 ( 2 % )
Total registers 209
Total pins 32 / 151 ( 21 % )
Total virtual pins 0
Total memory bits 0 / 608,256 ( 0 % )
Multiplier 9-bit elements 0 / 132 ( 0 % )
Total PLLs 1 / 4 ( 25 % )
In de code zit ook mijn afstandsbediening. Ik ga die IR diode ook nog aansluiten en een draadje leggen naar beide modules. Dan zou de remote code op beide display's gelijktijdig moeten verschijnen. De counters lopen voor beide boardjes mooi gelijk (na een gezamelijke reset).
rew
four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Ik heb verschillende 3D stukjes geprint. Die passen allemaal op de Fischertechniek onderdelen. Hier is dus een standaard Fischer basisplaat onderaan gebruikt. Frame van het display 4x20char is ook 3D print. Mijn oude 3D printer heeft al ruim 1600 uren werk gedaan. Nooit iets moeten vervangen aan de printer.
Bij een FPGA heeft men meestal een of meerdere PLL's beschikbaar. Dat is een belangrijke hulp bij het leren werken met FPGA's. Vanaf 1 input clock kun je meteen meerdere andere gewenste nieuwe clocks aanmaken.
Ik heb hier 4 uitgangen aangemaakt C0, C1, C2 en C3. De clock ingang is hier 12 MHz.
Bij de Cyclone10 LP moet je na het compileren via de menu file->Convert Programming Files nog een convertie maken om een JTAG Indirect Configuration File (.jic) aan te maken. Die .jic file heb je nodig in de programmer om de Configuratie flash doorheen de FPGA te kunnen programmeren.
De configuratie flash van de Trenz cyclone10 LP module is nu een EPCQ64A ( in de Userguide staat nog de oudere type EPCQ16). Hierbij een afbeelding van de nieuwe instellingen. Onderaan (oef nu uitbeeld) kun je dan de Generate klikken om de .jic file aan te maken die daarna in de programmer zal gebruikt worden.
De programmer ziet er dan zo uit:
Je ziet hier in de voorstelling hoe de flash geprogrammeerd word.
Na het programmeren moet je de reset drukken om de module opnieuw te starten.
In mijn voorbeeld heb ik 4 nieuwe clocks aangemaakt vertrekkende van de input 12MHz clock. Die clocks zijn:
CLK20 -> 20 MHz
CLK4 -> 4 MHz
CLK1 -> 1 MHz
CLK27 -> 27 MHz
Dit om even de extra stap aan te duiden voor de programming van de Configuratie Flasch.
Ik gebruik Quartus Prime Version 23.1 std build 933 SC Lite Edition.
Een PLL gebruik je doorgaans alleen om van een basis externe lage clockfrequentie naar een hogere interne clockfrequentie te gaan.
Lagere interne clockfrequenties dan de basis externe lage clockfrequentie kun je gewoon met logica maken daarvoor hoef je geen PLL te gebruiken.
Op zaterdag 6 december 2025 14:46:30 schreef Bobosje:
Een PLL gebruik je doorgaans alleen om van een basis externe lage clockfrequentie naar een hogere interne clockfrequentie te gaan.
Lagere interne clockfrequenties dan de basis externe lage clockfrequentie kun je gewoon met logica maken daarvoor hoef je geen PLL te gebruiken.
Het ging mij erom dat je in een CPLD zoals free_electron aangaf om te beginnen direct een hoop LE's nodig hebt om een gepaste clock te maken. Anderzijds gebruiken al mijn FPGA's altijd meerdere clock uitgangen en die zijn zowel lager als hoger. We hebben het hier toch over CPLD en FPGA toepassingen. Heb je een toepassing waarbij je echter voldoende hebt met een kleine CPLD dan hoef daar geen FPGA in.