Protolauta / Digitaalitekniikan kurssit

Digitaalitekniikan jatkokurssilla ventiloitiin josko olisi kiinnostusta / järkeä kyhätä jonkinmoinen pieni protolauta jossa olisi ne tavalliset ledit ja kytkimet, mutta ehkä vähän jotain lisämaustettakin.
Kun digitekniikan kurssilaiset on nyt edenneet jo työstämään soft prosessoreita niin pikkuinen CPLD on helppo nakki, joten puhuttiin, että protolaudalle voisi laittaa semmoisen samanlaisen Xilinxin XC9500XL:n jota on jo hyvän aikaa pyöritelty kurssilla .
Lupasin tutkia asiaa ja parin illan pyörityksen jälkeen kasassa olisi tämmöinen esitys. Kaikenlaisia kommentteja toivottaisi esitettävän, erityisesti jos raati havaitsee jotain mokia tai heikkouksia joita voitaisi parantaa.

PDF-muotoinen piirikaavio löytyy täältä: DipTrace schema

Lyhyt kuvaus:

  1. Toiminnallisuus on jaettu karkeasti kolmeen osaan: Kytkintulot, Ledilähdöt ja niiden välissä kytkentämatriisi
  2. Kytkintuloiksi on ajateltu tällä hetkellä 8 painiketta + 8 vipukytkintä sekä painikekytkimellä varustettu kvadratuurienkooderi eli kiertovalitsin.
  3. Ledilähtöjä olisi 8 + 8 kpl tavallisia ledejä, 1 kpl RGB-ledi ja 2-numeroinen 7-segmenttinäyttö
  4. Kytkentämatriisi tuo kaikki tulo- ja lähtösignaalit pinnirimoihin joissa voi hyppylangoilla muodostaa haluamansa ristiinkytkennät. Lisäksi kytkentämatriisin alueella on minikokoinen yhden DIP16-paketin kokoinen protoalue, johon siis voi kytkeä yhden oikean logiikkapiirin ja langoittaa sen matriisiin. Tätä varten matriisiin on tuotu myös 3,3 V syöttö ja maa 8 + 8 rimoihin.
  5. Laudalla on siis myös CPLD-piiri joka kytkeytyy jokaiseen matriisin signaalilinjaan. Ohjelmoimalla voidaan muodostaa mielivaltaisia kytkentöjä matriisin signaalien välillä, ja luonnollisesti kyhätä myös jotain logiikkaa niiden välille. Synkronisen logiikan mahdollistamiseksi laudalla on kaksikin kelloa - hidas ja nopea. Hidas kello on toteutettu 555-piirillä ja sen taajuutta voidaan säätää potikalla välillä about 0,7 - 60 Hz. Nopea kello on toteutettu integroidulla kideoskillaattorilla johon voi asentaa useitakin vaihtoehtoja aina 50MHz taajuuteen asti.

Tarkkaavainen lukija on saattanut laskea päässään kuljetettavian signaalien määrän. Ja aivan oikein, tuo valittu VQ44-paketissa asuva CPLD pystyy kytkemään vain n. 33 signaalia mikä ei riitä kaikille yllä luetelluille. Sitä varten on laudalle piirretty GPIO-signaalien multipleksointi siten, että signali ‘ioselect-pin16’ ohjaa kahden P-kanavafetin avulla I/O-piirien syöttöjännitteitä. Kaikki kytkimet ja ledit poislukien enkooderi ja rgb-ledi, on muksattu ioselectin avulla jolloin niiden signaalilinjojen määrä saadaan puolitettua. Ilman muksausta on siis käytössä I/O-signaalien “alapuoli” ja muksaus päällä molemmat. Se, käytetäänkö muksausta vai ei, voidaan päättää kulloinkin CPLD-piiriin asennettavassa ohjelmassa. Muksauksen mahdollistamiseksi kaikissa sovelluksissa päädyin laittamaan kiinteästi kaksi kelloa jolloin hidasta kelloa voi käyttää harjoituksissa joissa logiikan toimintaa seurataan silmällä. Kellon tila näkyy myös ledillä osoitettuna.

