Category Archives: FPGA/CPLD

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 →

RGB matrica: gama korekcija

Seniau minėjau, kad RGB matrica neteisingai perduoda pustonius. Kiek pasiknaisiojes internete radau terminą “gamma correction” kuri naudojama manau visuose displėjuose. Vikipedija davė didelį straipsnį ir net baisuoklišką formulę kaip skaičiuojama gama (γ):
formule

Tačiau man reikėjo paskaičiuoti ne pačią gamą, bet korekcinę lentelę. Po trumpos paieškos radau šį algoritmą:
brightness = (255# * ((x / 255#) ^ (1# / gama))) + 0.5

Parašiau trumpą programėlę ROM reikšmių lentelės generavimui, o lentelė vėliau įrašoma į FPGA. Va jums ekrano fotkė. (kažkaip patiko fotkinti ekraną o ne spausti print screen 🙂 )

gamma software

Toliau bus keletas matricos nuotraukų su įvairiom gamma reikšmėm. Man labiausiai patiko reikšmės tarp γ=2 ir γ=3. Primenu, kad tiesinė priklausomybė (γ=1) jau išbandyta ankščiau ir rezultatas buvo blogas.
Spauskit ant nuorodos: Continue reading →

RGB matrica: beveik 24 bitai

Supumpavau Verilog kodą iki tiek, kad pagaliau RGB matrica pradejo rodyti beveik 24 bitus informacijos. Kadangi neteisinga tiesinė LED priklausomybė, labai daug informacijos išsikraipo ir nesigauna didelis grožis. Diodų šviesumo ir žmogaus akies priklausomybė greičiausiai kokia logaritminė. Ir dar trūksta taktų (PWM moduliacija vykdoma pakadriui, nes taip sujungta schema. Todėl fps turi būti x kartų didesnė nei standartinė flicker-free), jei imti 256/4 mirgėsio nėra, o štai prie 256/2 jau jaučiasi žiaurus mirgėjimas. Taktinis dažnis ~120MHz. Nėra kur slėptis.

Keletas iliustraciju:

RGB beveik 24bit LED

Kaip viskas šviesu ir negražu. Visai nėra juodos spalvos. Tuo tarpu originaliam paveikslėlyje irgi nėra juodos spalvos, bet daug “tamsiai pilkos”:

RGB beveik 24bit LED
(2K kosminė odisėja ir demotivatoriai)

Labiau “hentai-manga” stiliaus paveiksliukas su popieriaus lapu:

RGB beveik 24bit LED

ir visas, nufotkintas tamsoje:

RGB beveik 24bit LED

Originalus paveiksliukas:

RGB beveik 24bit LED
“Your resistance only makes my penis harder!” posakis yra gana įžymus, žiūrėkit vikipedijoje apie tai. 🙂

Testinis failas (SOF/POF) įrašyti i FPGA ar konfiguracinę mikroschemą EPS4: POF/SOF.POF/SOF (fixed). New: POF/SOF. Naujos “firmware” source kodas.

RGB matrica: rašom softą

Kai pavažiuoja smegenys nuo FPGA programavimo (niekaip nepavyksta dalis 24 bitų konvertavimo į vieno bito PWM), peršokam į MS Visual Basic kurybą. Naudojam senovišką VB6 versija, nes .NET versija kažkaip nesugeba automatiškai konvertuoti senų mano projektų. O kai kuri nauja programulką, labai patogu naudotis senesnių programų gabaliukais- moduliais.

Pasirašiau sau darbinį variantą paveiksliuko konvertoriaus. Programa konvertuoja bet kokį paveiksliuką į RGB matricos dydžio atminties buferį ir taip pat, panaudojus lygio detektorius gamina vieno bito frame buferį.

RGB matrica: softas

Čia nuotrauka (netgi ne printscreenas!) su gyva matrica ir kompo ekranu. Matosi, kad matrica rodo tą patį kaip ir programos apatinis langelis. Programa gamina atminties image (vaizdą) Quartus Memory Initialization File (.mif) formatu. Jį buvo labai lengva aprašyti naudojant Basico komandomis.

O čia, šiaip, iliustracija. Dalis “timing” diagramos kurią teoriškai generuoja FPGA kodas:

timing

Kodas iš esmės toks: imam duomenis iš vidinės RGB kadro atminties, iš duomenų atimam kadro numerį (kadro numeris tai paprasčiausias skaitliukas). Taip gaunam primityvią PWM moduliacija kadrui. Teoriškai, šviesiausias taškas šviečia visus 256 karus iš 256. Tuo tarpu 50% ryškumo taškas šviečia tik 128 kadrus iš 256. Praktiškai 256 kadrai nesigavo- naudoju 64 lygius, nes neužtenka greičio (net ir dabar prasideda triukai- iš vidinės atminties skaitom duomenys tuo pat metu kaip ir keičiamas adreso duomenys- ir viskas taktuojama ~200MHz taktiniu dažniu). Taip gaunama 262144 spalvos. Iki 16M kiek trūksta… Šis rezultatas perrašomas į 1 bito kadro buferį. Kita dalis FPGA mikroschemos ima duomenis iš šio buferio iš 30 vietų po 16 bitų ir per 30 serial-shift registrų išpumpuojama į MBI mikroschemas. Atminties pumpavimas, modifikavimas ir pumpavimas atliekamas vienu metu, todėl įtariu gali kilti problemos su judančio vaizdo rodymu. Bet iki šios problemos nepriėjome.
Šiuo metu sunaudojom 2011 loginių elementų( iš 5980 galimu, 34%) ir 73728 bitus atminties (92160 galimu, 80%) ir beveik visus pinus- 79 (iš 98 galimu, 81%). Nors tiesa pinai tai ne mano problema, nes ne aš dariau plokštę…

RGB matrica: 1 bito frame buferis

Po ilgo laiko tarpo, pagaliau prisėdau prie savo RGB LED matricos. Kiek pavargau ir perrašiau visą matricos “taimingo” schemą į vieną Verilog modulį. Testinė schema buvo padaryta iš atskirų loginių elementų. Pakeliui išsisprendė keletas (bent jau teorinių) “gliukų” oscilogramose ir šiaip, schema užima mažiau vietos FGPA viduriuose.

Kol kas organizuotas vieno bito “frame” buferis (kadro atminties buferis). Duomenys iš FPGA vidinės atminties pastoviai pumpuojama į RGB matricą. Pakeliui išprestas rebusas dėl skirtingo RGB LEDų išsidėstymo ir “logiškos” video atminties. LEDai sulituoti kiek kitaip, ir video atmintis gaunasi kiek iškreipta, panašiai kaip ZX Spectrum kompiuteryje. Geriau jau schemoje viską išburti, nei ateityje vargti su paveikslėlio paruošimo softu.

RGB matrica
(Tie snukučiai jau iš pradžių buvo su pasuktom burnom, va paveiksliuko “source”: Paveiksliukas kuris turejo buti pavaizduotas. Dar įtariu nesklandumus Basic’o programoje).

Pakeliui teko pasirašyti softą MS Visual Basic’e, kuris paruošia video buferio atminties “dump’ą” kurį galima užkrauti į FPGA naudojant Quartus programinę įrangą.

Iškilo kelios naujos problemos:

  1. Raudona spalva žymiai prislobsta jei uždegami visi 16 diodų ant tos pačios mikroschemos.
  2. Skirtingų mikroschemų “blokai” turi skirtingus baltos spalvos balansus- matosi “siūlės” kai spalva pereina iš vieno bloko į kitą.
  3. Ir jau minėta bėda su žalia spalva- ji linkusi geltonuoti prie didesnio intensyvumo.
  4. Pastebliu mikro “gliukus” mėlynoje spalvoje- kažkokie, vos įžiūrimi, mėlynos spalvos vaiduokliukai.

Šiaip, aš išradinėju dviratį, bet užsienėtis kuris paliko komentarą mano puslapiuose kad jis irgi turi tokias pat matricas net nesiruošia pasidalinti kodu. Spaudžia. Nu ir eina jis peklon, man savo lameriško kodo negaila. Todėl viska skelbiu kaip “freeware”. 🙂

FPGA source code: RGB matricos 1bito buferis Quartus archyvas ir frame buferio turinys.

Bendras vaizdelis kaip atrodo schema: Matricos sujungimo schema pdf dokumentas.

Sekantis etapas ir planai:

Pilnas RGB, bet jau kelių bitų spalvų lygiai, nes su aštuoniom spalvom 21 amžiuje kiek primityvu… 🙂

RGB LED matrica: organizacija

Šis postas labiau skirtas man pačiam nei plačiajai visuomenei. Paprasčiausiai, popieriukai su užrašais dažnai pasimeta arba sunku juos rasti. O čia, internete, informacija randu greičiau :).
Pagaliau buvo laisvo laiko, ir aš kiek padirbėjau su savo RGB LED matrica. Labai palengvino darbą FPGA mikroschema prilituota prie matricos- be jos, “reverse engineering” užtrūktu labai daug laiko… Laikas pažiūrėti ką sumastė Adaptive Micro Systems LLC iš Milwaukee, Vajomingo… 😉

