CPLD-FPGA eenvoudige voorbeelden.

Stilaan komt de hardware beschikbaar. Straks zullen er heel wat startersvragen komen om kleine voorbeelden. Daarom deze nieuwe topic met de bedoeling dat zoveel mogelijk eenvoudige voorbeeldjes inkomen. Liefst geteste en werkende versie's zodat een starter niet meteen een hoop problemen ondervindt.

Hier een eerste voorbeeldje:

http://users.skynet.be/fotoopa/fpga/vb1.png

Nodige:
- een rotary encodertje. ( met 2 pullup weerstandje 10K naar VCC)
- 8 leds met ieder een serie weerstandje vb 330 ohm.
- een FPGA of CPLD met een clock vb 50 Mhz.

Het programma kan hier gedownload worden

Functie:

Een 8 bit binaire up/down teller wordt gestuurd door een rotary encoder. Het resultaat wordt als een binaire aanduiding op de 8 leds gebracht.

Code:

code:


module encoder
	(
    input            clk_50,         // 50 MHz clock op MAX II board
    output reg [7:0] led_max,        // leds         op MAX II board
    input            encoder_A,      // rotary encoder A kanaal
    input            encoder_B       // rotary encoder B kanaal
	);
reg [15:0]  prescaler;               // 50 MHz mag gerust gedeeld worden
reg [2:0]   encoder_A_reg;           // synchronisatie A kanaal
reg [2:0]   encoder_B_reg;           // synchronisatie B kanaal
reg         enc_ena;                 // actief bij een flankwissel van A of B
reg         richting2;               // draairichting encoder
wire        clk_enc;                 // draadje reserveren voor clk_enc
assign      clk_enc = prescaler[15]; // toekennen clk_enc draadje

always @ (posedge clk_50)            // delen van de clock door 65536
begin
 prescaler <= prescaler + 1;
end

always @(posedge clk_enc)
begin
 encoder_A_reg <= {encoder_A_reg[1:0], encoder_A};  // rotary encoder_A doorschuiven
 encoder_B_reg <= {encoder_B_reg[1:0], encoder_B};  // rotary encoder_B doorschuiven
 enc_ena       <= encoder_A_reg[1] ^ encoder_A_reg[2] ^ encoder_B_reg[1] ^ encoder_B_reg[2];
 richting2     <= encoder_A_reg[1] ^ encoder_B_reg[2];
  if(enc_ena)
   begin 
    if (richting2)
     led_max <= led_max +1;
    else 
     led_max <= led_max -1;
   end
end
endmodule

Er is hierbij een 50 Mhz xtal gebruikt omdat dit standaard op mijn modules zit. Maar dit mag om het even welke waarde zijn. De prescaler is gebruikt om die hoge sample frequentie wat te verlagen maar speeld wening rol hoeveel.

Bij mij zijn er 32 LE's nodig, waarvan de helft voor de prescaler. Ik ben een absolute fan om meestal de ingangen eerst te synchroniseren op een clock. Hierdoor heb je zuivere verwerkings signalen die duidelijke setup tijden garanderen voor de verdere verwerking.

Zoals je ziet zijn er heel snel wat LE's nodig. Vandaar dat de kleine oudere CPLD's met vb 72 LE's maar heel kleine toepassingen aan kunnen. Zodra we wat verder verschillende pwm's gaan gebruiken kom je daar niet meer mee toe. Zo heeft een RC5 dekoder ook algauw een kleine 80 LE's nodig en een 2x16 character LCD display zit ook al gauw boven de 100 LE's. Je moet toch ook de registers voorzien om bepaalde resultaten weer te geven.

Voor degenen die Quartus gebruiken, gewoon de code nemen en opslaan in een nieuwe map vb: encoder.
daarin dit klein programma opslaan onder de naam encoder.v
Met de Quartus wizard een nieuw project aanmaken met als werkdirectory de map encoder en als projectnaam ook encoder.