Yksinkertaisimmillaan siis CPLD:n ohjelma ei tee yhtään mitään, vaan käyttäjä kovalangoittaa signaalit kytkimiltä testipiiriin ja sieltä ledeille kuten perinteisellä leipälaudalla kyhätyissä virityksissä. Tällöin on käytettävissä vain I/O-signaalien toinen puolikas (jonka voi valita ohjaamalla ioselect-linjaa).

Toisessa vaihtoehdossa CPLD osallistuu aktiivisesti signaalien käsittelyyn, esim moduloimalla RGB-lediä, ohjaamalla ylös/alas-laskuria enkooderin pulsseista ja työntämällä sitä lähtöpinneihin, dekoodaamalla 7-segmenttinäyttöön jotain lukemaa jonkin tulosignaalin perusteella jne jne. Tässä on sitten mielikuvitus rajana.

Koska allekirjoittaneen mielikuvitus ei riitä, niin olisi arvokasta jos saisin palautetta etenkin siitä, miten jonkun oivaltama toiminto ei toteudu tällä piirikaaviolla. Voidaan sitten parantaa yritystä.
Tässä vaiheessa ei ole vielä layout-kuvia käytettävissä, mutta laitan niitäkin kommentoitavaksi jahka niin pitkälle päästään.

Tuo näyttää hyvältä. Aika paljon siihen tavaraa tulikin. Kommentteja:

  • On oleellista, että GPIO:ta voi käyttää myös ei-5V-tolerant piirien kanssa (FPGA, Coolrunner). Nyt kytkimet ja enkooderi syöttää aina 5V tasoja. Pitäisi voida valita, syöttääkö ne 5V vai 3.3V, tai sitten mennään kiinteästi 3.3V:lla ja luotetaan, että 5V logiikka toimii sillä.

  • Pitäisi päättää, halutaanko tämän laudan yleensäkään tukevan vanhoja logiikkaperheitä, esim. LS-TTL. Niitä piirejä meillä on paljon. Noin toteutetut kytkimet ei toimi niiden kanssa.

  • Olisi hyvä, jos piirin voisi poweroida muustakin kuin USB:stä. Ainakin jotkut piikit (koiras tai naaras) johon voi tuoda ulkoisen 5V labrapowerista. Tai ehkä jopa DC-liitin ja 5V regulaattori, samaan tapaan kuin sinisessä CPLD-laudassa.

  • Tarvitaankohan tuota DIP16-sockettia tällä kortilla? Toisin mieluummin sen ympärillä olevat (naaraspiikkirima)liittimet kortin reunaan siten, että ne saa kytkettyä lyhyehköllä hyppylangalla kortin vierellä olevaan leipälautaan.

  • SlowCLK:n lähtöimpedanssi vaikuttaa isolta. Ei jaksa ajaa TTL:ää. Laittaisin tuohon jonkun aktiivisen komponentin hoitamaan tasonmuunnosta.

  • Myös enkooderin lähdöissä on vähän turhaan ylimääräistä impedanssia. Sarjavastukset voisi jättää pois tai pienentää reilusti.

  • JTAG-liitin on turhaan noin iso. 6-piikkinen piikkirima riittää hyvin.

