Category Archives: FPGA/CPLD

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 →

Svetimas PONG projektas

Čia lygtai Armando puslapiuose paminėtas projektas. Tik autorius kodą rašė Xilinx Spartan plokštėje (Tiesa, VHDL kalba universali, nepririšta prie hardwarės). O aš norėjau pasibandyti su Altera DE1 plokšte. Šiaip viskas tiko, tik reikėjo invertuoti mygtukų signalus… ir kažkodėl autoriaus source kode (bent jau tame kur aš nusikroviau) nebuvo šrifto. Todėl failai nesikompiliavo, o ir be jo, nebuvo jokios tekstinės informacijos ant ekrano.

FPGA Altera DE1 Pong

Todėl aš primontavau klasikinį 8 bitų ATARI kompiuterio šriftą ir dar prikabinau grafinį Quartus block failą, kad paprasčiau matytusi kokia FPGA koja kur panaudota. Originalus VHDL kodas (+šriftas) įdėtas į papildomą katalogą.

Norintiems pasibandyti, čia Altera Quartus PONG archyvas (kompiliuojasi su 8 versija tikrai).

Pačiam autoriui rekomenduoju vietoje mygtukų “aukštyn – žemyn” panaudoti rotary encoderius- tada galima perduoti ne tik judėjimo kryptį, o ir greitį. Tada žaidimukas tikrai bus įdomensnis, o ir encoderių logika nėra labai sudėtinga.

FPGA šrotas: Nokia ir Siemens ADSL bazinės stotys

Nupirko šrotines ADSL bazines stotis, pačios pirmosios kartos Nokijas ir Siemensus. Šiaip visokių 19″ racku pilnų elektronikos, kažkiek Cisco tinklinės įrangos. Elektronika specifinė, plačiai vartojamu detalių nėra. Užtat yra daug FPGA ir CPLD čipukų.

FPGA Altera Flex

Čia idomesnė elektronika kurią atsinešiau namo nusikrapštyti idomesnes mikroschemas. Pagrinde domina FPGA, tačiau man tinka tik nedidelės (fiziškai) mikroschemos ir nelabai naujos. Naujosios jau BGA korpuse, o tokį namų sąlygom nepanaudosi. Tas pats ir su senom, bet labai dideliom mikroschemom- 240 plonų kojyčių tai jau labai daug.
Pagrinde tokios mikroschemos- Altera Flex’ai ir Max’ai pas optinius imtuvus, o štai ADSL skirstytuvai turi Arijas. Yra ir konfiguracinių čipų. Seni flexai geri dar tuo, kad jom užtenka vieno maitinimo šaltinio, tačiau neturi navarotnų PLLų. Dar yra visokių egzotinių atminčių- nuo IDT ar Cypress dviporčių statinių ramų iki Samsung ar Mitron SDRAMų.

Biški fotkių toliau: Continue reading →

Kameros sensorius tiesiogiai į LCD ekraną

Jau labai senai norėjau pasinagrinėti kaip veikia kamerų sensoriai. Bėda ta, kad gana daug sensorių kurius išlupau iš visokios technikos analoginiai. Kad analoginį signalą konvertuoti į skaitmena reikia dėti specializuotus ADC ar panašiai (AD9943). O tai jau daug vargo… Tačiau pakliuvo į nagus USB WEB kamera su atskiru sensorium ir Vimicro procesoriuku. Pasinaudojęs veikiančia kamera šiaip ne taip nustačiau sensoriaus pinoutą ir maždaug kokie signalai kur eina. Man labai pasisekė, kad sensorius veikia ir be nustatymų. Sensorius valdomas per I2C magistralę, bet niekas nežino kokios komandos ką daro.
Sensorius tai pusiau protinga mikroschema- užtenka paduoti taktinį dažnį (iki 30MHz) ir mikroschema atiduoda visus reikiamus signalus: PIX_CLK, HS, VS ir 10 bitų video duomenų. Pagal nutylėjima kameros sensorius dirba VGA režime (640×480) (640 tai tikrai, eilučių netikrinau).
LCD ekraniukas iš seno delninuko panašaus dydžio, tačiau jo organizacija visai kitokia. Todėl negalima pumpuoti informacija tiesiai į LCD ekraną. Reikalinga tarpinė atmintis ir kiek matematikos. Va, gavosi toks prietaisas:

CAM to LCD

Kaip pagrindas čia panaudotas mažiausias Alteros ciklonas. Dėl to ir nepilnas ekranas- paprasčiausiai neužteko vidinės atminties. Jau susiradau išorinę statinę atmintį, tai sekantis bandymas jau bus geresnis.
Kadangi ekranas monochromatinis ir vieno bito, kol kas vaizdas juodai baltas, be pilkumo atspalvių.