Via file open het programma encoder.v laden.
Via de toets CTRL L alles compileren.
Pinout en device kunt je ingeven volgens je type hardware. heb je nog niets dan zal de compiler wel zelf iets kiezen. Voor hem maakt het weinig uit.

even voor een leek die er mee gaat stoeien als ik alles heb:
Waar geef je in de software aan welk pinnetje je waar voor gebruikt?

Of is mijn beredenatie niet juist dat ik zeg dat er ergens tegen de CPLD verteld moet worden hoe de configuratie is?

IF you can't convince them, then confuse them!

Op 5 september 2007 14:47:04 schreef Jeroen Boere:
even voor een leek die er mee gaat stoeien als ik alles heb:
Waar geef je in de software aan welk pinnetje je waar voor gebruikt?

Of is mijn beredenatie niet juist dat ik zeg dat er ergens tegen de CPLD verteld moet worden hoe de configuratie is?

Ja idd, die pinnen worden ingegeven binnen in Quartus via de functie pins in het menu. Daar bekom je een lijst van de gebruikte pinnen en kun je door aan te klikken de gewenste pin kiezen uit een uitschuif lijst. Hetzelfde voor het kiezen van een device via de functie device in het menu.

Eenmaal deze bewerking gedaan moet je het niet meer herhalen voor dezelfde hardware. Voor een groep gebruikers die dezelfde hardware gebruiken kun je een gepaste file mee geven zodat nieuwe gebruikers dit niet zelf hoeven in te geven.

Geef je zelf niets in en was er ook niet vooraf ingegeven dan selecteerd quartus een device die hem past en kent zelf de pinnen toe.

mooi dat het in het forum staat zodat veel mensen kunnen vragen, maar is het niet handig om dit ook bij de artikelen te plaatsen? en dat aan te vullen met nieuwe pagina's?

Every machine is a smoke machine if you operate it wrong enough

@MAH: ik zit er inderdaad aan te denken om dat te doen.
Maar dan moeten het wel afgeronde en werkende zijn, waarbij een discussie over is geweest.

hoe precies dit in een vat gegoten zal gaan worden ben ik nog over aan het denken!

IF you can't convince them, then confuse them!

Een volgende variante toepassing is het aansturen van een led via een pwm regeling. Er wordt terug dezelfde encoder gebruikt om de helderheid van de led in te stellen tussen 0 en 255. De hardware is voorzien dat de encoder stopt bij het bereiken van de 0 als minimum waarde en 255 als max waarde zodat hij niet overspringt van off naar on en omgekeerd.

Hierbij het blokschema:

http://users.skynet.be/fotoopa/fpga/pwm_led.png

Het volledig programma kan hier gedownload worden. Om wat ruimte te besparen ga ik het niet volledige hier weergeven.

Merkop dat beide programma's getest zijn en lopen op mijn MAX II nano boardje. Het geheel gebruikt hiervoor 47 LE's vertrekkende vanaf het 50 Mhz xtall.

Als je dit test zal je zien dat de led regeling nogal traag verloopt. Dit komt door de 8 bits resolutie waardoor 255 stappen nodig zijn. je zal ook opmerken dat een linaire regeling niet de ideale regeling is voor ons oog. Dimmen moet eigenljk via een aangepaste tabel verlopen zodat ons oog een meer linaire regeling waarneemt. Dit kunnen we later wel als voorbeeld geven.

Volgend voorbeeld zal dan een RGB led zijn met 3 pwm's en een aantal modes om de kleur gradienten te kunnen instellen. Ik moet ze nog eerst maken.

free_electron

Silicon Member

2 woorden over de pindefinieties. er zijn verschillende wegen die naar rome leiden.

een heel leuk ding is de pin-planner. je krijgt dan effectief het component te zien. kan op ene pinnetje klikken en daar dan alle parameters van instellen.

ik doe het echter meestal zo :

maak van gans je design een block file aan ( File - create block/symbol )
maak een schema file aan. Zet dat schema als je toplevel.
plaatd al je pinnen ( input output of bidirs ) en geef die dingen een naam.
plaats je gecreerde block. ( het zit helemaal bovenaan in je component browser onder de entry 'project' )