Kiitos kommenteista!
Vastailen tähän kohta kohdalta ja haetaan haluttu ratkaisu.Olisi tärkeää, että muutkin kommentoisivat jotta ei sitten tarvitse (ainakaan paljoa) palata näihin peruskysymyksiin enää kun on valmis lauta kädessä.

  • Mietin kytkimien jännitetasojen toteutusta kovasti itsekin. Taisin ajatella itse lähinnä vain sitä, että XC95 on 5 V tolerantti enkä niinkään mahdollisia ulkoisia kytkentöjä. Mutta selvähän se, että juurikin ulkoisiin kytkentöihin nämä signaalit ensisijaisesti ovat menossa. Jostain syystä halusin että kaikki kortin I/O syötettäisi +5V jännitteestä jotta ei kuormiteta 3,3V regua niillä. Tuommoinen siitä nyt sitten tuli. Mikään ei estä tekemästä valintaa jolla kytkinsignaalin saa pudotettua 3.3V:iin joten otetaan semmoinen valinta mukaan.
  • Kyllä minusta tämän pitää toimia niin, että signaalitasot kelpaa kaikille yleisesti tunnetuille logiikkaperheille, jotka pystyvät toimimaan niillä jännitteillä joita lauta pystyy toimittamaan.Tähän suunnitellut kytkimet on vaihtokytkimiä, joten niiden osalta ratkaisu olisi helppo: vedetään toinen vaihto maihin jolloin tasot varmasti vaihtuvat valitun jännitteen ja nollan välillä. Painonappi vaan on siinä rinnalla joten se oikosulkee signaalilinjan jos noin tehdään. Eli pitäänee muuttaa vastusten mitoitusta. Alkuperäiseen ei ole muuta syytä kuin yritys minimoida piirin virrankulutus ‘1’-tilassa mutta silti ylläpitää jonkinlaista yhteyttä maihin myös ‘0’-tilassa. Tosiaan tuo mitoitus ei riitä kaikille logiikkaperheille joten tsekataanpa sekin.
  • Mulla oli tässä semmoinen loistava ajatus, että jätetään pois kaikki muu paitsi juuri se USB-poweriliitin. Kun CPLD kumminkin toimii 3,3 voltilla ja I/O max 5V, niin isompaa jännitettä ei tarvita ja USB-linjasta tulisi juuri se 5 V ilman mitään regulointia. Tämä on vähän tämmöinen kaikki tai ei mitään -kysymys - joko pelkkä USB tai sitten lisäliitin ulkoiselle syötölle ja regulaatori siihen perään, koska liittimeenhän voi työntää mitä vaan. Itseä kovasti huvittaisi ehdottaa, että labilla olisi nippu 5V mini-USB-puhelinpowereita jotka olisi vähän kuin “standardi” tämmöisiin keiseihin. Ainakin jokaisella kurssilaisella joka tätä lautaa ehkä harkitsee, on läppäri käytössään ja heillä ei ole tarvetta ulkoiseen sähköön.
    Olen kyllä valmis ulkoisenkin syötön tähän piirtämään jos sille kuitenkin löytyy hyvä peruste joka ei nyt tullut minulle mieleen.
  • Sockettiasiassa, jollei kukaan erityisesti muuta vaadi, niin alan itsekin taipumaan Jarin ehdotuksen kannalle. Tuo oli hetkellinen älynväläys jolla ajattelin voitavan hoitaa semmoinen simppeli tilanne missä on vain 1 lutikka testattavana. Ehkä se on vähän rajatapaus jollaisia tulee niin harvoin vastaan, että kannattaa priorisoida muita suunnittelupäätöksiä sen ohi. Jarin ehdotus on hyvä ja ellei hetikohta vastusteta, niin muutan designia siihen suuntaan.
  • Hitaan kellon osalta hyvä havainto; suoraan sanottuna tuota en tullut ajatelleeksi lainkaan. Hoidetaanpa asia kuntoon.
  • Enkooderin vastukset kopioin suoraan datalehdeltä vähän saman ajatuksen vallassa kuin mitä nuo muutkin. Pitääpä tosiaan tsekata mitoitus tukemaan perinteisempiä logiikkaperheitä myös.
  • Mitä tulee JTAG-liittimeen niin hupaisaa, että yleensä olen piirtänyt juurikin tuon 6-pinnisen kytkennän, mutta tällä kertaa tietoisesti valitsin jättää tämän ison ja kömpelön 14-piikkisen. Ihan vaan siitä syystä, että sama sinisen laudan kanssa käytetty kaapeli toimisi ilman muutoksia. Mitään estettä ei ole laittaa millaista liitintä vaan. Toisaalta tuo osuu laudalla semmoiseen paikkaan jossa ei pienemmästä liittimestä oikein kostu mitään.
    Kumpaa halutaan suosia: pieni vai yhteensopiva liitin? Jos tähän on lisäkommentteja niin muutetaan designia sen mukaan sitten.

Vielä kiitos hyvistä kommenteista. Varmasti saadaan näillä parempi lauta, ja lisää saa kommentoida ja ehdottaa jos vaan tulee jotain mieleen. Poweri- ja JTAG-liitinkysymyksiin kaipaisin siis vielä lisää argumentaatiota ennenkuin ryhdyn toimenpiteisiin.