Čia blokinė schema vaizduojanti kaip apdorojamas signalas:

CAM to LCD
(Didesnis paveiksliukas)

Paaiškinimas: FPGA generuoja reikiamą taktinį dažnį kameros sensoriui ir susirenka visus duomenis. Kadangi LCD ekraniukas naudoja 4 bitų interfeisą, informacija iš kameros imama po 4 pikselius ir su serial to paralel registru paverčiama 4 bitais duomenų. Atitinkamai 4 kartus sumažintas pikselių taktinis dažnis papuola į X koordinatės skaitiklį. Skaitiklio parodymai numetami su HSYNC (eilučių sinchronizacijos) signalu. Atitinkamai skaičiuojam šį signalą ir gauname Y reikšmę. Y reikšmė numetama su VSYNC (kadrų sinchronizacija) signalu.
Matematikos modulis pasiskaičiuoja pagal X ir Y reikšmes video adminties adresą ir 4 bitų duomenys įrašomi į atmintį.
Asinchroniškai, pagal pagrindinį taktinį signalą generuojami LCD ekraniuko valdymo signalai (HS, VS, PIX_CL) ir atiminties adresas. Pagal šį adresą paimami duomenys iš video RAM ir rodomi ant ekraniuko.

TO DO:

  1. Panaudoti išorinę atmintį ir rodyti visą ekraną
  2. Suorganizuoti bent kelis pilkumo lygius
  3. Pabandyti atburti I2C ir pareguliuoti sensoriaus parametrus

O iš viso utopinis variantas- paimti spalvotą LCD ir pakartoti visa tai spalvotai.
Galutinis galimas šio projekto variantas- didelio ekrano durų akutė 🙂

Quartus projektas (source kodas): QAR zip archyvas.

Shopingas: Altera DE1 FPGA plokštė

Seniai aš apie ją galvojau, bet pirkti tiesiai iš Terasic nenorėjau- nors ji ir atpigo iki $150 + idiotiškos siuntimo išlaidos iš Taivanio, bet ji vis tiek pernelyg brangi. Todėl užstačiau eBay automatinę paieška ir maždaug po metų laiko, vienas studentas iš Kanados ją pardavė. Nusipirkau aš ją už 50$+15$ S&H. Tikėjausi prasisukti be muito, tačiau Kanadietis įvertino siuntinį $120 ir gavau 62Lt PVM, muito ir pašto paslaugų (7Lt).
Tai gana sena FPGA mokymo plokštė su Altera Cyclone II 2C20 FPGA. Kam man jos reikia? Ogi todėl, kad ši plokštė buvo naudojama kaip mokymo plokštė keliuose universitetuose ir jai prirašyta kalnai visokiausių projektų. Dabar aišku yra ir DE2 plokštė, tačiau ji man kiek per brangi- $495…

altera DE1

Taigi, ką mes gavom už 237Lt? (tiesa tikriausiai pigiau, nes doleriai gauti iš smulkios spekuliacijos):
FPGA su ~20000 LE, 8Mb SDRAM, 4Mb Flash, 512K SRAM, SD kortelių lizdą, daug mygtukų ir LEDų, 24 bit audio kodeką (plokštė turi Line in, Line out ir MIC jungtis), prastą VGA lizdą (3x4bitai), RS232, PS2, du IDE stiliaus kištukus prisijungti tiesiogiai prie FPGA.

altera DE1

Šiame koliaže mano turima DE1 plokštė ir trys projektai kuriuos skubiai nukroviau iš interneto: Mandelbroto fraktalų skaičiuotojas, Amiga 500 kompiuterio emuliatorius ir kažkokio kompiuteriuko su Z80 procesorium bandymai.

LVDS SERDES sinchronizacija

Pagaliau kiek paaiškėjo kaip veikia LVDS SERDES (serializer- deserializer) sinchronizacija.
Iš pradžių, galvojau kad užtenka padaryti LVDS megafunkcija ir viskas išsispręs automatiškai. Deja, gavosi bet koks niekalas. Tada aptikom “rx_data_akign” piną. Trumpas impulsas perstumia gautą baitą per vieną bitą. Bet to neužteko. Tada atradom “rx_data_align_reset” piną, kuris nustato bitų postumį į standartinę padėtį. Bet ir šitas nepadėjo. Tada įjungiau “pll_areset” piną. Pinas, kuris pilnai rezetuoją LVDSin megafunkcijos PLLą. Gavosi maždaug toks monstras (dalis imtuvo schemos):
LVDS SERDES
(didesnis paveiksliukas)