verbind de boel.

save en compileer. ( gewoon dummy compilatie. kwestie om de pinlijst in orde te zetten )

ga naar de pin planner.
je krijgt daar al je signalen te zien die op dat topschema staan.
en dan is het signaal aanklikken : pinnetje klikken . enzovoort. heel leuk om je pcb layout te doen. je ziet effectief wie er waar komt. en je kan dat ook afprinten. maakt het leven makkelijk.

al die informatie die je daar invult komt automatisch ook op dat toplevel schema te staan

Professioneel ElectronenTemmer - siliconvalleygarage.com - De voltooid verleden tijd van 'halfgeleider' is 'zand' ... US 8,032,693 / US 7,714,746 / US 7,355,303 / US 7,098,557 / US 6,762,632 / EP 1804159 - Real programmers write Hex into ROM

@fotoopa: erg mooi allemaal! heb je toevallig ook een voorbeeld om snel serieel data ergens vandaan te halen?

IF you can't convince them, then confuse them!

en zijn er ook ergens liberary's te downloaden voor bijvoorbeeld i2c/usb/serieële/can/tcp/ip protocollen?

of zitten die in gebakken in qaurtus

niet met me uitspraken(of opmerkingen) eens mail me.K8048 guide
free_electron

Silicon Member

Ik zou er ook willen op hameren om de verilog 2001 syntax te gebruiken. Het maakt het leven makkelijker ( zeker voor beginners ). Kk zie dat fotoopa het goede voorbeeld geeft.

er is wel nog iets wat aangepast kan worden

dit is niet meer nodig in V2001:

code:


wire        clk_enc;                 // draadje reserveren voor clk_enc
assign      clk_enc = prescaler[15]; // toekennen clk_enc draadje

De assign alleen is voldoende. de compiler zit dat clk_enc

tevens wil ik een **warning** meegeven. let VERSCHRIKKELIJK goed op met de namen van de signalen.
Een tikfout en de boel werkt niet. soms met rare fenomenen.

stel je doet het volgende
assign clk_enc .. tralala

Later schrijf je ergens clkenc in plaats van clk_enc...
en dat compileert perfect ! De compiler trekt zich daar niks van aan. Hij creert doodleuk een signaal clkenc. Later ziet hij dat dat nergens aan hangt, knoopt het aan grond en doet minimalisatie .....

Je moet ALTIJD het compilatie rapport lezen.
Als je daar bij de warnings ( blauwe tekst : je kan die uitfilteren op de tabjes onderaan ) ziet staan 'inputs stuck at ground' ..... bingo.

Nog iets wat belangrijk is voor zowel verilog als vhdl. Er is een hemelsbreed verschil tussen 'Verilog' of 'VHDL' en 'Verilog voor synthese' of 'VHDL voor synthese'.

Heel veel zaken die je in Verilog of VHDL perfect kan schrijven zijn onsynthetiseerbaar in logica ! Let daar geweldig mee op. Er zijn stapels boeken over beide talen die uitgaan van de taal als Modelleertaal... 95 % van de voorbeelden in die boek zijn niet synthetiseerbaar. zowel Verilog als VHDL zijn ontwikkeld om systemen te modelleren. Later is men daar dan sytnhese gaan aan vastkleven.

Er zijn 2 heel goede boeken.

Verilog HDL van Samir Palnitkar. Zorg dat je second edition hebt. Die is V2001 ( ook 1364-2001 genoemd. verilog is IEEE standaard 1364 ... ) compliant.

Samir is een ontwerper van Sun. en het boek heeft de zegen van Parbhu Goel die de 'vader' is van verilog.

een ander goed boek is 'Verilog HDL synthesis : a practical primer' van J.Bhasker. das een man van Bell labs die de eerste verilog synthesiszer gemaakt heeft. ( Archsyn ) en de chariman van de verilog interoperability group.
hij heeft ook een ander boek ' A verilog HDL primer' dat is de volledige verilog taal. Voor wat je met fpga's gaat doen (synthese van logica) is dat niet goed. Voor modelleren dan weer wel. Maar nog eens: niet alles wat je kan modeleren is synthetiseerbaar. En dat geldt ook voor VHDL.