Kytkintulojen signaloinnistapa kehittyikin nyt pienimuotoinen haaste.
Ensin ajattelin, että okei no problem, säädetään vaan vähän vastusarvoja niin kyllä se siitä. Kumminkin jos halutaan sisällyttää kaikki yleiset logiikkaperheet speksiin, niin pitäisi säätää sekä jännite- että impedanssitasoja ‘0’ ja ‘1’ -tiloissa vastaavasti. No ei ollutkaan enää ihan triviaalia.
Seuraavaksi ajattelin hoitaa ongelman niin, että laitetaan jokaiselle tulolle toteemipaalu N- ja P-feteillä joita ohjataan kytkimellä. Pieni SOT23-6 -koteloinen NP-fettipari menee kyllä hyvin kortille, olkoonkin että niitä tarvitaan 8 kpl. Nyt vaan törmätään siihen, että helppo toteemipaalukytkentä kääntää vaiheen jota en halua. Kytkin ja nappi on helppo laittaa maadoittamaan nimellisessä ‘1’-asennossa jolloin kääntö hoituisi, mutta eipä ole enää helppoa kun otetaan se ioselect mukaan. Mitään kätevää tapaa erottaa signaalit toisistaan maadoittavassa kytkennässä en löydä ja uskon ettei olekaan.
Saattaa kuullostaa hassulta, mutta alan kypsyä ajatukselle laittaa toinen CPLD hoitamaan homman. Sitä vartenhan ne on tehty, eikä piiri paljoa maksa - vähemmän joka tapauksessa kuin kilpailevat ratkaisut. Kaikki oheisrekvisiittahan laudalla on jo valmiina. Lisäbonuksena tulisi mahdollisuus helpottaa muutamia muitakin kohtia joita ehkä saisi hiukan yksinkertaistettua.
Mutta jos joku keksii helpomman keinon niin vinkkejä vastaanotetaan.

Lähtöasteet voisi tehdä vaikka 74VHC-sarjan piireillä, joiden käyttöjännitteen jumpperoisi joko 5V tai 3.3V. Esim. 74VHC245 on 8 puskuria SOIC20-kotelossa. Tuo toimii muuten, mutta jos ja kun CPLD:n pitää pystyä ajamaan tällaista, niin siinä on datalehden mukaan ongelma: VIHmin=0.7*Vcc, eli 5V käyttösähköllä 3.3V ei riitä. Mittailin tuollaista äsken, ja datalehti puhuu asiaa. Pienellä ylösvetovastusvirittelyllä tuon kyllä saisi toimimaan, mutta vähän monimutkaistuu.

Yksi requirement tuolta vielä unohtui: kaikki painikkeet on tarpeen debouncata valmiiksi. Tämä kannattaa tehdä CPLD:llä, eli toisen CPLD:n tarve alkaa olla ilmeinen. Mahdollisesti yksikin riittäisi, jos sen ottaisi VQFP64:ssä (52 I/O:ta).

Tämä taitaa vaatia vielä työstöä valkotaulun ääressä, ennen kuin designi on valmis.

Niin, ja tuo sinisen laudan JTAG-liitin on 10-napainen.

Protolauta on edistynyt ja labin githubissa on matskua tämänhetkisestä versiosta.

Nälkä vähän kasvoi syödessä ja yksi CPLD ei sitten riittänyt joten pantiin kaksi. Ja näennäisestä väljyydestä huolimatta vetoja tuli niin paljon, että tämä on nyt 4-kerroslevy. Onneksi Elecrow tekee juuri tämän kokoisia erityisen halvalla, ei maksa kuin reilut 40$ per 10 kpl. Stensiilin jos ottaa mukaan niin ollaan jossain kuudessa kympissä about.
Kommentit ovat edelleen tervetulleita, niistä oli iloa edellisessäkin iteraatiossa joten antaa tulla vaan jos on ajatuksia.
Koetetaan aika pian saada lauta tilaukseen jotta päästään kokeilemaankin joskus.

