flipflop
"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein
Op 22 september 2007 04:44:36 schreef free_electron:
het systemverilog always_ff statement wordt niet altijd correct geimplementeerd ( soms krijg je toch een latch in je systeem .... )
Toch maar weer nette Verilog schrijven dan he! En zo hoort het ook 
Sandertje
Zo niet, dan toch!....GeoCaching can be a way of life....Why not? >> GeoCaching: Team SupeRare
Op 21 september 2007 18:45:29 schreef fotoopa:
Ja het grote voordeel is hierbij dat je geen extra hardware nodig hebt om dit te testen/ontwikkelen terwijl je toch heel veel zaken kunt uitproberen. In de huidige opstelling heb ik een volledige I/O connector nog vrij van 36 I/O pinnen en daar staat de LA kontinu op aangesloten. Ik hoef bijgevolg niet steeds de draden van de LA opnieuw te gaan aansluiten. Heb je bepaalde problemen tijdens je hardware ontwikkeling, plaats dan gewoon enkele signalen op de meet connectors voor de LA zoals state machines en je ziet al vrij snel wat er mis gaat.Ook de weergave van de waardes in verschillende data op het scherm formaten is heel confortabel evenal de afzonderlijke naamgeving per signaal of groep is super.
Gisteren heb ik hiervoor nog een nieuwe labtop aangekocht. Dit scherm heeft 1280 pixels horizontaal, ideaal voor zo een LA. De foto hierboven is slechts een gedeelte van die breedte om de topic niet te breed uit te smeren. Maar in de stutus kun je daar veel meer meetgegevens aflezen.
@P.Techneut,
Hierbij een foto van de opstelling:
De DE1 bezit 2 I/O connector type flatkabel 2x20 pins. De LA meetdraden zijn voorzien van female 2.54 pith pinnen die je direct op zo een standaard I/O connector kunt aansluiten. Op die I/O connector waren maar 2 GND pinnen voorzien, op de LA zijn er dat 4 Ik heb er dan 2 via die extra opsteeknijpers 2.54 mm direct op de print zelf aangesloten. Ik had in totaal 38 van die opsteek nijpers bijbesteld voor het geval je direct op de chips moet aansluiten. Maar hier op een gewone connector gaat dit met de origineele pinnen van de LA.
Wat zijn dat voor een snoertjes die je gebruikt om je I/O te verbinden? Volgens mij zoek ik al een poosje dit sooft kabeltje..
B.v.d.
Op 22 september 2007 19:36:47 schreef Sandertje:
[...]
Wat zijn dat voor een snoertjes die je gebruikt om je I/O te verbinden? Volgens mij zoek ik al een poosje dit soort kabeltje..
B.v.d.
Die snoertjes zijn bijgeleverd bij de logicport. Het is ongeveer zoals een flatkabel maar iedere draad is los, de isolatie is teflon waardoor de draad stevig is en bestand tegen hogere temperaturen en op ieder uiteinde hebben ze daar een female pinconnector aangezet en overtrokken met een kleur. Door de kleuren te groeperen bekom je een duidelijk overzicht per 8 databits, GND's en CLK's.
Die ganse connector is ook afzonderlijk te bestellen en kost $39 zie hun order site ( 40 polige connector met aansluitdraden)
Ook de opsteek grabbers staan daarbij.
Arjan Swets
cnc filmpjes op Http://www.arjan-swets.com
Error: Top-level design entity "Piano-toets" is undefined
wat betekend deze error?
pfff...
ik heb het voorbeeld schema_teller aan de gang op mijn DE-Nano...
althans... als ik op het eerste knopje druk... dan tellen de ledjes op... (binair)... en als ik op het tweede knopje drukt gaan ze uit....
dus als dat de bedoeling was, werkt het... 
[Bericht gewijzigd door Arjan Swets op (61%)]
stecj366
Sonar is meer dan Ping...
De error betekent dat er in je project geen designfile (vhdl, verilog of schematic) als top level is aangeduid, dus als hoogste in de hierarchy van het ontwerp.
Dit kun je doen door de file die je als top level wilt (vhdl, verilog of schema) te openen, en dan via project - set as top level entity. Dan zou het moeten lukken
Arjan Swets
cnc filmpjes op Http://www.arjan-swets.com
Ik heb eerst maar eens een demootje gezocht....
Ik heb hier het standaard demo die in het DE-Nano board draait...
module DEnano(CLOCK_50, KEY, LED);
input CLOCK_50;
input [2:0] KEY ;
output [7:0] LED;
wire [7:0] mode1;
wire [7:0] mode2;
reg select;
wire CLOCK_50;
wire [2:0] KEY ;
always @ (negedge KEY[0])
begin
if (select==1)
select <= 0;
else
select <= select + 1;
end
assign LED = (select > 0) ? mode1 : mode2;
Knight_Rider m1 ( .CLOCK_50(CLOCK_50),
.KEY(KEY[1]),
.LED(mode1)
);
Count m2 ( .CLOCK_50(CLOCK_50),
.KEY(KEY[2]),
.LED(mode2)
);
endmodule
Dit is die Top-Level design entity ?
en deze wordt altijd uitgevoerd door een falling edge van key[0]. en key 0 zit op pinnetje U 15....
en zodra je op Key[0]
word er gekeken of select gelijk is aan 1
als select gelijk is aan 1 maken we select 0
als select niet gelijk is aan 1 (dus 0) wordt select <= select +1 uitgevoerd....
(zomaar een vraag tussen door... waarom select <=select +1 en waarom niet net als eerder select <= 1? )
kijk ik snap hoe het werkt... maar de syntax begrijp ik nog niet helemaal...
bijvoorbeeld:
input [2:0] key; wat is dit... die [2:0]
wire [7:0] mode1; wat is dat ...
ik snap wat die assign LED = (select >0) ? mode1 : mode2;
doet...
iets van als select 0 is wordt module m1 uitgevoerd, als select 1 is wordt m2 uitgevoerd.....
module Knight_Rider(LED,CLOCK_50,KEY);
output [7:0] LED;
input CLOCK_50;
input KEY;
reg [22:0] Cont;
reg [7:0] mLED;
reg DIR;
always@(posedge CLOCK_50) Cont <= Cont+1'b1;
always@(posedge Cont[22] or negedge KEY)
begin
if(!KEY)
begin
mLED <= 8'b11100000;
DIR <= 1;
end
else
begin
if(!DIR)
mLED <= {mLED[6:0],1'b0};
else
mLED <= {1'b0,mLED[7:1]};
if(mLED == 8'b01110000)
DIR <= 1;
else if(mLED == 8'b00001110)
DIR <= 0;
end
end
assign LED = ~mLED;
endmodule
tja... altijd op de positieve flank van clock_50 doen we cont <= cont +1
en altijd op de negatieve flank van KEY of als cont[22] (is dat als cont gelijk is aan 22? of als het 22 bit van cont hoog wordt?)
dit stukje snap ik helemaal niet...
begin
if(!DIR)
mLED <= {mLED[6:0],1'b0};
else
mLED <= {1'b0,mLED[7:1]};
if(mLED == 8'b01110000)
DIR <= 1;
else if(mLED == 8'b00001110)
DIR <= 0;
end
end
ja ik snap wel dat hiermee de ledjes (per 3) heen en weer geschoven wordt...
module Count(CLOCK_50, LED, KEY);
output [7:0] LED;
input CLOCK_50;
input KEY ;
reg [22:0] Cont;
reg [7:0] mLED;
reg [7:0] number;
always@(posedge CLOCK_50) Cont <= Cont+1'b1;
always @ (posedge Cont[22] or negedge KEY)
begin
if (!KEY)
begin
mLED = 8'b00000000;
number = 0;
end
else
case (number)
0: begin mLED = 8'b00000000; number = 1;end
1: begin mLED = 8'b00000001; number = 2;end
2: begin mLED = 8'b00000011; number = 3;end
3: begin mLED = 8'b00000111; number = 4;end
4: begin mLED = 8'b00001111; number = 5;end
5: begin mLED = 8'b00011111; number = 6;end
6: begin mLED = 8'b00111111; number = 7;end
7: begin mLED = 8'b01111111; number = 8;end
8: begin mLED = 8'b11111111; number = 9;end
9: begin mLED = 8'b11111110; number = 10;end
10: begin mLED = 8'b11111100; number = 11;end
11: begin mLED = 8'b11111000; number = 12;end
12: begin mLED = 8'b11110000; number = 13;end
13: begin mLED = 8'b11100000; number = 14;end
14: begin mLED = 8'b11000000; number = 15;end
15: begin mLED = 8'b10000000; number = 16;end
16: begin mLED = 8'b00000000; number = 17;end
17: begin mLED = 8'b10000000; number = 18;end
18: begin mLED = 8'b11000000; number = 19;end
19: begin mLED = 8'b11100000; number = 20;end
20: begin mLED = 8'b11110000; number = 21;end
21: begin mLED = 8'b11111000; number = 22;end
22: begin mLED = 8'b11111100; number = 23;end
23: begin mLED = 8'b11111110; number = 24;end
24: begin mLED = 8'b11111111; number = 25;end
25: begin mLED = 8'b01111111; number = 26;end
26: begin mLED = 8'b00111111; number = 27;end
27: begin mLED = 8'b00011111; number = 28;end
28: begin mLED = 8'b00001111; number = 29;end
29: begin mLED = 8'b00000111; number = 30;end
30: begin mLED = 8'b00000011; number = 31;end
31: begin mLED = 8'b00000001; number = 0;end
default: begin mLED = 8'b00000000; number = 1;end
endcase
end
assign LED = ~mLED;
endmodule
deze is ook niet echt moeilijk te begrijpen, althans ...ook weer de zelfde vraag als eerder....
ik snap ook hier dat op de clock_50 cont verhoogt....
en weer dat op die cont[22] wordt er naar die case instruktie gesprongen....
nummer = 0 dus de eerste regel wordt uitgevoerd....
mLED wordt naar de ledjes gestuurd... number wordt 1 gemaakt...
Dus het volgende rondje wordt regel 1 uitgevoerd... enz ezn...
nu vraag ik me ook opeens af? moet die cont teller nergens op 0 gezet worden?
nou ja... ik laat het hier maar ff bij....
anders lijk ik helemaal zo stom... 
ja sorry hoor...die is echt helemaal nieuw voor mij...
en ik heb niet op die LOMschool gezeten voor me zweetvoeten...
@ Free_electron: Dit soort vragen... komen die ook in je boek... ?
edit :
sorry, sommige vragen waren al eerder gesteld.... ik zal het heleverhaal hier eerst nog een goed doorlezen...
edit/
flipflop
"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein
Tja, dat zijn een hoop basis vragen. Zoek een goede Verilog beschrijving en je vind de meeste antwoorden. Ik zal er een paar uitpakken:
(zomaar een vraag tussen door... waarom select <=select +1 en waarom niet net als eerder select <= 1? )
In dit geval had er ook select<=1 kunnen staan. Immers 0+1=1. Echter, stel dat je de code "schaalbaar" wilt maken zodat je later makkelijk de loop wat kunt verlengen, dan is die adder wel handig. Je test dan niet op (select==1) maar op een hoger getal. Die 1 kan dan bv een parameter of constante worden. In dit voorbeels is nog mooier:
select<=!select;
input [2:0] key; wat is dit... die [2:0]
wire [7:0] mode1; wat is dat ...
[x:x] betekent een bus. Dus een input met de naam 'key' die 3 bits breed is. En een wire 'mode1' die 8 bits breed is. Soort array van bits dus.
ik snap wat die assign LED = (select >0) ? mode1 : mode2;
doet...
iets van als select 0 is wordt module m1 uitgevoerd, als select 1 is wordt m2 uitgevoerd.....
if (select>0) then LED<=mode1 else LED<=mode2;
Dat is hetzelfde maar anders opgeschreven. In logica is het een multiplexer en (waarschijnlijk) een adder. Met de adder wordt gekeken of select>0 is. De uitkomst hiervan gaat op de sel ingang van de mux. mode1 en mode2 staan op beide ingangen en LED op de uitgang.
Kijk, je zou dan beter nog kunnen schrijven
if (SELECT != 0) ....
Zie mijn laatste post vorige bladzijde 
Hierbij een voorbeeld om de accesstijd van een extern geheugen te meten voor gebruik bij de FPGA.
Ik heb een extern flash geheugen nodig en wou even opmeten hoeveel de accesstijd ervan bedraagt. Daarom heb ik een klein stukje verilog geschreven:
assign FL_ADDR = {14'h000000,fl_adr_reg[7:0]};
assign FL_WE_N = 1'b1;
assign FL_RST_N = oRESET;
assign FL_OE_N = 1'b0;
assign FL_CE_N = 1'b0;
wire [7:0] FL_DQ; // flash data lijnen
wire pll_clk; // pll clock via wizard
reg [7:0] fl_adr_reg; // gedeelte van het flash adres bereik
pll_10 pll10(
.inclk0(CLOCK_50),
.c0 (pll_clk)); // pll om andere clocks te maken
always @ (posedge pll_clk)
begin
fl_adr_reg <= fl_adr_reg + 1'b1; // bij iedere pll_clk wordt adres verhoogt
fl_data_reg <= FL_DQ; // flash data wordt op de posegde v/d pll_clk in een reg gelezen
end
Ik heb volgende signalen naar buiten gebracht op de FPGA:
8 bit adres gedeelte die naar de flash gaat
8 bit data ongebufferd uit de flash, in de FPGA en weer eruit voor de LA meting.
8 bit data van de flash geclockt op posedge pll_clk en naar buiten voor de LA meting.
de pll_clk die hier op 10 Mhz was ingesteld.
De resultaten:
Eerste beeld geeft het resultaat op de LA, het tweede toont een 2 levels trigger instelling. Er wordt getriggert als:
1. het adres gelijk is aan 01 (level A instelling)
2. en bij de eerst volgende posedge van de clk_10 (level B instelling)
De LA geeft ons een mooi overzicht van het resultaat. We zien idd dat hij op de gewenste plaats triggert, iets na de posedge van de clk_10 zien we het adres verhogen van 1 naar 2 en dat dat ogenblik staat de data op 128.
De cursor B geeft de positie weer waar de ongebufferde flashdata veranderd ( 128 -> 129) De LA toont de waarde van T-B = 58 nsec Dit staat ook onderaan in de status balk.
De geclockte flashdata gaat slechts worden overgenomen bij de volgende posedge van clk_10 ( zo bepaald in de verilog) dat zien we ook op de LA waar de cursor C staat. Die tijd is 100 nsec en is de 10Mhz clock periode.
Uit deze meting zien we dat de accesstijd van die externe flashdata 58 nsec is. Willen we die correct gebruiken in onze toepassing dat moeten we minstens met deze tijd rekening houden wat max 16Mhz clock zou zijn( 62.5nsec).
Ik had deze gegevens nodig omdat ik de flashdata wil gebruiken voor mijn moodlight project. Nu weet ik zeker als ik een 12 MHz lees clock zal gebruiken dat ik de data hiervan correct kan behandelen.
Nu heb ik twee vragen.
1.
Heb je nog connecties om diezelfde meting met een HP LA te doen en de resultaten te vergelijken?
2.
De screen-capture logic_analyser.png (Gepost maandag 17 september 2007 15:34:49), toont onderaan in de statusbalk "Acquisition: 1, Samples: 5.96K".
Waarom 5.96K samples?
Is dat inclusief gecomprimeerde samples, of welke info heb ik gemist?
Op 23 september 2007 14:03:05 schreef P.Techneut:
Nu heb ik twee vragen.
1.
Heb je nog connecties om diezelfde meting met een HP LA te doen en de resultaten te vergelijken?
Nee, heb ik niet meer, ben op rust(enfin pensioen).
Op 23 september 2007 14:03:05 schreef P.Techneut:
2.
De screen-capture logic_analyser.png (Gepost maandag 17 september 2007 15:34:49), toont onderaan in de statusbalk "Acquisition: 1, Samples: 5.96K".
Waarom 5.96K samples?
Dit is idd inclusief compressie, anders heb je maar 2K samples. Maar praktisch valt dit heel goed mee. Veel metingen geven zelfs meer dan 1 M samples. Vergeet niet dat ik hier klok op 500 Mhz en dat mijn eigen clock van 10 Mhz meeggenomen is in de sample data. In heel veel gevallen plaats ik hem in state mode. Voor serieel zoals I2C, SPI, RS232 heb je doorgaans boven de 10M samples buffer.
Als ik dit vergelijk met de HP die ik tot over 3 jaar nog gebruikte is deze LA veel confortabel. Ze zullen nu ook wel betere hebben maar die zijn niet haalbaar voor de hobby terwijl ze voor mij geen meerwaarde hebben.
Vooral die 2 level trigger mogelijkheden maakt hem heel praktisch en benaderd daardoor de HP mogelijkheden.
Ik was ook eerst bang voor die 2 K buffer maar nu ik de mogelijkheden zie met die compressie methode is dit geen punt meer. Gezien mijn prioriteit voor een LA tov een scoop is deze LA voor mij veel beter geschikt dan de Rigole. Ook 34 kanalen tov 16 is heel belangrijk samen met de extra triggerfunctie's.
Dat je een PC nodig hebt is achteraf gezien geen nadeel, meer zelfs een voordeel. Om mijn FPGA's te herconfigureren moet je toch een PC gebruiken en ook als je de meetresultaten wilt bewaren in je project gaat dit uitstekend. Omdat mijn laptop toch al 7 jaar oud was heb ik nu meteen een nieuwe aangeschaft. Hierdoor hangt de LA meestal daaraan en is verbonden met mijn lokaal draadloos netwerk. Werk ik boven(soldeer ruimte en gereedschappen) dan staat ook daar een PC aangesloten op mijn netwerk en kan ik ook verder werken.
Ps: Bij deze meting gebruikt ik 25 channels van de LA, nl 3 x 8 bit bussen en 1 clock. Zoiets kun je niet doen met de 16 channels van de Rigole.
Omdat de LogicPort in demo-mode (zonder hardware) geen gecomprimeerde samples simuleert, vroeg ik mij dat af. Het is nu duidelijk.
Al die voordelen zag ik ook al. Vandaar mijn interesse en mijn tip daarover in het andere topic. Misschien bestel ik hem ook nog, maar ik heb een standalone HP LA en de HP probes bevallen mij beter. Bovendien doe ik steeds minder elektronica. Neemt niet weg dat het mij toch een prima ding lijkt om erbij te hebben zeker nu de dollar zo laag staat.
Die HP probes verschillen zo heel veel niet. Wel zijn hun draadjes iets fijner maar ze hebben ook dezelfde female busjes om op de pinheaders te steken. Maar als je al een LA bezit dan zit je al in een luxe geval. Maar de vroegere types waren lawaaimakers en stroomverbruikers, de logicPort wordt gevoed door de USB zonder lawaai.
Voor de hobby en bij FPGA of CPLD toepassingen moet men niet twijfelen. dit is een enorme hulp bij je ontwikkeling.
Ik heb zopas de PLL in mijn cyclone II van de DE1 board even een clocksignaal van 200 MHz laten maken en gewoon op een I/O pin naar buiten gebracht en op de LA aangesloten.
Dit werkte direct, de frequentie wordt mooi weergegeven in de statuslijn en als ik time mode gebruik en sampel met 500 Mhz dan komt die 200 MHz mooi op de LA. Zoals je weet wordt de blokgolf niet meer symetrisch weergegeven omdat je sampelfrequentie lieft 4 of meer maal hoger moet zijn maar dit is een normaal verschijnsel, ook zo voor andere LA's.
Ik heb die 200 MHz uit mijn FPGA ook eens als state clockdriver gebruikt in de LA en ook dat werkt perfect. ( In state mode mag je tot 200MHz aanleggen extern) deze mode heb je niet beschikbaar op de Rigole, een functie die toch heel veel voordelen heeft.
Het is ongeloofelijk hoe eenvoudig het werkt met een PLL in een FPGA. Je tovert daar bijna alle mogelijke frequentie's uit, gewoon door even te hercompileren terwijl je ingang dezelfde waarde behoud. Geen gesleur meer met alle mogeljke soorten xtallen.
Sjonge jonge.
Er is wat losgemaakt de afgelopen dagen.
Het topic "eenvoudige voorbeelden" is me toch wat keren uit de bocht gevlogen. Soit (zegt de Belg). Het hoort erbij.
Mijn stand van zaken: Als volledige nul heb ik, met behulp van de knopjes cut en paste, voor mijzelf een paar stukjes software gemaakt waar ik van heb geleerd. Als een aap naar een roestig horloge heb ik naar mijn beeldscherm zitten kijken toen ik foutmeldingen kreeg die ik absoluut niet kon thuisbrengen. Achteraf had deze ezel zijn module-naam laten beginnen met een getal. Komma's teveel, puntkomma's te weinig, vertiepingen in de pinplanner. Van dat soort dingen. Maar: ik begin routine te krijgen. Tussen de dagelijkse beslommeringen (en beschikbaarheid van mijn PC) door lukt het me steeds sneller door te krijgen (na mijn cut and paste) welke stukjes overbodig zijn en welke manupileerbaar zijn.
Aan de high-end software ben ik nog niet toe. Dat komt misschien nog wel. Op dit moment heb ik waarachtig de LED-jes op mijn nano-bordje aan het pwm-en van 0 tot 255 bits.
Waarschijnlijk op een onhandige manier, wat Quartus zegt me dat ik 90 Logic Cells gebruik. Is dat ook het z.g. aantal LE's? In het achterhoofd speelt dat MAXII zijn chip garandeerd voor 100x herprogrammeren. Daar zit ik overheen denk ik. Die 100 keer baart me (nog) geen grote zorgen. De vraag is: wat als? Ik zie hier voornamelijk toepassingen die gemaakt zijn op een of ander experimenteer board. Als ik mijn wuivende pingpongballen aan de gang heb, ben ik mijn nano-boadje voor de besturing kwijt. Dan zou het handig zijn om een losse chip te kopen, geschikt te maken voor mijn pingpongballen en dan mijn boardje te gebruiken voor andere oefeningen. Is dat lastig, zo'n losse chip op te tuigen?
Ja coco3, vergeet niet dat je al een hele stap achter de rug hebt. De eerste faze blijft lastig maar eens je daarover bent gaat het heel snel in stijgende lijn vooruit. Als starter krijg je zoveel nieuwe functie's voorgeschoteld en zovele foutmeldingen.
Maak je geen grote zorgen over die 100 maal herprogrammeren van de MAX II reeks. Ik heb nog steeds geen enkele melding gezien dat dit een probleem is.
Zelf met chips gaan experimenteren kan voor de kleinere versie's. Het hangt van je ervaring af. Grotere versie's worden heel lastig zoals de BGA types, die mag je vergeten.
Maar er zijn alternatieven. Zoals xantus voorzien heeft met de cyclone, zoals pluto3 een cyclone II opplug module waar de kritische elementen kant en klaar opsteken en getest zijn. Ik blijf erbij dat voor heel veel hobby gebruikers dit de beste haalbare configuratie is.
Heb je iets meer financiele middelen dan blijft een ontwikkelingsboard zoals de DE1 een van de beste alternatieven. Echt daar maak je zoveel mee, volledig ongelimiteerd in capaciteit en I/O's dat je al je ontwikkelingen kunt maken. Ik heb er zo 2 stuks aangekocht, eentje die konstant als test en ontwikkeling opgesteld staat, waar de LA aan verbonden is. De tweede is voor een applicatie zelf, zoals voor mijn moodlight ontwerp en ook voor mijn fotografie opstelling maar daar ga ik hem vervangen door een nano boardje. Al die functie's heb ik al eens met succes overgebracht op het kleine boardje
Over het verbruik van het aantal LE's in een toepasing, ook daar niet te veel zorgen maken in het begin. Zelfs met het kleine nano boardje heb je eral 2210. Naarmate je ietje's vordert in je toepassingen worden die LE's wel optimaler gebruikt. Heel veel hangt af van je design methode, soms door een andere kijk op je toepassing dalen die drastisch. Ik had hier al testen met honderden pwm's in dat ene boardje.
Ik vind je methode van hardnekkig zoeken om de boel te kunnen opstarten prachtig. Hoemeer van die kleine opstartproblemen je zelf overwint hoe gemakkelijker je de andere zult oplossen. Heb je harnekkige problemen blijf er niet te heel lang mee lopen, er zijn er hier wel die je zullen helpen.
Ik moet zeggen dat ik blij ben met dit topic omdat ik me nu eindelijk eens in verilog heb gestort en met succes:
Het CPLD programma voor de voedingscontroller doet nu het zelfde (en meer!, nu extra features in kunnen bakken) en dat met MINDER macrocellen! Ik heb't maar volledig verilog gedaan en geen schematic als top. Text editen gaat toch wat sneller.
Ik sta verbluft van het resultaat 
Hier weer een klein stukje verilog code. Straks als de bestukte printjes geleverd worden door xantus zullen velen ook over het 4.3" lcd display beschikken. In afwachting van de definitieve levering heb ik even de timings generator voor de sync signalen voorbereid. Ik mis nog 1 signaal, nl DISP, omdat ik niet goed weet hoe dit signaal eigenlijk moet verlopen. De datasheet lijkt mij niet helemaal duidelijk vandaar dat ik dat signaal nog even buiten de timing gelaten heb. Als er zijn die de datasheet wel begrijpen en mij kunnen vertellen hoe dit DISPL signaal moet verlopen, graag!
Nu het stukje programma:
reg clk_lcd;
reg vsync;
reg hsync;
reg disp;
reg h_ena;
reg v_ena;
reg [9:0] hs_cnt;
reg [8:0] vs_cnt;
always @ (posedge clk_lcd)
begin
if (hs_cnt < 524) hs_cnt <= hs_cnt +1'b1;
else begin
hs_cnt <= 0;
if (vs_cnt < 285) vs_cnt <= vs_cnt + 1'b1; else vs_cnt <= 0;
end
if (hs_cnt == 0) hsync <= 1'b0;
if (vs_cnt == 0) vsync <= 1'b0;
if (vs_cnt == 9) vsync <= 1'b1;
if (vs_cnt == 284) v_ena <= 1'b0;
if (vs_cnt == 11) v_ena <= 1'b1;
if (hs_cnt == 42) hsync <= 1'b1;
if ((hs_cnt == 44) & (vsync) ) h_ena <= 1'b1;
if (hs_cnt == 512) h_ena <= 1'b0;
end
Heel moeilijk is het stukje niet, er zijn h_sync en v_sync voor de synchronisatie.
Er zijn h_ena en V_ena om de display data te regelen (ram uitlezing).
En er zijn 2 counters, een voor de pixels en 1 voor de lijnen.
Hier de resultaten op de LA:
Gebruikte meetsignalen:
10 adres lijnen voor h_cnt
9 adres lijnen voor v_cnt
5 lijnen voor de timings
1 lijn voor de clock freq aanduiding.
-----
25 totaal.
De signalen spreken voor zichzelf, je ziet bovenaan de v_sync die gaat van lijn 0 tot lijn 8 en de v_ena voor de display data (ram) wordt later gestart en is vroeger gedaan om overeen te komen met 272 lijnen. De pixel teller heb ik weggelaten omdat je hem op deze meestand toch niet kunt aflezen gezien zijn veel snellere verandering.
De onderste lijn is de vs_cnt en je ziet hier de decimale aanduiding van het lijnnummer verschijnen. Is er ergens een fout dan lees je die zo af van de LA en pas je het programma aan. Zo simpel is dat.
In de status zie je nog dat de CLK2, die de pixel clock is net ietes onder de 9Mhz staat,
dat D26(h_sync) op 17.150 Hz lijn frequentie staat en de frame rate D25(v_sync) juist 60Hz is.
Als ik nu nog juist weet hoe DISP moet verlopen kan die er ook zo bijgeplaatst worden.
Om de RAM voor de display te sturen moeten beide v_ena en h_ena actief staan. Dit komt overeen met de effectieve display tijd. Tijdens de sync en iets ervoor en iets erna is er immers geen data nodig.
Een heel veel gebruikte toepassing is de klassieke lcd 2x16 character display. Hiervoor heb ik vandaag een stukje verilog geschreven en getest. Dit gaat op alle boards, MAX II nano CPLD, DE1 en xantus cyclone boardje.
Het stukje verilogcode staat hier
Op de onderstaande opname met de LA zie je mooi het grootste gedeelte van 1 schrijf cyclus. De ganse cyclus wordt 60 maal per seconde herschreven met de data. Als je daar veranderlijke waarden aanlegt zie je die onmiddelijk veranderen.
Ook zie je mooi de RS lijn veranderen tussen command en data gegevens. De E lijn van de display is aangeduidt met fijne lijntjes omdat die slechts 1 clock breed zijn, nl 1 usec. Tussen iedere E clock zie je de nieuwe data verschijnen die naar het lcd gestuurd wordt. Na de eerste 16 characters zie je de RS lijn veranderen van hoog naar laag omdat er een command voor een nieuwe lijn wordt gegeven. dit command is $C0. daarna volgen weer 16 data's waarvan je enkel de eerste 4 nog ziet op de LA omdat ik het beeld beperkt heb, anders wordt het te breedt in deze topic.
Hieronder een detail opname hoe de data setup is tov de E clock.
Dit beeld komt vanuit het eerste beeld maar is open getrokken op het eerste character. De trigger staat op de pos flank van de RS lijn en we zien dat 1 clock later of 1 usec ook de E lijn van de display omhoog gaat voor een clock periode of ook 1 usec. Je ziet dat de data voldoende setup tijd voor de E lijn heeft, en dat die data een waarde heeft van $66, dit is de kleine letter f die als eerste character op de display staat.
De lcd routine bevat een dubbel state machine:
- een state_lcd
- een state_char
en een state_sel bepaald in welk gedeelte de state zal verlopen. Het gedeelte state_lcd bepaald de timing van de lcd ( E en RS) terwijl de state_char het ophalen van de volgende data die een command of character kan zijn. De waardes komen uit de tabel. Tevens is er mogelijk om in de verschillende delen bepaalde delay loops te activeren en de laatste delayloop bepaald hoeveel keren je alle data gaat gaan refreschen. delayloop tussen init en normale refresch is ook afzonderlijk in te stellen.
Ook is er een omzet tabel die bin naar ascii omzet om hexadecimale characters als ascii waarden weer te geven op het display.
De gestuurde data is slechts een voolbeeld, ik heb hier gebruik gemaakt van een fl xxxxxx adres, een sr xxxxxx adres een 16 bit data, een 8 bit data en een 24 bit keyboard entry waarde die je kunt ingeven. Functie is uitlezen van mijn flash geheugen en lezen/schrijven van het sram geheugen.
~Galaxy
In the beginning there was nothing.... and even that exploded...
Heel even je topic kapen.
Vandaag mijn FPGA board binnengekregen. (van de sk-aktie)
Nu kan ik nergens de link meer vinden waar de pdf'jes met componentopstellingen en schema's staan.
Wie kan mij aan de link helpen, of de pdf jes in mijn postbakkie dumpen?
Voor de beginners: http://wiki.opengraphics.org/tiki-index.php?page=Verilog+Lesson+1
Ook les 2 en 3 zijn verhelderend.
Fotoopa: ik heb uit jou voorbeelden zitten knippen en plakken. Daardoor kan ik de led's die ik wil laten pwm-men met de waarde die ik wil door te drukken op een knopje dat ik bepaal. En dan telt mijn CPLD een waarde die ik bepaal bij mijn pwm. Dit moet ik nu nog, zonder glitches, 80 keer herhalen. En ik moet een strategie bedenken om patronen op de goede plek te krijgen.
Ik zal het wel op de onhandige manier doen, maar daar kom ik wel achter.
Je voorbeelden heben me enorm op weg geholpen. Het lastige om de hele materie in de vingers te krijgen is, heb ik gemerkt, het gebrek aan eenvoudige voorbeelden. Dat hele internet is vergeven van allerlei slimmerikken die hun kennis en kunde willen ventileren. Na een simpel tellertje duiken ze gelijk naar het diepe en dan verlies ik mijn zwembandjes. Die meneer Miller (van de hyperlink hierboven) snapt het ook.
De eindafrekening van de nano-boardjes is binnen.
Er wordt 19% BTW gerekend over de totale bestelling (dat is dus het boardje + verzendkosten). En dan telt de douane er nog 10 euro's bij voor de moeite om de uitdraai, die ze van de vervoerder hebben gekregen, in een enveloppe te doen.
Hoe is het met je moodlight? Kosten die led's van Osram rond de 7 euro per stuk? Dan heb je een leuke baan gehad met een goede pensioenopbouw.
En, vergeleken met wat ik van PIC's weet: CPLD's en FPGA's zijn -als je niet kijkt naar het prijsverschil met PIC's-: super.
coco3:
Blij te horen dat je goed op weg zijt! Ja die eindafrekening dat klopt met wat hier in Belgie ook van toepassing is, zij dat de btw hier 21% is. Ook op mijn logic analyser uit de states was dit hetzelfde.
Er zijn zoveel kleine beginperikelen om te starten dat het vrij moeilijk overkomt maareens je iets kunt compileren en bekijken op een praktisch boardje loopt het wel.
Ik heb de simulatie van die 384 pwm's volledig gedaan. Met mijn huidige opstelling loopt dit perfect. Welke leds ik uiteindelijk ga gaan gebruiken en hoe ik ze ga opstellen weet ik nog niet juist. Maar ze kosten 1.89 euro per stuk bij 100 stuks afname. Maar ik heb hiervoor nog tijd want er liggen hier nog veel projecten te wachten en ik hoop trouwens nog deze week het xantus boardje(s) binnen te krijgen. Daar gaan ook vele voorbeelden loskomen.
ik zou je ook aanraden om een lcd display te monteren van 2x16 char. dit kost niet veel en je hebt heel veel aanduidings mogelijkheden, vele beter nog dan gewoon 4x 7 segment display's. trouwens de volledige routine heb ik hier al online geplaatst.
ik ben nu bezig met het lcd 4.3" met 480x272 pixels klaar te maken. Ik heb hiervoor al een heel ontwerp klaar hoe de opbouw en uitsturing verloopt en vele delen zijn al getest op de LA. ik zou de full 24 bit grafische mode ondersteunen met foto's en in overlay een character display van 16x5 regels of 80 characters.
Met de DE1 board kan ik live die data voor de beelden via de usb heen en weersturen van de FPGA. Ook de flash, de SRAM en de SDRAM gaan op deze manier. terasic heeft alle verilog code bijgeleverd en die kun je integreren samen met je eigen toepassing. Ook hiermee heb ik vandaag vele testen gemaakt met afgeslankte delen van terasic enkel voor de devices die ik gebruik en dan mijn eigen toepassing.
Wow, met mijn LA gaat het 10x sneller vooruit. Is er iets dat ik niet begrijp, gewoon de LA eropzetten en meten en je ziet hoe de signalen verlopen. zelfs een clock via de pll gemaakt op 200 Mhz meet ik op de LA!
Binnenkort kom ik hier wel terug met nieuwe voorbeelden.
beertje_01
My Tube is bigger then yours
onlangs toch ook aan het stoeien geslagen met quartus software.
is wel leuk en werkt eigenlijk goed ook al begin je vanaf nul.
hebben op school in het eerste jaar eens gestoeit met een max7000 en max2plus. was wel leuk en eigenlijk vrij handig.
vraag me ergens af of het relatief goed doenbaar is om een soft uart te maken.
Jochem
If you want to succeed, double your failure rate.
Op 2 oktober 2007 18:45:55 schreef ~Galaxy:
Heel even je topic kapen.
Vandaag mijn FPGA board binnengekregen. (van de sk-aktie)
Nu kan ik nergens de link meer vinden waar de pdf'jes met componentopstellingen en schema's staan.
Wie kan mij aan de link helpen, of de pdf jes in mijn postbakkie dumpen?
Het probleem waar we allemaal eigenlijk mee zitten: Xantus is zoek zegmaar... en z'n informatievoorziening ook... Ik zag gisteravond wel dat de site weer online was, maar daar stonden toen nog geen soldeerhandleidingen enzo op. Wel een BOM.
Op 4 oktober 2007 10:54:11 schreef Jochem_S:
[...]
Het probleem waar we allemaal eigenlijk mee zitten: Xantus is zoek zegmaar... en z'n informatievoorziening ook... Ik zag gisteravond wel dat de site weer online was, maar daar stonden toen nog geen soldeerhandleidingen enzo op. Wel een BOM.
Zodra mijn pakje aangekomen is kan ik vrij snel starten met bestukken en testen. De resultaten kan ik dan heel snel online plaatsen. Binnen enkele dagen zullen we ook een beter overzicht krijgen wie wat allemaal ontvangen heeft en de problemen trachten op te lossen. Ik denk niet een echte soldeer handleiding nodig te hebben, als de beloofde chips maar gesoldeerd op de print zitten.
Maar voorlopig is het nog even wachten, post komt hier rond 13H00 anders is het weer uitkijken voor morgen.
update:
Pakket is perfect aangekomen. Een voorlopige inspectie geeft aan dat alles geleverd is zoals verwacht, de beloofde ic's zijn gesoldeerd, de oude printjes zijn bijgeleverd, het 4.3" lcd ziet er goed uit.
Samengevat: alles blijkt zoals beloofd, nu klaar maken om de eerste print te bestukken.
[Bericht gewijzigd door fotoopa op (15%)]