Tik in quartus aan dat je de 2001 syntax gebruikt ( zit onder options ) ik dacht dat het de default is nu )

Professioneel ElectronenTemmer - siliconvalleygarage.com - De voltooid verleden tijd van 'halfgeleider' is 'zand' ... US 8,032,693 / US 7,714,746 / US 7,355,303 / US 7,098,557 / US 6,762,632 / EP 1804159 - Real programmers write Hex into ROM
free_electron

Silicon Member

Op 5 september 2007 16:38:49 schreef timmie:
en zijn er ook ergens liberary's te downloaden voor bijvoorbeeld i2c/usb/serieële/can/tcp/ip protocollen?

of zitten die in gebakken in qaurtus

opencores. www.opencores.org

Nog iets : in quartus kan je perfect Verilog / VHDL mixen met elkaar. Je kan een stuk als schema maken , een blok als Verilog , een ander blok als VHDL en ng een ander stuk desnoods in AHDL. maakt allemaal niks uit. De synthesizer in quartus klopt dat allemaal plat naar een immense netlist en minimaliseert die dan uit.

Professioneel ElectronenTemmer - siliconvalleygarage.com - De voltooid verleden tijd van 'halfgeleider' is 'zand' ... US 8,032,693 / US 7,714,746 / US 7,355,303 / US 7,098,557 / US 6,762,632 / EP 1804159 - Real programmers write Hex into ROM

Op 5 september 2007 16:40:59 schreef free_electron:
wel nog iets wat aangepast kan worden

dit is niet meer nodig in V2001:

code:


wire        clk_enc;                 // draadje reserveren voor clk_enc
assign      clk_enc = prescaler[15]; // toekennen clk_enc draadje

De assign alleen is voldoende. de compiler zit dat clk_enc

Hé, weer iets. Kijk zo leer je tenminste bij! Bedankt voor de tip!
Ik tracht zo snel mogelijk al deze kleine zaken mee te nemen.

Ja ook al die blauwe lijntjes in het rapport lees ik zorgvuldig want daar kun je heel veel leed mee sparen. Een goede aanduiding is ook om je aantal LE's in de gaten te houden. Gaan die soms plots omlaag, het zal wel ergens iets zijn dat hij vereenvoudigd heeft omdat er geen correct signaal voor de functie gebruikt wordt.

pwm_led.v voor downloading is nu reeds aangepast!

free_electron

Silicon Member

-edit- paar 'tikfauten' verbeterd.

hier is een PWM generatortje :

code:


module PWM_gen (input clock,
                input [7:0] data,
                input write,
                output pulse
                );

reg [7:0] cntr;       // een variabele voor de 8 bit teller
reg [7:0] pwm_point;  // een variabele voor het pwm punt

// als er geschreven wordt : stockeer de data in het pwm punt.
always @(posedge write) pwm_point <=data;
always @(posedge clock) cntr <= cntr +1;
assign pulse = (cntr > pwm_point) 
endmodule

als je geen intern geheugen wilt gebruiken kan het nog eenvoudiger

code:


module PWM_gen (input clock,
                input [7:0] pwm_point,
                output pulse
                );

reg [7:0] cntr;       // een variabele voor de 8 bit teller

always @(posedge clock) cntr <= cntr +1;
assign pulse =(cntr > pwm_point);

endmodule
Professioneel ElectronenTemmer - siliconvalleygarage.com - De voltooid verleden tijd van 'halfgeleider' is 'zand' ... US 8,032,693 / US 7,714,746 / US 7,355,303 / US 7,098,557 / US 6,762,632 / EP 1804159 - Real programmers write Hex into ROM
free_electron

Silicon Member

nog een blokje ; een 7 segment decodertje wat 0..9 en ook ABCDEF laat zien ( dus ene full hex decoder )
je kan aangeven of je een common anode of een common cathede gebruikt.... voor CA zet je ca_cc op 1 . voor CC zet je ca_cc op 0...