Kadangi naudojam 2 poras duomenim, vieną porą CLK ir x6 serializavimo faktorių, tai per vieną “pirstelėjimą” perduodam 12 bitų. 8 bitai naudingų duomenų (nors praktiškai užtenka 7 ar net 6 – akis nepastebi skirtumų, o ir nulinis bitas net teoriškai nedalyvauja matematikoje…) ir dar lieka 4 bitai sinchronizacijai.
Vienas bitas naudojamas kaip kadrų sinchronizacija (VSYNC, beja itariu, kad pas mane kadrų dažnis gavosi kraupiai didelis. Patikslinimas- vaizdas atnaujinamas 1000 fps greičiu. Gal kiek daugoka 🙂 ), o likusieji 3 bitai naudojami SERDES modulio sinchronizacijai.
Aš perskaičiau daugybe datasheetų apie gigabitinius ethernetus, optinius kabelius… Sužinojau apie Hummingo kodą, apie 8b10b kodavimą ir visokius kitokius IP. Bet viskas čia man pernelyg sudėtinga ir visai nereikalinga RGB matricai- nedidelė bėda, jei dėl trugdžio bus koks nors nedidelis atsitiktinis pasimirguliavimas.
Todėl sinchronizacija labai paprasta: jei neatinka 3 bitų seka, pastumiam bitus (inst:105, 101, 103, 106..). Jei per sakysim keliolika bandymų nepavyksta gauti rezultato, darom bitų postumio rezet (inst:110, 104, 102, 108, 109). Jei po keliolikos rezetų vistiek nepavyksta gauti vaizdelį- rezetuojam PLLą ir kartu visą LVDS modulį (inst:111, 112). Kodėl tiek daug bandymų iki pilno numetimo? Ogi todėl, kad kartais sugeba susisinchronizuotis su atsitiktiniu vaizdo gabalėliu ir vaizdas pasidaro stabilus, bet neteisingas. Todėl reikia kiek palaukti, kad pralėktu daugiau video informacijos ir suveiktu klaidų detektorius.

Va koks gavosi rezultatas. Čia įjungiu visą mašinerija ir smaukau UTP kabelį. Kai išjungiu kabeli kažkiek triukšmo ištrina matricos viršų. Kartais jungiant prisigaudo visokių gliukų, bet pilnai įsmeigus kabelį, vaizdas stabilizuojasi.

Dalinai veikia LVDS per UTP

Kiek laiko praleidau belaužydamas galvą. Problema tokia, kad nors ir susijungia dvi plokštės su FPGA mikroschemoms per pusantro metro UTP Cat5 LAN kabelio, PLLas sinchronizuojasi, tačiau RGB matrica rodo kažkokius niekalus. Pagrindinė problema, kad nepasigauna reikiama bitų seka LVDS serializeryje/deserializeryje. Kiek paskaičius dokumentaciją, radau kad galima pasigaminti bitų poslinkio valdymo kojeles. Dabar sinchronizacija ŽYMIAI pagerėjo, bet dar neįdeali. Tačiau bent jau mąstymo gairės atsirado ir projektas pasislinko iš tupiko.

Mažoji (master) plokštelė tai antras Alteros ciklonas (kurį man antrinių žaliavų pavidalu padovanojo Lietuviška elektronikos firma su trumpu pavadinimu iš T raidės). RGB matrica– tai jau seniai iš eBay nupirkta pramoninė matrica su pirmos eilės ciklonu. Plokštės sujungtos mėlynu lanksčiu UTP LAN kabeliu nuo telekomo DSL modemų. Duomenų perdavimo greitis 2*100Mbit. Manau galimas ir didesnis, tik neaišku ar man didesnio reikia.

Sudėtingiausia “namudinė” plokštė

Mintis paprasta- reikėjo padaryti LVDS siuntiką mano RGB matricai. Nei viena turima testinė FPGA plokštė netiko. Vienintelė išeitis- darytis plokštę. Viena problėmėlė- CycloneII mikroschema turi 144 kojas ir 0.5 mm kojelių žingsnį. Buitinėm sąlygom kiek sunkokas variantas- reikia užsisakyti kokiam nors fabrikėlyje Kinijoje ar Bulgarijoje. Tačiau tokia PCB gana brangiai kainuoja. Ypač žinant tai, kad aš dar nežinau kaip kas turi būti padaryta. Todėl išmasčiau, kad “beta” versija reikia pabandyti pasidaryti namie. Tokiom mikroschemoms reikia daugiasluoksnės plokštės, tačiau namų sąlygom metalizuotos skylutės nesigauna ir šiaip problemos su sluoksnių sutapatinimu. Todėl plokštę pasidariau viensluoksnę.