RGB LED full color matrix

Matrica sudaryta iš 72×24=1728 RGB šviesos diodų. (Viso 5184 diskretus diodai).
Matrica padalinta į dvi dalis (eiles) kurios įjungiamos signalais (pagal mano klasifikaciją): LE_MBI_UPPER ir LE_MBI_LOWER (69 ir 70 ciklono kojos). Viena eilė sudaro 12 šviesos diodų eilučių. /LE signalo impulsas perveda informaciją iš vidinio registro į išorę. Žiūrėti MBI5026CD datasheetą .

Šias dvyliką eilučių valdo (per mosfetų raktus) paprasčiausia dvejetainė-šešiolika (74HC154, К155ИД3) mikroschema. Šios mikroschemos naudojamos tik 12 jaunesniųjų išėjimų. Pati dešifravimo mikroschema pajungta taip: A0-A3 (HC154A[3..0]) prie ciklono (32, 33, 34, 35), OE2 (HC154OE2) prie ciklono (32). O štai OE1 pajungtas gana įdomiai, čia padaryta apsauga nuo užstrigimo- su diskretinėm detalėm (rezistoriai, kondikai, tranzai, diodai) suorganizuotas šioks toks watchdog’as. Kol šį “šunį” maitinam per (RC_UNKNOWN1, 37), dešifratorius išduodą išėjimą. Užtenka generaciją nutraukti ir dešifratorius išsijungia.