code:


module display_7hex (input [3:0] data,
                     input ca_cc,
                     output wire seg_a,
                     output wire seg_b,
                     output wire seg_c,
                     output wire seg_d,
                     output wire seg_e,
                     output wire seg_f,
                     output wire seg_g );

reg  [6:0] segment_out;
reg  [6:0] segment;
assign  {seg_g,seg_f,seg_e,seg_d,seg_c,seg_b,seg_a} = segment_out[6:0];

always begin
  if (ca_cc==1) segment_out = ~segment ; else segment_out = segment;
  case (data)
   //  DCBA             GFEDCBA            
   4'b 0000 : segment = 0111111;
   4'b 0001 : segment = 0000110;
   4'b 0010 : segment = 1011011;
   4'b 0011 : segment = 1001111;
   4'b 0100 : segment = 1100110;
   4'b 0101 : segment = 1101101;
   4'b 0110 : segment = 1111101;
   4'b 0111 : segment = 0000111;
   4'b 1000 : segment = 1111111;
   4'b 1001 : segment = 1101111;
   4'b 1010 : segment = 1110111;
   4'b 1011 : segment = 1111100;
   4'b 1100 : segment = 1011000;
   4'b 1101 : segment = 1011110;
   4'b 1110 : segment = 1111001;
   4'b 1111 : segment = 1110001;
  endcase
end
endmodule

