Tag Archives: FPGA

Žaidimas su FPGA dev board

Kažkas įsigijau pačio pirmo ciklono (EP1C20F400c7) FPGA plokštę (Nios edition). Kiek žaidžiau su Nios, bet ten visokios licenzijavimo problemos. O kita problema- mažai dokumentacijos ir dar softą kažkur pamečiau. Beja, internete informacijos apie šią pirmąją plokštę mažokai- labai ji sena.
Tačiau senas dev boardas turi ir pliusų- dalis jungčių toleruoja 5V logiką. Kaip tik pajunginėti prie mano kolekcijinių kompiuterių.

Daug metų ji kažkur gulėjo ir nesenai ją radau. Nutariau pažaisti, nes FPGA tai kaip virtualus konstruktorius- nereikia nieko lituoti, o visokias schemas galima bandyti. Ir nutariau patikrinti savadarbio Z80 emuliatoriaus darbą- man kažko neveikia Altair Basic. Tiksliau veikia, bet bėdos su matematika. O ant FPGA galima paleisti Z80 ir palyginti rezultatus.

Altair Basic
Nu ir va, Basic vistiek blogai veikia. Kame bėda. Pabandžiau perjungti Veriloge Z80 į Intelio režimą, tačiau BASIC vistiek blogai veikia.
Neaišku kur bėda. Ant tikro hardwaro paleidinėti nenoriu.

Va kaip atrodo ta plokštė:
Cyclone 1 NIOS edition dev board

Pats Altair projektas Quartus archyvo formoje.

O kadangi aš nemėgstu visos schemos “sujunginėti” teksto formoje, va kokis yra “top level” failas- grafinė schema:Altair 8800 Basic UART FPGA top schema.

HDMI (DVI) Testeris arba mano pirma ketursluoksnė

Buvo nuo senų laikų prikaupto Cikloninio šroto. Viena bėda- BGA korpusas. Tačiau laikai keičiasi, ketursluoksnės PCB jau pigios ir iš garažo buvo ištrauktos mikroshemos. Plokštė gavosi su viena rimta klaida, bet šiaip viskas veikia. Reikia pagirti Alteros mikroschemos tvirtumą. Ji buvo lituota fabrike, poto aš nulupau. Poto bandžiau reballinti, poto dar bandžiau, poto dar bandžiau. Poto prilitavau, bet ne iki galo. Poto dar kaitinau ir tapšnojau, kad rutuliukai susijungtu su PCB. Ir mikroschema išlaikė šiuos išbandymus.
Šis ciklonas turi PLL ir turi LVDS išėjimus. Kaip tik išbandyti HDMI (DVI) interfeisui:
HDMI test generator on single FPGA chip
Čia mano kiniško monitoriaus ekrano nuotrauka. Signalas eina tiesiai per HDMI iš FPGA. Matosi viena problema- eilutėje su vertikaliais brūkšneliais, pats kairinis turi būti irgi dryžuotas. Dabar neaišku, ar čia kaltas mano projektas arba visdėlto kiniškas upscaller. Mano “generatorius” išduoda VGA (640×480@60Hz, 25MHz pixel clock) vaizdą, o kiniškas žaislinis monitorius lygtai FullHD.
Continue reading →

ZX LCD

Besitvarkant daiktus (čia retas reiškinys), radau savo seną eksperimentą su FPGA/CPLD ir LCD (tik ekranas jau buvo kitas). Tas eksperimentas buvo nedabaigtas dėl žinių, noro ir kantrybės stokos. Dabar visko kiek daugiau, tai nudraskiau nereikalingas detales ir pridėjau naujų:
ZX Spectrum in CPLD LCD mode
Tai labai panaši sistema kaip ir paprastam ZX Spectrum CPLD/VGA. Tik pasikeitė keletas esminių koncepcijų:
Senesnėje versijoje atmintis buvo bendra- procesorius ir VGA buferis naudojosi ta pačia atminties mikroschemą, todėl CPLD stengėsi atlikti atminties arbitro (MMU) darbą ir laiko rėžiais (time slot) prileisdavo tai CPU tai VGA prie tos pačios atminties. Ši schema kiek kitokia- pirmiausia, naudojama atskira atmintis procesoriui- Toshiba TC551001BPL-85. Tai žymiai lėtesnė atmintis, tačiau ji skirta tik procesoriui. VGA ar LCD kontroleris visiškai nesikreipia į ją. LCD/VGA kontroleris tik sėdi ant duomenų ir adreso linijų ir stebi jam reikiamas kombinacijas- jei pastebimas rašymas į video atminties plotą, duomenys dubliuojami ir LCD/VGA atmintyje. Taip pat stebim Z80 IN/OUT veiksmus, nes mums reikia vaizduoti pajungta klavietūrą, magnetofoną ir garsiakalbį.