Pari kommenttia vielä täydentämään eilistä:

  • Painikkeet ja kytkimet ei toimi noin tehtynä, niillä pitää olla ylösvetovastukset. XC9500:ssa ei ole datalehden eikä käytännön kokeilujen mukaan mahdollisuutta määritellä inputteihin sisäistä ylösvetoa, ulkoinen vastus on pakollinen.
  • Kahden CPLD:n JTAG:ien sarjaankytkentä toimii noin tehtynä, testasin äsken. Molempia pystyy ohjelmoimaan toisistaan riippumatta kiinalaisten mokkulalla + Impactilla. Suurin haaste on pysyä selvillä, kumpi CPLD on kumpi Impactin näytöllä.
  • R106/R108:n voisi varmaan jättää pois. Signaali ei mene mihinkään, mikä ei kestäisi 5V.

Hyvä kun joku katsoo perään ettei turhaan tehdä sutta. Jostain syystä olin noista ylösvedoista niin varma, etten tuntenut mitään tarvetta tarkistaa. No varmaan muistelin jotain ARMeja tai AVR:iä, tai olisko CoolRunnereissa ollut tuo mahdollisuus.
Hyvä tietää että JTAG-ketju toimii. Mietin sen testaamista itsekin, mutta kun eipä minulla olekaan kahta semmoista CPLD- tai FPGA-lautaa josta saisi ulos JTAGin. Mutta nytpä sekin on sitten varmistettu.
Yksinkertaistetaan pikkasen ja poistetaan nuo alennusvastukset. Niitä ei tosiaan tarvittane oikeasti.
Onneksi kortilla taitaa olla vielä tilaa juuri sen verran että saa nuo ylösvedot laitettua ja sitten sunnuntaina tilaukseen.

Protolaudan eka versio testeissä

Tänään (La 23.5.) sain kasattua ensimmäisen kappaleen protolautaa. Meillä on hyviä uutisia ja köh, havaintoja, köh.
Ensin hyvät uutiset:

  • Piirilevyssä (ainakaan tässä ekassa) ei ole löytynyt varsinaisia valmistusvikoja. Labilla alkuviikosta tutkittiin levypajan työn jälkeä ja vaikka pieniä epätäydellisyyksiä löytyy, ei kuitenkaan mitään showstopperia.
  • Pienet vastussarjat joiden sopivuutta paikalleen vähän pelkäsin, meni heittämällä. Ei mitään ongelmia.
  • CPLD:t toimii, JTAG toimii ja piirit voi ohjelmoida & ne tekevät mitä ne on ohjelmoitu tekemään. Kahden CPLD:n ketjutus toimii juuri kuten on tarkoitettukin.
  • Kellot toimii, sekä hidas että nopea
  • Ledipankkien valintalogiikka toimii ja tottelee ohjausta CPLD2:lta.
  • Väyläpuskuripiirit välittää signaalit pinniryteikköön kuten oli tarkoitus.

Kuvassa törröttävä skoopin probe on peittämässä RGB-lediä joka sattuu palamaan ja on niin kirkas, että hallitsisi kuvaa pahasti. Täytyy ehkä miettiä etuvastusten mitoitusta vielä.