Va paveiksliukas kaip turi atrodyti plokštė:
FPGA
Rausvais kvadratais pažymėtos vietos, kur padariau klaidas. Klaidos tokios:

  • FPGA I/O 2.5V, ATMEGA16 3V tačiau aš neturėjau L versijos. Todėl mega važiuoja ant maždaug 5V.
  • Megos I/O ir Ciklono I/O lygiu suderinimas. Bandom su rezistoriais.
  • Rezonatorius ??MHz buvau sugalvojęs viena, teko dėti 50MHz kuris irgi važiuoja ant 5V. Iš čia CLK lygiu suderinimas su rezistoriu ir diodu. Kiek jis duoda problemų dar nežinau.
  • FPGA PLL maitinimas. Čia jau aš kaltas, kad iki galo neįsiskaičiau į instrukcijas. Aš sujungiau PLLA ir PLLD laidelius į vieną laidą ir per ferituko ir kondiko filtrą pajungiau prie VCCINT… Galbūt dėl šito negaunu PLL LOCKED patvirtinimo LVDS išėjimo megafunkcijoje.
  • Dar nepatvirtinta, bet rodos supainiojau “p” ir “n” poras ant kištukų… nes duomenys kitame kabelio gale gavosi invertuoti :).
  • Užmiršau “apsauginius” 3.6V zenerius ant USB duomenų šynos. Ir vieną rezistorių ten pajungiau prie GND vietoje VCC5.
  • Viena LVDS pora neveikia. Nežinau kodėl. Pasirinkau vieną kojelę su “dual purpose pin” ir kažkas man ten gliučina.– radau mažyti “solder bridge”
  • Nenumačiau keletos vietų “demferiniams” kondikams, nors ant PCB ten vietos pilna.

Pagaminta plokštė, kad negalvotumėte, kad svaigstu. Tas organinis stiklas tikrai padeda, nes ne vieną prietaisiuką esu pagadinęs kai nusprūsta koks oscilografo žemės laidas ir prisiliečia prie ten kur nereikia.

FPGA
(Plokštė pagaminta su fotorezistu ir lazeriniu printeriu. Takeliai išvedžioti Eagle programa)

Kol kas viskas veikia blogai. RGB LED plokštė pagauna LVDS sinchronizacija, bet vistiek bando rodyti visokius briedus. Pagyvensim pamatysim, kol kas gi mokomės. Dar nei vieno LVDS projekto nedariau.
O projekto fantazija buvo tokia, kad iš kompo informacija per USB paduodama į šią plokštę, o ji, savo ruožtu, valdo vieną arba dvi RGB matricas.
Šiuo metu, matrica prijngta 100Mbit greičiu prie “valdymo” plokštės. Jei pavyksta sekmingai sinchronizuotis, duomenys teisingai vaikšto ir matrica valdosi (per JTAG). Tačiau siuntėjo LVDS modulis “PLL LOCKED” nepakelia.

Engineering Sample… WTF?

Norėjosi į vieną mikroschemą įpūsti kodą ir staiga pasipylė klaidos:

Info: Device 1 contains JTAG ID code 0x020A30DD
Info: Device 1 silicon ID is ALTERA04-0
Error: Operation failed
Info: Ended Programmer operation at Sat Feb 14 21:28:57 2009

Pasinaršius internete radau užuominą apie problemą. Žiū fotkę:
Altera engineering sample

Raidelės “ES” reiškia “Engineering Sample” ir šios mikroschemos ID skiriasi nuo paprastos, serijinės. Todėl paprasti fuse bit .pof failai netinka. Tačiau Quartuso mikroschemų saraše tokios nėra. Yra tik standartinė. Jokių problemų- softe ta mikroschema yra, tik nesimato. Pradedam projektą “retail” versijai. Poto atsidarom projekto direktoriją ir susirandam faila “projekto-pavadinimas.qsf”. Oten viduje, kažkur yra eilutė:
set_global_assignment -name DEVICE EPM1270F256C5
Šią eilutę pataisom į:
set_global_assignment -name DEVICE EPM1270F256C5ES
ir perkompiliuojam projektą. Ir jokių problemų. Aišku, gali kilti problemos jei nėra source code, o turim tik programinimo failus. Bet turiu didelį itarimą, kad ten skiriasi tik vienas baitas.