ZX Spectrum in CPLD LCD mode
Tačiau tai vienspalvis LCD monitorius, 320 x 240 taškelių. Duomenys pumpuojami po 4 bitus iš karto, todėl sistemos dažnis netgi kiek lėtesnis. Tačiau labai lėtinti negalima, nes kažkur prie 40Hz kadrų dažnio labai matosi vaizdo mirgėjimas. Dabar LCD veikia virš 60Hz dažniu. Deja, jis labai inertiškas- “border” efektai susilieja…

ZX Spectrum in CPLD LCD mode
O judantys objektai beveik nesimato.

Aišku šiame variante visiškai ignoruojami spalvų atributai (“flash” veikia), todėl žaidimų vaizdeliai keistoki. O borderį padariau dryžuota, kad kiek nors skirtusi “spalvos”.

Šis antras maketas buvo surinktas ne dėl ZX spectrum. Aš galvoju čia sudėti kokį nors kitą retro kompiuterį, bet ZX yra vienas iš paprasčiausių, tai testavimui suėjo.
Schemotechnika visiškai paprasta- adresų šyna po stiprintuvo 2x SN74HCT541N (nelabai jis reikalingas) eina į CPLD, ROM, RAM. Tas pats, tik be buferio, padaryta su duomenų šyna. Viskas “sumontuota” CPLD mikroschemoje. Ten aišku tebeliko keletas klaidų, tačiau sistema veikia.

Ir aišku visi failai:
Intel-Altera Quartus CPLD source code for ZX Spectrum LCD version.

Jei jums nepasileido, tai atminkite, kad kai kurie Z80 CPU reikalauja, kad jų clock būtų 5Vpp, o ne TTL lygio.

LCD ekranas iš senoviško dauginimo aparato: EDMMPU3BDF, jo pinout:


1. ON/OFF
2. n.c.
3. VS
4. HS
5. pix CLK
6. Vcc, +5V
7. GND
8. Vee, -25V
9. D3, pixel data
10. D2
11. D1
12. D0
13. Vee, same as 8.
14. contrast.

ZX Spectrum sukištas į CPLD

Šiuo metu kiek tvarkau senų kompų kolekciją ir nutariau suremontuoti savo Santaką (baltik versija). Pirmiausia nurinkau visus laidus, pasilikau pliką PCB, atstačiau ROM čipus ir pajungiau. Aišku niekas neveikia. Todėl pradėjau nagrinėtis- pirmas stepas, nėra RESET signalo. Pašalinom rusišką mikroschemą К155ЛН1 nauja SN74LS04. Pradėjo veikti procesorius ir netgi bandė formuotis vaizdas. Bet jis dingo. Pastebėjau, kad dar kaista К555ИЕ10- kol šalta, signalai praeina. Poto pakaista ir signalai dingsta. Čia jau rankos kiek nusuleido- supratau, kad tarybinė kokybė man nepadės. PCB padaryta ant snarglių ir beveik negalima perlituoti. Net blogiau už kiniškas popierines PCB iš 1980-tųjų metų.

ZX Spectrum CPLD Altera
Užtenka tik ką nors pakaitinti ir takeliai atsiklijuoja.
Continue reading →

Commodore 6526/8520 kopija CPLD