Kiekvienoje eilutėje (išskyrus pirmuosius du kvadratėlius) yra 16 RGB diodų, kurie savo ruožtu maitiniami iš 3 serial-par-LED-draiver mikroschemų (MBI5026CD). Kiekviena mikroschema atitinkamai R, G ir B spalvas.

Dar, visos MBI5026 turi OE išėjimų valdymus, kurie sujungti išilgai, t.y. OE1 (59) atsovauja viršutinės dalies R spalvai, OE2 (60)- G, OE3 (61)- B. Atitinkamai OE4,5,6 (62, 67, 68)- apatinės dalies RGB.

Vaizdelio paišymas organizuojamas taip:
Paimam iš atminties 10×16 spalvotų pikselių. Juos užkraunam į registrus. Su LE pasirenkam viršutinę ar apatinę matricos dalį naudoti, o su dešifratoriaus A0..A3 pasirenkam eilutę. Kam tas LE? Nes kiekvienas “kvadratėlis” turi savo nuosava SDI…

Bet kaip organizuojamas individualaus taško ryškumo reguliavimas? Kažkaip manipuliuojant OE ir H154OE2? Nes teoriškai, čia turėtų buti “analoginė”, “full color” matrica. Kažkaip nesinori tikėti, kad čia tik 8 spalvos… 🙁 Pati MBI5026 turi fiksuotos srovės išėjimus.

Pažiūrėkit ką jie gamina/gamino: http://www.adaptivedisplays.com/

Myslės atsakymas

Visi teisingai atspėjo. Tai LED matrica.

RGB matrix

Tai Adaptive Micro Systems LLC iš amerikės produktas. Firma specializuojasi šviesdiodžių stendų gamyboje. Nuo primityvių simbolinių vienspalvių LEDų iki pilnos spalvų gamos gatvinių televizorių.
Ši matrica tai 72 x 24 trigubi (RGB) šviesos diodai. Jie valdomi dinamiškai per minėtas mikroschemas. Deja, plokštės interfeisas nėra žinomas, todėl ją paleisti kol kas nepavyko. Dabar labai labai lėtai atliekami plokštės “reverse engineering” (jau beveik baigta). Sekantis etapas bus suprogramuoti FPGA, kad ką nors pamatytiti. O vėliau, gal pavyks sumaitinti kokį išorinį video signalą…

Po kažkiek laiko…