SItten niitä mitkä ei menneet ihan putkeen.

  • Ekat sähköt päälle ja heti virtarajaan (laitoin 100 mA kuten yleensäkin). No aika pian löytyi mini-USB-liittimestä vielä yksi tinasilta jota en ollut pannut merkille. Se pois ja nyt labravirtalähteen syöttö kyykkäsi johonkin 2,5 - 3V joten ei jäykkä oikari, mutta jotain mätää edelleen. No, yksi keino on “antaa palaa” joten ruuvasin lisää virtaa ja jossain 270 mA kohdalla vaihtui vakiojännitesäädölle. Aistinvarainen tunnustelu paljasti, että yksi väyläpuskuri lämpiää selvästi enemmän kuin muut. Vikakin sitten löytyi kun otettiin piirikaavio mukaan peliin: suunnan valintasignaali oli mennyt vahingossa naapuripiiriin jolloin systeemissä lähdöt tappeli keskenään. Hirmu munkki, että kyseinen väärin vedetty kisko oli yläpinnassa, eikä 4-kerroslevyn uumenissa. Siispä pikainen langoitus ja homma kunnossa. Sen jälkeen virrankulutus putosi alle 100mA mikä on ihan OK.

  • CPLD:t on siis ketjutettu JTAG-ketjuksi ohjelmointia varten. Näin päästään yhdellä liittimellä ja homma toimii. Tuli vaan numeroitua CPLD:t 1 ja 2, ja JTAG-ketju näkyy muodostuvan järjestykseen ensin 2 sitten 1. Ei tuo mitään haittaa mutta jollei tiedä niin aina on ohjelmoimassa väärää CPLD:tä. Seuraavan version silkkiin siis korjaus.

  • Jostain syystä kytkimet / painikkeet ja niitä vastaavat piikkirimat juoksee vastakkaisiin suuntiin. Siis nappi 8 on pinni 0 jne jne… Ei se taaskaan haittaa toimintaa mutta hämää. Tosin tuon voi hoitaa ohjelmallisesti, pitää vaan muistaa joko UCF-tiedostossa tai varsinaisessa Verilogissa.

  • Hitaaseen kelloon valittu potikka on joku vähän erikoinen, ilmeisesti audiobalanssipotikka. SIinä on pykälä keskellä liikealaa ja siitä alaspäin ei oskillaattori värähtele. Ylöspäin käännettäessä taajuus seuraa kyllä kuten on ajateltu, mutta onhan tuo vähän typerä. Vaihdetaan sopivampaan malliin.

Kytkimiä, enkooderia ja 7-segmenttinäyttöä ei ole vielä kokeiltu, joten niistä lisää ensi jaksossa.

Hyvä, että ainakin suurin osa asioista toimii. Tein yksinkertaisen 16-kanavaisen debouncerin CPLD1:lle, sitä voitaisiin testailla tiistaina tai torstaina. Debouncerin suunnittelua rajoittaa, että siinä ei kovin montaa makrosolua saa käyttää per kanava.

Hieno juttu. Minä tuon lautoja mukaan ja saat ainakin yhden kotiin vietäväksi niin voit rauhassa kehittää ja debugata perusohjelmaa. Mahdollisesti löytyy lisää korjattavaakin nyt jo löydetyn lisäksi. Jutellaan tiistaina lisää.

Tässä vielä piirikaaviot:
Tulot
Logiikka
Lähdöt

Tiistain testaussessiossa Jari kokeili tekemäänsä debounceria ja havaittiin vielä yksi bugi CPLD-laudan elektroniikassa: kytkinten ylösvetovastukset ovat 100 kohm arvolla liian heikot. XC95 inputeissa on bus keeper jota ei saa konfattua pois päältä. Tarkoitus on hyvä, eli estää käyttämättömien tulojen holtiton kohina ilmassa leijuvan hitusähkön vuoksi. Bus keeper vaan on turhan vahva kun siinä on 50 kohm vastus joka vetää tuloa kohti viimeksi havaittua ohjattua tilaa. Eli mitä käy käytännössä niin inputit boottaa ‘1’-tilaan kun 100 k ylösveto ohjaa ne sinne. Kun kytkintä käännetään ekan kerran niin että se maadoittaa tulon, niin tila vaihtuu ja bus keeper vetää kohti ‘0’-tilaa. Ja sinne se jää koska 100 k ylösveto jonka tarkoitus on palauttaa tila ‘1’:ksi kun kytkin palautetaan, on liian heikko voittamaan keeperin 50k vastus. Ylösvetoja pitää siis vahvistaa esim 10k arvoon.
Ikävä vaan, että käytetty komponentti on vastusarray jota ei ole ylimääräisenä joten joudutaan tilaamaan niitä lisää Digikeyltä.

Late breaking news: suoritin sitten kumminkin virtuaalimittauksia DipTracen avulla ja päätin kokeilla 1608 (siis metrishaasteisille 0603) -kokoisilla vastuksilla ja kas, semmoiset meni heittämällä tuon arrayn tilalle. Tietty siinä oli oma hommansa latoa 16 vastusta vs 4 arrayta, mutta pääasia että toimii hienosti. Tuon labille toimivan kappaleen torstaina niin Jari pääsee jatkamaan debouncing-harjoitusta.