Yra tokia deficitinė senoviška mikroschema- CIA (complex interface adapter) skirta 680x ir 68000 čipsetams – 6526 / 6526A ir 8520. Naudojo ir gamino šias mikroschemas Commodore (jos čipų gamykla MOS). Naudojami šie čipai Commodore 64, 128 ir Amiga serijos kompiuteriuose. Tikriausiai buvo naudojama ir plačiau, bet man nepapuolė plokštės, kurios turėtu šiuos čipus. Šie čipukai tai interfeisiniai, jie visaip programuojami ir paprastai bendrauja su periferija. O kadangi kojyčių apsauga pas senas mikroschemas labai silpna, tai šios mikroschemos miršta vienos iš pirmųjų. Kiek supaprastinta, 8520 versija užlenkė mano Amiga 500 netgi keliems metams.
Dabartiniais laikas šios mikroschemos nebegaminamos, tačiau jos tebemiršta. Ir jų kainą pradėjo kilti- dabar viena mikroschema kainuoja kažkur apie 25€ (be atsiuntimo ir mokesčių). O kompiuteriuose dažnai stovi po dvi. Man netgi susidarė nuomonė, kad apsimoka pirkti kai kuriuos senus kompus, lupti lauk čipus ir parduoti- kaip auto šrote. Palaidos detalės kainuoja daugau nei visas komplektas. O ir nusipirkti galima neveikiančia.

Todėl kilo iškreiptas projektas: Commodore 8526/8520 kopija CPLD. Jei viskas pavyks, tai galima mikroschemą emuliuoti ir greitesniu MCU. Bet kolkas buvo pasirinkta CPLD ir Altera Quartus 9. Kodėl? Todėl, kad aš turiu keleta CPLD suderinamu su 5V TTL lygiais ir softas nemokamas. Softas gana sudėtingas ir turi visokiausiu diagnostinių įrankių, o ir CPLD turi perteklinį kiekį kojelių, todėl galima išsivesti visokius vidinius registrus laukan ir tikrintis su osciloskopu.

Mano poros laisvų dienų darbo frontas atrodo taip:
Commodore CIA 6526/8520 CPLD-FPGA verilog copy
(Nuotrauka pasididina)
.
Continue reading →

FPGA:0003 – LEDai

Garsą jau turim, dabar biški vaizdo. Yra 3 LED ant tos plokštės sujungti per rezistorių prie Vcc. Pas mano plokštę jie pažymėti kaip D2, D4 ir D5. Aš čia prilitavau skirtingų spalvų LEDus: raudoną, žalią ir mėlyną. O kad dar krūčiau būtų, maitinimo pajungimo indikacijos LEDą D3 padariau baltos spalvos. 🙂

Su FPGA uždegti LEDą galima taip pat, kaip ir mikrokontroleryje- užtenka atitinkamą koją perjunti į žemę (nes LEDas į Vcc) ir LEDai dega. Tiesa jie dega ir dabar, nes nenaudojamos kojos užsiprogramuoja į žemę.
Jei norime, kad LEDas mirksėtu užtenka pagrindinį 50MHz clocką pasidalinti iki kelių hercų ir paduoti į LEDą. Ir jis mirksės.
Continue reading →

Raudonų šviesos diodų matrica

Čia straipsniukas tikriausiai ne apie kažkokią šviesos diodų matricą, bet labiau apie vieną iš technologijų kurią naudoju kai reikia padaryti “reverse engineering”.
Labai dažnai kokie nors senesni prietaisai ar šiuolaikinė Kiniška elektronika neturi jokios dokumentacijos. Matyt arba duomenys labai seni arba Kinai per savo bjaurų charakterį neviešina informacijos. Tačiau kartais norisi pasinaudoti esamais blokais, elementais ar prietaisais. Tačiau kaip? Informacijos nulis!
Pirmiausia apžiūrim ir nustatom kur yra žemė ir kur maitinimas. Pagal žinomas detales pabandom atspėti kiek voltų įtampos reikia paduoti. Visada naudojam kiek galima mažiau ir ribojam srovę. Vėliau bandom atspėti kur yra įėjimai, o kur išėjimai. O toliau prasideda mistika ir “метод научного тыка”.

Gyvas pavyzdys. “Berniukai” iš sandėlio parūpino kažkokią raudonų šviesos diodų matricų bloką. Jis atrodo taip, tiesa jis dar nešvietė. Tai 64 x 16 LED matrica iš Taito Corporation kažkokio žaidimų automato. Beja, ši firma sukūrė klasikinius Space Invaders. 🙂

Red LED matrix