First testss

Ir pagaliau visus FPGA pinus “sutreisinau”. Sekantis etapas- gauti logišką vaizdelį. Nes dabar tai atsitiktinė informacija iš dažnio daliklio.

RGB matrix all colors on

Gražiai šviečia. Įdomiausia, kad mėlyni diodai maitinami iš logikos (5V) maitinimo, žali ir raudoni iš atskiro maitinimo laido.

Loginis analizatorius

Vienas labai patogus prietaisiukas kurio dažnai prisireikia yra daugiakanalis loginis analizatorius. Tai prietaisiukas kuris greitai surenka duomenis iš keletos/keliolika/keliasdešimt kanalų ir leidžia kompiuterio pagalba analizuotis kaip ten kas veikia. Bėda tame, kad prietaisai keičiasi duomenim labai sparčiai ir paprastom priemonėm šios informacijos pagauti ir persiusti į kompiuterį neimanoma. Tokie prietaisiukai daromi kiek sudėtingiau: iš pradžių duomenys nuskaitomi su įvairiom mikroschemom į kokią nors atmintį, o vėliau, žymiai lėtesniais metodais perduodami į kompiuterį tolimesnei analizei. Protingesni loginiai analizatoriai dar sugeba pradėti registruoti duomenis nuo kažkokios signalų kombinacijos, naudodami taip vadinama trigerį. Nes kartais labai sunku pagauti reikiamą signalo pradžią.
Toki prietaisiuką megėjiškom sąlygom galima susikonstruoti. Lengviausias variantas- panaudoti FPGA kūrybinę plokštę (dev board). Plokštes mes kaip ir turim, o štai softas ir FPGA source radom internete. Taip GPL licenzijos pagrindu padarytas projektėlis iš http://www.sump.org/projects/analyzer/ .

Samplinimo (nuskaitymo) dažnis iki 100MHz, naudojama statinė atmintis kuri nėra didelė. Projektas skirtas Altera DE2 plokštei (o ji brangi net ir su studentiška licenzija), todėl teko pakeisti kelis failiukus, kad veiktu su paprasetesne Cyclone dev board. Taipogi teko atsisakyti standartinės COM jungties kuri yra ant plokštės, nes mano kompo vienintelė COM jungtis užimta planšetės. Pasinaudojau savo gamybos USB-COM adapteriu kuris puikiausiai susidraugavo su pridėta programa.

FPGA logic analizer

Pirmas gėris kurį prijungiau prie loginio analizatoriaus tai MP3/MP4 grotuvėlis ZicPlay. Mane domina jo ekranukas, kiek suprantu tai kontroleriukas su atmintim, jis jungiasi su aparačiuku tik keliolika laidų.
Nuotraukoje matosi Nios dev board su Cyclone EP1C20F400C7 (nors išnaudojama mažytė šio monstro dalis), per IDE ATA60/100 (80 laidininkų) kabelį pajungtas grotuvėlis. Beja, IDE kabelio pinoutas pilnai sutampa su dev board lizdu, visi žemės laidai atitinka kabelio standartą.

FPGA logic analizer
Šiose diagramose “pagautas” aparačiuko įjungimas. Grotuvėlis inicializuoja LCD ekraniuką ir jame nupaišo smėlio laikrodžio vaizdelį. Aišku šioje iliustracijoje matosi tik dalis viso vaizdelio. Samplinimo dažnis 5MHz, vaizdelis sumažintas kad gražiau atrodytu. Realiai matosi daugiau informacijos.

Mano modifikuotas FPGA source code (Quartus 7.1 versija, quartus archyvas, .qar failas). Įėjimas pajungtas prie dev board 5V tolerant jungties, USB-RS232 pajungta per 3.3V tolerant jungties. COM greitis “hardwired” FPGA konfiguracijoje. Šiaip adaptacijai reikia redaguoti tik “top” failą, visi kiti failai originalūs:Quartus archive

Cyclone III

Po įvairiausių spekuliacijų internete ir realiam pasaulyje, surinkau kažkiek pinigėlių ir per eBay aukcioną nusipirkau Altera Cyclone III Starter Board. Dar kitas kitoks “starter board” kažkur klaidžioja pašte.

Cyclone III

Dėkavojam visiems tautiečiams pirkusiems LCD ekraniukus ir taip finansavusiems mano FPGA studijas.