[Bericht gewijzigd door free_electron op donderdag 6 september 2007 03:27:07 (71%)

Professioneel ElectronenTemmer - siliconvalleygarage.com - De voltooid verleden tijd van 'halfgeleider' is 'zand' ... US 8,032,693 / US 7,714,746 / US 7,355,303 / US 7,098,557 / US 6,762,632 / EP 1804159 - Real programmers write Hex into ROM

@free_electron,

Je schrijft veel te snel..... vandaar heel wat syntax fouten en vooral voor beginners is dit heel, verwarrend.

Ik heb je eerste voorbeeldje gecompileerd maar dat ging dus niet. Na wat verbeteren deze versie die wel compileerd:

code:

module PWM_gen (
  input       clock,
  input [7:0] data,
  input write,
  output reg pulse
  );

reg [7:0] cntr;       // een variabele voor de 8 bit teller
reg [7:0] pwm_point;  // een variabele voor het pwm punt
// als er geschreven wordt : stockeer de data in het pwm punt.
always @(posedge write) 
 pwm_point <=data;

always @(posedge clock) 
begin
   cntr <= cntr +1;
   if (cntr >= pwm_point) pulse = 1; else pulse =0;
end

endmodule

Wat ik niet begrijp is dat zonder een reg te maken van de pulse outputlijn het niet compileerd. Waarom???

free_electron

Silicon Member

damned!. ik was vertrokken van een register als pulse output. maar om een flipflop te sparen was ik dat later gaan veranderen in een comparator. maar de comparator moet buiten de clock module staan.

-zucht. tis mijne dag nie vandaag ..

code:


module PWM_gen (
  input       clock,
  input [7:0] data,
  input write,
  output  pulse
  );

reg [7:0] cntr;       // een variabele voor de 8 bit teller
reg [7:0] pwm_point;  // een variabele voor het pwm punt
// als er geschreven wordt : stockeer de data in het pwm punt.
always @(posedge write)  pwm_point <=data;
always @(posedge clock)  cntr <= cntr +1;
assign pulse = (cntr > pwm_point); // >= genereert glitches !! let daar mee op.
endmodule
Professioneel ElectronenTemmer - siliconvalleygarage.com - De voltooid verleden tijd van 'halfgeleider' is 'zand' ... US 8,032,693 / US 7,714,746 / US 7,355,303 / US 7,098,557 / US 6,762,632 / EP 1804159 - Real programmers write Hex into ROM

Oké, bedankt! Nu compileerd het tenminste.

Juist door verschillende voorbeelden te bekijken ga je sneller en efficienter gaan schrijven.

Eigenlijk wachten we allang op je beloofde boek, maar het vergt allemaal zoveel tijd. Vooral nu dat er in de volgende maanden toch heel wat nieuwe gebruikers hun intrede gaan doen zou het goed vanpas komen.

Ik denk ook dat het uit den boze is om bij CPLD/FPGA chips te zoeken naar absolute minimum aantal gebruikte flipflops. Immers door asynchroon te werken krijg je idd heel veel glitches. In de meeste gevallen heb je ruim voldoende LE's om "zuivere" hardware te maken. Trouwens lange asynchrone wosten laten zich minder goed fitten en hebben langere looptijden.

[Bericht gewijzigd door fotoopa op woensdag 5 september 2007 19:07:52 (34%)

Op 5 september 2007 16:40:59 schreef free_electron:
tevens wil ik een **warning** meegeven. let VERSCHRIKKELIJK goed op met de namen van de signalen.
Een tikfout en de boel werkt niet. soms met rare fenomenen.

Ik had het in een ander topic al gepost, maar volgens mij kun je een error afdwingen door

code:

`default_nettype none

statement in je file te zetten. Gewoon bovenin. Je zou het even moeten proberen of het exact in jouw voorbeeld ook goed gaat (of fout gaat, wat je wilt).

[Bericht gewijzigd door flipflop op woensdag 5 september 2007 20:26:57 (11%)

"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein

Ik heb juist vernomen dat er 3 CO gebruikers zijn bijgekomen die ook het MAX II nano boardje binnen hebben. Hierbij weer een heel eenvoudige toepassing van een topic die onlangs voorbij kwam over "piano toets"

Opdracht was:

4 ledjes
4 drukknoppen

Bij het opstarten moet altijd het eerste ledje aanstaan
Bij het indrukken van een drukknopje moet het overeenkomende lampje branden ook als men het drukknopje lost, een willekeurige volgorde van indrukken moet kunnen.

Hierbij de oplossing voor de CPLD:

code:


module piano_toetsen
	(
	input 		   CLOCK_50,
	input	    [3:0]  KEY,
	output	reg [3:0]  LED
	);

reg	[3:0]	keyreg;
reg	[3:0]	reset_cnt;
reg 	[9:0]	prescaler;
reg		key_clk;

always @ (posedge CLOCK_50)
begin
  prescaler <= prescaler+1;
  key_clk <= prescaler[9];
end

always @ (posedge key_clk)
begin
  keyreg[3:0] <= KEY[3:0];
  if (reset_cnt!=15) 
    begin
      reset_cnt <= reset_cnt+1;
      LED <= 4'b1110;   	         // bij reset       --> led1 aan, andere uit
    end
if (!KEY[0] & keyreg[0]) LED <= 4'b1110; // indrukken knop1 --> led1 aan, andere uit
if (!KEY[1] & keyreg[1]) LED <= 4'b1101; // indrukken knop2 --> led2 aan, andere uit
if (!KEY[2] & keyreg[2]) LED <= 4'b1011; // indrukken knop3 --> led3 aan, andere uit
if (!KEY[3] & keyreg[3]) LED <= 4'b0111; // indrukken knop4 --> led4 aan, andere uit
end
endmodule

Nog even enkele tips:

Het is nodig om de juiste pinnen vast te leggen voor de gebruikte I/O pinnen. Dit kan heel eenvoudig na de compilatie door het menu assignments -> pins te selecteren
dan bekom je een lijst met I/O pinnen die gebruikt zijn in je toepassing. zoals op deze foto:

http://users.skynet.be/fotoopa/fpga/piano_pinout.png

Als die pinnen nog niet toegekent zijn of moeten gewijzigd worden kun je op de "location" row in de gewenste lijn dubbelklikken. Dan bekom je een scrollijst waar je via de muisknop in kunt scrollen tot je de gewenste pin ziet.
Zo is voor de CLOCK_50 de pin "PIN_J6" toegekent die overeenkomt met de hardware.

Het programmeren gebeurt via de USB connectie van het boardje. Na compilatie komt normaal automatisch de .pof file in de programmerlijst. Vergeet niet eerst je USB connectie met het boardje te maken voor je de programmer opstart zodat hij de USB connectie ziet.
Omdat de EPM2210 ook interne flash bezit kun je die afzonderlijk aanvinken in de programmer. Maar je moet weten dat het niet de bedoeling is om telkens die flash te herprogrammeren gezien zijn gegarandeerde limiet van 100 maal. daarom moet je zorgen dat dit niet aangevinkt staat in de programmer als je hem echt niet nodig hebt of als hij niet moet gewijzigd worden. zie de foto:

http://users.skynet.be/fotoopa/fpga/piano_pof.png

Dus .pof file aanvinken
CFM afvinken
UFM afvinken

Straks maak ik een tekening hoe ik de expantie headers heb aangesloten op het nano boardje. Dit om een 4x4 matrix keyboardje aan te sluiten, een LCD 2x16 character display, 2 rotary encoders, 4 extra drukknoppen en 4 extra schakelaars. Ik zal de juiste pinouts dan geven. Ook de volledige code om alles aan te sturen maak ik klaar om online te plaatsen. Die toepassing neemt iets boven de 300 LE's in beslag. Maar geen nood, er zijn er 2210 LE's in de CPLD en eens dat je een basis hebt komen ze dan zo snel niet meer bij.

free_electron

Silicon Member

100 maal ? 10.000 maal zeker ?

Professioneel ElectronenTemmer - siliconvalleygarage.com - De voltooid verleden tijd van 'halfgeleider' is 'zand' ... US 8,032,693 / US 7,714,746 / US 7,355,303 / US 7,098,557 / US 6,762,632 / EP 1804159 - Real programmers write Hex into ROM

Helaas..
http://img409.imageshack.us/img409/6916/maxiizx9.png

Het verbaasde mij ook, ik heb al eens eerder in een post gevraagd waarom dit zo laag is.

Overigens heb ik volgens mij MAX II's wel vaker geprogrammeerd, ik vermoed niet dat het snel een probleem wordt.

[Bericht gewijzigd door madwizard op donderdag 6 september 2007 16:10:00 (26%)

Op 6 september 2007 09:23:27 schreef fotoopa:
Ik heb juist vernomen dat er 3 CO gebruikers zijn bijgekomen die ook het MAX II nano boardje binnen hebben.

Als het goed is heb ik hem morgen binnen. :D

En dan sinds een jaar of 10 weer eens met altera's aanm de slag. Heb tijdens mijn afstudeerproject een hoop gedaan met AHDL. Nu weer eens beginnen in het hobby circuit. In mijn huidige werk doe ik niet zoveel met ontwikkelen van apparatuur.

meten is weten, weten is meten, maar hoe kan je weten wat je allemaal moet meten en weten.

@fotoopa:

De reset van de 4 ledjes komt mij een beetje omslachtig over.
Nu weet ik niet zeker of dit mogelijk met een CPLD icm verilog, maar voor een FPGA met VHDL kun je dat hele reset gebeuren weglaten en gewoon een opstart waarde opgeven bij de declaratie. Bij inladen van de FPGA wordt deze waarde altijd geprogrammeerd in de flipflops:

signal LED : STD_LOGIC_VECTOR(3 downto 0) := "1110";

Is iets dergelijks niet mogelijk voor jouw code? dat scheelt namelijk weer in complexiteit en resources.

Hierbij een meer komplete versie met uitbereiding via de pinheaders op de nano board.

De originele nano board zie er zo uit:

http://www.pbase.com/fotoopa/image/83995703/original.jpg

Op de 2 bovenste rijen heb ik 2x20 pinheaders gesoldeerd aan de bovenzjde van de print. Daar kan een 40 polige flatkabel opgeplugd worden die naar je eigen I/O gaat als uitbereiding. Deze kabel aansluiting is compatiebel met alle boards van Terasic. Ik had reeds een frontpanneel gemaakt voor mijn DE1 board waardoor ik zo direct dit panneel kon aansluiten. Dit is te zien op de volgende foto:

http://www.pbase.com/fotoopa/image/84785218/original.jpg

Ik heb nu een voorbeeld applicatie geschreven die de meeste delen van dit frontpanneel gebruikt. Het volledige programma kan je hier downloaden .
Het programma stuurt het 2x16 character display, zorgt voor een ingave via het 4x4 keypad en zet de resultaten op het display.

Er zijn 4 registers voorzien waar je getallen kunt ingeven in een vast formaat xxx.x De input routine start met ingaves voor de punt waarbij hij automatisch de digits naar links shift. Voer je meer dan 3 digits in dan gaat de eerste er links uit en verdwijnt. Wil je ingaves na de punt dan druk je op * en de ingave gaat verder waarbij de digits na de punt naar recht doorschuiven. Een clear functie gebeurt door op het # te drukken en wegschreven van de resultaten gaat via druk op de A, B, C of D toets en wordt in de overeenkomende register opgeslagen. De display toont 2 resultaten gelijktijdig op de inputbuffer, de andere registers kun je oproepen door de schakelaar in de juiste positie te plaasten. De tekst van de register wordt eveneens aangepast. Ook komt de tekst "fotoopa" op het display.

De beide rotary encoders zijn ook aangesloten en hun status komt op de eerste 4 leds op de nano board.

De 4 andere leds op de nano board worden gestuurd door op de 4 knopjes te drukken op de board zelf.

De layout hoe de extentie connector is aangesloten zie je hier:

http://users.skynet.be/fotoopa/fpga/lcd_header.png

Gezien er heel weinig verbruik is wordt voorlopig alles vanuit de USB lijn van de PC gevoed en hoef je geen extra voeding te gebruiken. Mijn LCD display staat op 5V aangesloten en er zitten kleine serie weerstandje in ter beveiliging. De RW pin van de LCD ligt aan de GND zodat die nooit zelf kan terugsturen naar de nano board. Mocht dit toch voorkomen dan zorgen de serie weerstandjes van 220 ohm ervoor dat de spanning op de I/O pinnen binnen de toegelaten waarden gehouden wordt.

@KillerB the Supreme,
Ik kan je niet direct antwoorden, maar F_E ( of andere Altera gebruikers) zullen dat wel weten en dan horen we het wel. Default staan de flipflops altijd laag bij powerup maar je moet ze wel ergens in de andere toestand kunnen zetten. Maar doorgaans gebruik ik een globale reset routine die altijd doorlopen wordt en waar alle delen aan verbonden worden die eventueel een reset toch nodig hebben. Ik heb wel de gewoonte zelden naar minimale LE's te gaan kijken omdat je dit niet veel voor heb dat je in de problemen komt. Maar vroeger met de kleine devices was dit idd wel een probleem, denk maar aan de 64 of 72 LE's devices, daar moet je er niet veel mee gooien of alles is opgebruikt.

@jovak,
Prima dat je ook straks je boardje zult ontvangen. Je zult snel ondervinden wat een luxe het is om zoveel LE's ter beschikking te hebben. Ook de manier van werken met de USB programmer onboard is super. Een ontwikkeling gaat razend snel op deze manier!.

Op 6 september 2007 16:08:53 schreef madwizard:
Overigens heb ik volgens mij MAX II's wel vaker geprogrammeerd, ik vermoed niet dat het snel een probleem wordt.

Ik veronderstel dat je het hebt over de CFM, UFM blokken. Want de CPLD zelf mag je zoveel als je wilt herprogrammeren, daar staat niet zozeer een limiet op of die is heel hoog. Het gaat hem enkel over die interne flash zelf en de configuratie blok die zorgt voor de interface met je CPLD. Maar zo zal je het wel gebruikt hebben.

Trouwens die 100 is een gegarendeerde waarde, de praktische zal wel veel hoger liggen.

[Bericht gewijzigd door fotoopa op donderdag 6 september 2007 17:36:28 (25%)