Kiek pasinagrinėjus buvo nustatyta, kad visa matrica naudoja 5V matinimą. Tai buvo nustatyta pastebėjus, kad prie pagrindinių Vcc it GND laidų pajungta mikroschemos MC74HC04AN, AM26LS32, TD62C962 ir t.t. Jų maitinimų artimiausias standartinis bendras vardiklis- 5V.
Valdymas pajungtas prie jungties prie kurios prilituotos dvi 26LS32. Tai RS485 lygio keitikliai. Pagal PCB matosi, kad naudojami 8 laidininkai ir visi eina į matricą. Iš matricos signalų nerasta.
Bandant ieškoti Toshibos TD62C962LF mikroschemos aprašo nieko gero nerasta. Tik nustatyta, kad panašios mikroschemos naudojamos printerių termo galvom, keliems LED draiveriams. Bet nieko konkretaus.
Takelių treisinimas privedė, kad pora valdymo signalų eina tik į MC74HC161 (4-bit binary counter) ir MC74HC4514 (4-to-16 line decoder/demultiplexer) čipus. Tai kažkas panašaus į matricos eilučių skaitliuką ir dekoderį. Taip atsirado pradinė informacija. Tačiau likę 6 laidai sulindo į Tošibos krakajobą…

Toshiba TD62C962LF

O štai čia išlenda “reverse engineeringas” pagal “метод научного тыка”. Rusiškai nesuprantantiems ar tiems kurie nežino šio išsireiškimo: spaudžiojimas bet kur ir laukiant kažkokio rezultato.
Šiam reikalui galima pasinaudoti paprasčiausius perjungiklius (bent jau pradžiai). Tačiau žymiai įdomiau (ir paskutiniuose etapuose patogiau) pasinaudoti ką nors protingesnio. Tam tinka personalinis kompiuteris, mikrokontroleris arba CPLD/FPGA. Visi metodai turi savo pliusų ir minusų. Šiam konkrečiam projektui pasirinkau FPGA dev boardą, nes pirmiausia čia viskas sumontuota ir yra mygtukai, o antriausia- esamas softas labai galingas ir lankstus. Ypač padeda simuliacijos ir diagramų paišymas. Dar vienas FPGA pliusas, kad signalų greitis nėra ribojamas kompo ar MCU našumu. Čia dešimtys megahercų yra visiškas niekutis. Continue reading →

NiosII vs Atmega16

Vėl prisiminiau savo žaidimus su FPGA čipu. Prisiverčiau pasižaisti su virtualiu (softcore) procesorium. Juolab, kad Altera atidarė savo licenziją ir NiosIIe procesorių galima naudoti savo kūriniams nemokamai. NiosIIe procesorius tai 32 gyvis su galimybe prikomponuoti matematinį koprocesorių (FPU).
Procesorių nutariau sukišti į savo gamybos plokštę su minimaliu Cyclone II čipu (EP2C5T144). Kas įdomiausia, softas su programiškai padaryta slankiojo kablelio matematika netilpo į čipo vidinę atmintį, tačiau tilp FPU ir softas su koprocesoriaus panaudojimu :).
Kad palyginti procesoriaus greitį, panaudojau tą patį softą (C kalboje) tiek ant Atmega 16, tiek ir su NiosII procesorium. Štai jumi ir rezultatas:

Pagrindiniai parametrai:

  • ATMEGA16, veikianti 12MHz dažniu. Softas kompiliuotas su GNU C. Interfeisas su FPGA čipu per 4 duomenų bitus ir keliais kontroliniais laideliais. FPGA vidinis skaitliukas resetinamas su Atmega, vėliau paveiksliukas pumpuojamas po 4 bitus. (4 bitai, strobas, 4 bitai, strobas, FPGA padidina adresą, ir taip ratu).
  • NiosIIe, ekonominis, nemokamos licenzijos procesorius. Softas kogero irgi GNU C kompiliuojamas. Duomenų perdavimas kiek kitoks, nes viduje FPGA sujungti žymiai lengviau: 8 bitai duomenim, kelioliką bitų adresui. Kaip jau ninėjau- FPU, hardware floating point (sudėtis, atimtis ir daugyba). Procesorius veikia nuo 50MHz taktinio dažnio. Didesnio dažnio negalėjau panaudoti, nes FPGA neturi laisvo PLLo (PLLas naudojamas LVDS interfeisui).
  • NiosIIf, tas pats kaip ir NiosIIe, tik dabar “komercinė” versija, vadinama dar “fast”. Matosi, kad kiek greitesnė. Tačiau pagrindinis greitumas pasijaustu, jei softas važiuotu iš išorinės SDRAM ar DDR atminties.

