Săptămâna #invatFPGA pe scurt (3)

A treia săptămână, iată  linkurile:

  • se întâmplă des ca input-ul într-un FPGA să fie zgomotos din diverse motive. Presupunând că știm frecvența cu care variază această intrare dorim să elimină frecvențele, de multe ori, mai mari apărute ca urmare a zgomotului colectat de semnalul nostru pe PCB sau pe fire. Aici găsiți explicații și cod Verilog pentru două posibile rezolvări;
  • ArduinoRaspberry PiBeagleBone Black – toate au apărut și, mai ales, s-au dezvoltat datorită conceptului de open source hardware (OSH sau OSHW). OSHW a schimbat profund piața de eletronică, oferind hobbyiștilor hardware atât de puternic și de variat încât mulți s-au transformat în profesioniști. OSHW înseamnă acces la toate documentele de fabricație ale unei platforme, posibilitatea oricui de a dezvolta add-on-uri și mai ales o comunitate foarte mare de oameni gata să te ajute indiferent de nivelul tău de cunoștinte. Mai multe puteți citi aici într-un articol al celor de la Mouser, unul dintre cei mai mari distribuitori de componente electronice din lume, care a decis ca nu mai poate ignora piața OSHW și a creat recent un portal special pentru asta. Vestea bună este că de pe Mouser puteți comanda și în România, au prețuri bune, multe componente și stocuri solide;
  • noi cei care lucrăm în embedded SW suntem obișnuiți să folosim bunul și vechiul C, dar pe măsură ce sistemele devin din ce în ce mai complexe, C++ va fi folosit în embedded din ce în ce mai mult. Poate n-ar strica o reîmprospătare a cunoștinelor de C++, o puteți face consultând articolul ăsta;
  • mai știți cum era cu modulația PSK, FSK, QAM? Filtrele FIR, IIR și tot ce-ați învățat la PDS? Niște concepte, fără prea mare implicare în practică, nu? Ce-ar fi dacă le-ați învăța făcând ceva practic? Ca de exemplu să faci două calculatoare să comunice între ele prin unde ultrasonice folosind microfonul și difuzorul? Găsiți toți pașii și explicațiile aici;
  • ați vrut mereu să vă cumpărați o mașină electrică sau hibridă da’ v-ați gândit că n-o să puteți trăi fără sunetul de motor clasic, nu? Nici eu da’ Toshiba a făcut un amplificator audio de putere care rezolvă problema asta a sunetului.

Săptămâna #invatFPGA pe scurt (2)

Link-urile de săptămâna asta:

  • ca să nu uităm că blogul este în principal despre FPGA-uri primul link este un scurt clip despre istoria Xilinx. Producătorul meu preferat de FPGA-uri (care s-a rebranduit recent în  „an All Programable Technology company”, dar despre asta în detaliu într-un post viitor) a împlinit 30 ani. Deși știm cu toții cât de mult a evoluat electronica în ultimii 50 ani rămâi fascinat când vezi 30 ani derulați sub ochii tăi în 5 minute;
  • cine zicea ca nu există femei frumoase cu o contribuție în inginerie? Heddy Lamar, a avut o poveste de viață extrem de interesantă care include un rol de pionier în comunicațiile wireless așa cum le știm astăzi. Unii spun chiar că fără ea nu am fi avut internet wireless. Poate e prea mult, dar împreună cu un compozitor, a inventat în timpul celui de-Al Doilea Război Mondial tehnica frequency hopping. Fiind vorba de război tehnica a fost gândită ca o metodă sigură și simplă de comunicație care să fie greu de interceptat, interpretat sau bruiat de către inamici, întreaga poveste aici;
  • un articol scurt și la obiect despre ceea ce înseamnă programarea la un nivel jos, pentru oamenii care au experiență în Java, C#, etc și vor să se apuce de programare embedded;
  • Busul I2C este foarte folosit în intercomunicația dintre un microcontroller și diverse alte componente: senzori, EEPROM-uri, RTC-uri, controllere de motoare. Un articol bun cu tot ce trebuie să știi ca să-nțelegi cum funcționează găsești aici;
  • cea mai simplă metodă de-ați face acasă PCB-uri descrisă pas cu pas;
  • ok, ți-ai construit o plăcuță sau, poate chiar un sistem mai complex. Power-up- ul a mers bine, nu a luat foc totul da’ totuși lucrurile nu merg așa cum te-ai aștepta. Cum identifici problema? Poate o listă cu câțiva pași de urmat ar fi de folos.

