Tag Archives: FPGA

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 →

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.

LVDS duomenų perdavimas per UTP LAN kabelį

Pradėjau paišyti PCB skirta pajungti mano RGB matrica(s) prie kitų įrenginių ir nusprendžiau, prieš darant eksperimentus kiek paeksperimentuoti. Tada pačiupau senesnę savadarbę plokštę su Altera Cyclone 1 minimaliu čipuku su 100 kojų. Gerai, kad neskaičiau datasheeto, nes vėliau išskaičiau, kad 100 kojų pirmasis ciklonas nepalaiko pilnaverčio LVDS… Bet kažkas gavosi. Apie LVDS subtilybes nieko nežinojau, todėl teko pradėti nuo nulio. Ir dar viena bėda, kad reikia konstruoti du prietaisus- siustuvą ir imtuvą. Ir neaišku kurioje vietoje yra klaidos 🙂

Iš pradžių bandžiau daryti be PLL, nes jų trūkumas šioks toks… O štai vizardai kai užsispyre neleidžia naudoti mažų greičių. Iš pradžių bandžiau 100 megabitų greitį, bet gavosi tik su 200 megabitų.

Pats primityviausias siustuvas. Tikrai jo PCB nepritaikyta LVDS signalų siuntinėjimui. Toliau eina apie 2 metrai mėlyno, lanksčio UTP lan kabelio…
LVDS per UTP LAN kabeli

O čia paprasta iliustracija. Paleidžiam abu “aparatus” ir ištraukiu ir vėl ikišu LAN kištuką:

LVDS per UTP LAN kabeli
LVDS per UTP LAN kabeli
LVDS per UTP LAN kabeli

… ir kai atsigauna vaizdas, tada galiu ramiai per JTAG keisti “siuntėjo” RAM turinį ir duomenys puikiausiai persiduoda per tą kabelį.

LVDS per UTP LAN kabeli
(apačioje vaizdas iškraipytas todėl, kad pas siuntėją mažai atminties)

O šita sinchronizacijos bėda kol kas man nesuprantama.

Truputi techninės informacijos: Siuntėjas Cyclone EP1C3, taktinis dažnis 25MHz, toks pats dažnis ir persiunčiamas per vieną LVDS porą (3V). Siuntėjo viduje stovi dviejų kanalų x8 serializeris. Gautusi kaip ir 16 duomenų bitų. Tačiau aš duomenim naudoju tik 8 bitus, o likusius aštuonis naudoju tik adreso sinchronizacijai- paprasčiausiai siunčiu RESET signalą.
Imtuvas pasiima 25MHz taktinį signalą, susimaitina į savo PLL ir priima duomenis.

Ir šiaip šitas “negeras” rodymas kažkaip susijes su bitų seka. Nes transliuojant B/W ($00 ir $FF) vaizdą “kokybė” žymiai dažniau būna gera ir taškeliai visada užsidega savo vietoje.

Video kai kaišiojamas UTP kištukas:

Jau radau vieną klaidą mano naujojoje PCB. Tiesa, ji nėra esminė.

Atari overkill

Prieš n metų buvo tokie 8 bitų kompiuteriukai ATARI. Tai mano pirmasis kompiuteris. Kažkada, pamačiau skelbimą ir nusipirkau vėl tokį kompiuteriuką (tiesa reikėjo jį susiremontuoti: pakeisti vieną RAM čipą ir per naujo papaišyti klavietūrą). Šie kompiuteriai turi kelis softo įvedimo metodus: iš kasetinio magnetofono, iš diskasukio ir iš atminties dėžučių (kartridžų- nuo angliško žodžio cartridge). Sentimentinio priepuolio metu nutariau pasidaryti kartridžą (jau seniau buvau pasidares diskasukio emuliatorių su PC). Kiek paskaitinėjęs internete radau, kad tu kartridžų yra įvairiausių rušių. Galima pasidaryti labai paprastą, tik iš ROM čipo, bet norėjosio ką nors šustresnio. Taip ir kilo šis projektas…

Atari 8 bit cartridge
Čia mano turimas kompiukas Atari 65XE (turėjau aš ir 130XE, su 128K atminties) ir keli eksperimentai.

Atari 8 bit cartridge
Paprasčiausias 8K kartridžas su kiek per didelę Am27C512 mikroschema. 🙂

Atari 8 bit cartridge
O čia projektas “Atari Overkill”. Tinka standartinės flash tipo atmintys (įdėta SST 39SF020A) ir senoviška Alteros CPLD: Altera MAX EPM7128SQC100-15. “MAX” mikroschema išlupta iš kažkokios egzotikos- 100 kojų kaip tik leido nieko nemąstant sujungti visas išorinių elementų kojas į šį čipą. Tiesiog visos kojos iš lizdo, visos kojos iš EPROM, iš visų jumperių ir osciliatoriaus sueina į CPLD.
Dėl loginės klaidos (supainiojau Atari lizdo pinoutą) teko viską pajungti per laidus. Taip ir patogiau- nes galima operatyviai junginėti džiumperius. Geltoni KYNAR laideliai tai PCB klaidų pataisymai ir naujų įdėjų realizacija.
Toliau: Continue reading →