Tikėjausi žymiai didesnio greičio skirtumo. Gi Mega tik 8 bitų, neturi “geležinio” slankiojo kablelio ir važiuoja nuo 12MHz (todėl, kad toks kvarcas prilituotas). Tuo tarpu Niosas 32 bitų, hardwarinis floating point, groja ant 50MHz ir naudoja vidinę FPGA atmintį kuri tikrai nestabdo.

Nemanau, kad reikia publikuoti softą (tiek C, tiek Verilog) nes hardwarė labai jau specifinė ir niekas jos nepasidarys. Jei labai labai susidominot, rašytik laiškelį, pamačysim.

VGA signalo generavimas

Internete yra gana daug viskiausių VGA signalo generatorių schemų FPGA čipams. Vienos geriau, kitos mažiau suprantamos. Tačiau radau vieną aiškinimą kuris man pasirodė labiausiai suprantamas ir lengvai realizuojamas.

Pradžiai reikia pažiūrėti į paveikslėlį:

FPGA VGA VESA timing

Tai visas video signalo vaizdas- balta zona tai tas ką męs matom ant ekrano, kitos dalys- nematomos, bet labai svarbios.
VESA numato visą eilę standartinių video siganalų ir raiškų variantų. Mane domina tik patys populiariausi- naudojami LCD ekranuose (native resolution) ir paprastieji VGA režimai kurie buvo naudojami su CRT monitoriais.
Dažnas žino ekranų raiškas (800×600, 1024×768), dar gal kadrų dažnį (60, 70, 75 … 100Hz), tačiau žymiai mažiau žinomi kiti labai svarbūs parametrai- pixel clock ir eilučių dažnis.
Yra dar sinchronizacijos signalai, jų ilgis, dažnis, vieta ir poliariškumas taip pat standartizuoti.
Darant VGA signalą geriausiai skaičiuoti x ir y koordinates ne iki standartinio ekrano dydžio, bet iki viso signalo galo. T.y. VGA režime x reikia skaičiuoti ne iki 640 taškelio, bet iki 800. Tada labai lengva realizuoti teisingus sinchro signalus- po vaizdo palaukiam 16 pixelių (A), padarom sinchro signalą ir palaikom 96 pixelius (B), pašalinam sinchrosignalą ir dar 48 pixelius laukiam iki naujos eilutės pradžios (C). Panašiai ir su y koordinate.

Dabar biški VESA standartinių duomenų:

Mode Pixel clock, MHz VS, Hz HS, kHz Sinchro poliariškumas x y A B C D E F
VGA 60 25.17 60.04 31.46 – – 640 480 16 96 48 11 2 31
VGA 75 31.5 75 39.38 – – 640 480 16 96 48 11 2 32
VESA 1024×768 65 60 48.36 – – 1024 768 24 136 160 3 6 29
VESA 1280×1024 108 60 64 + + 1280 1024 48 112 248 1 3 38

Jei domina kitos rezoliucijos, va online skaičiuotuvas: http://www.tkk.fi/Misc/Electronics/faq/vga2rgb/calc.html

Šiaip dažniai gali vos vos skirtis- monitorius sugeba prisiderinti prie nedidelių nukrypimų, bet geriau daryti tiksliai. Darant schemutes su FPGA ir naudojant VGA režimą, galima pernelyg nepaisyti elementų vėlinimo, tačiau darant projektą skirta normaliam LCD monitoriui taimingas labai svarbu- 100MHz pixel clock tai jau ne juokas. Čia galioja ne tik vėlinimas išorinėje atmintyje, bet ir vėlinimas pačioje FPGA mikroschemoje.
Vienas iš geriausiu prietaisų pasitikrinti vėlinimus yra LCD monitorius dirbantis “native resolution”- 17″ monitorius tai “tikslus oscilografas” su 10ns “raiška”.

Pavyzdinis Verilog failas VESA 1027×768 vaizdelio generavimui (rodo kelius brūkšnelius):
Continue reading →