Pasul patru

În postul trecut, am folosit un microprocesor, care controla LED-urile de pe placă. Singurele conexiuni ale microprocesorului erau aşadar cele către memorie şi LED-uri, dar un microprocesor poate fi interconectat cu mai multe periferice. Asta se întâmplă în exemplul din acest post, exemplu în care este introdus şi touchscreen-ul, cu ajutorul căruia controlăm LED-urile. În ce constă proiectul mai exact: pe touchscreen va fi afişată imaginea următoare:Atingând cu pen-ul unul dintre numerele de la 1 la 8 selectez LED-ul respectiv, a cărui culoare vreau să o setez, după care, tot cu pen-ul, selectez culoarea dorită. Astfel pot să setez individual culoarea fiecărui LED doar cu ajutorul touchscreen-ului, fără altă interfaţă. Etapele care trebuie parcurse pas cu pas se găsesc aici, eu am făcut o serie de modificări pe care le voi prezenta mai în detaliu.

Proiectul are în centru procesorul TSK3000A, cel folosit şi în exemplul anterior, de data asta cu mai multe conexiuni,  cum am spus, conexiuni care se realizează simplu, aşa cum am văzut,  într-un document OpenBus (documentul ăla care seamnănă cu o diagramă bloc), rezultând următoarea „schemă”:Acest document „ascunde” de noi detaliile interconectării prezentându-ne doar nişte conexiuni logice, fără a vedea ce semnale circulă între blocurile conectate. Pentru a înţelege mai bine cum funcţionează procesorul şi cum este el conectat la periferice ar fi interesant să vedem ce se întâmplă în spatele acestei interfeţe de conectare. Pentru asta putem alege să construim totul în schematic fără a apela la documentul OpenBus. Să vedem cum arată simbolul de schematic al procesorului, pentru început. În figura de mai jos el este în partea stângă, în timp ce în partea dreaptă avem simbolul folosit în documentul OpenBus:

Procesorul are ca semnale de intrare un semnal de reset şi unul de clock pe care mai apoi le propagă către dispozitivele I/O şi către memorie. Acestea din urmă se conectează la procesor prin intermediul bus-ului Wishbone (pe care l-am introdus în postul anterior), bus ce conţine semnale definite de acest standard, denumirea lor este sugestivă, deci nu o să insist asupra lor. Mai multe despre cum se realizează comunicarea între dispozitive prin intermediul standardului Wishbone puteţi citi aici. Din simbolul microprocesorului vedem ca acesta are interfaţă cu doar un dispozitiv I/O deci ca să putem accesa mai multe dispozitive avem nevoie de un element de interconectare care să îndeplinească şi rolul de multiplexor. Alt lucru ce se observă este că microprocesorul foloseşte adrese de 24 biţi pentru a accesa dispozitivele I/O şi datele interschimbate  cu acestea sunt pe 32 biţi, iar pentru memorie atât adresa cât şi datele sunt pe 32 biţi. Trebuie să adăugăm controler-ul LED-urilor, driverul pentru touchscreen, şi încă două controllere pentru pen-ul touchscreen-ului. Aceste componente (disponibile toate în biblioteca Altium) au implementată o interfaţă Wishbone pentru a se putea conecta la microprocesor şi o interfaţă către componentele fizice aflate pe placă. Să vedem cum arată controler-ul de LED-uri spre exemplu:În partea stângă avem semnalele Wishbone (aceleaşi ca la microprocesor) iar în partea dreaptă semnalele care merg către LED-uri (există 8 LED-uri, fiecare LED are defapt 3 chip-uri: roşu, verde, albastru, deci 3 bus-uri a câte 8 semnale). Controller-ul de LED tocmai descris este un IP core care este compatibil Wishbone, adică producătorul (în acest caz Altium) a inclus în el şi o interfaţă care să facă posibilă comunicarea cu alte core-uri (compatibile Wishbone la rândul lor). Observăm că adresa în cazul controler-ului de LED este pe 5 biţi iar datele pe 8 biţi, deci elementul de interconectare va trebui să facă şi o decodare/conversie pentru a lega core-urile.

Dupa adăugarea tuturor IP core-urilor şi interconectarea lor prin componente specifice (care realizează funcţiile descrise mai sus) rezultă schema următoare, echivalenta scheme OpenBus de la începutul articolului : 

Acum că am înţeles care sunt avantajele Wishbone-ului (standardizarea interconectării, configurabilitate mare ce permite conectarea core-urilor aparent diferite) şi cum anume realizează el conexiunile între core-uri putem trece mai departe să creăm proiectul embedded pentru microprocesor şi să scriem codul C. Pentru că am modificat o parte din codul C prezentat pe site-ul Altium o să includ mai jos modificările. Bucla infinită devine:

Unde funcţia set_one_led este următoarea:

După scrierea FPGA-ului şi programarea microprocesorului output-ul ar trebui să fie următoru’, din păcate camera cu care am filmat nu este dintre cele mai bune:

Pasul doi

Ştim până acum că FPGA-urile sunt nişte componente minunate pe care noi le putem configura să facă cam ce vrem noi, dar cine le fabrică? Există două companii mari: Xilinx (care a şi făcut primul FPGA în 1985) şi Altera. Nu intru în detalii în legătură cu cauzele acestui cvasi-duopol, o explicaţie puteţi găsi aici. Pe lângă cele două mai există Lattice şi Actel (având împreună o cotă de piaţă de doar 12%). Ca să putem începe să lucrăm pe un FPGA, componenta în sine nu este suficientă, aici intervin aşa numitele development boards. Ele sunt nişte board-uri care au, pe lângă FPGA, o serie de alte componente astfel încât să putem implementa şi testa cam orice aplicaţie trăznită ne trece prin cap. Astfel, în mod uzual ele conţin: conectori pentru tastatura şi mouse, intrări şi ieşiri video şi audio, conector Ethernet, hub USB, CAD(convertor analogic-digital) şi CDA(convertor digital-analogic), diverse switch-uri şi led-uri, etc. Development board-urile sunt făcute de foarte multe firme, de la producătorii de FPGA (în general când apare un nou FPGA pe piaţă producătorul respectiv scoate şi un development board ce îl încorporează), la companii EDA, la mici producători.

Din multitudinea de board-uri de pe piaţă trebuie să alegem unul, alegere care implică şi alegerea FPGA-ului. Aşa că am început să caut pe internet diverse soluţii: Xilinx, Altera, etc până când pe poarta firmei unde lucrez a intrat Minunăţia*:

Altium NanoBoard 3000 este the engineering geek must have. Compararea NB3000 cu orice alt produs de genul ăsta este similară comparaţiei dintre un produs normal si un produs Apple (nu sunt un mare fan dar tre’ sa recunosc că în ceea ce priveşte designul, Apple nu prea are rival), de fapt şi Max este mega-încântat şi el are ceva ani  de FPGA şi ASIC în spate, şi nişte cărţi minunate dacă tot suntem aici :). NB3000 pe lângă faptul că are tot ce ţi-ai dori (toate tipurile de interfeţe imaginabile, 8Mbit flash, touchscreen LCD,  etc.) are şi un design remarcabil care te face să simţi că lucrezi la un proiect adevărat, nu într-un laborator echipat cu aparate din anii ’70, dacă ştiţi ce vreau să spun.  NB3000 este creaţia Altium şi vine alături de un soft cu ajutorul căruia să poţi începe proiectarea imediat, dar şi alături de o librărie remarcabilă de IP cores (IP cores-urile sunt porţiuni de design FPGA care pot fi incluse în proiectul tău, mai multe detalii pe măsură ce avansăm în FPGA design. Pentru acum, de reţinut este că de obicei ele costă, dar în cazul nostru vin odată cu NanoBoard-ul). Softul celor de la Altium este mai complex decât partea de FPGA, el integrând Schematic, PCB şi FPGA design, dar asta este o altă poveste despre care noi nu discutăm. Încă. 🙂

Altium oferă 3 variante: cu FPGA Xilinx Spartan-3AN, Altera Cyclone III sau LatticeECP2 şi poate fi comandat în România de aici. Eu am ales NanoBoard 3000XN, adică varianta cu Spartan, motivele pot fi deduse din începutul acestui post.

Urmează instalarea softului şi apoi putem începe.

*firma la care lucrez este value added reseller Altium în România.