Digitaalitekniikka (piirit) Metropolia / AKo Pikku nnitteluharjoitus: Suunnitellaan sekvenssipiiri, jolla saadaan numerot juoksemaan seitsensegmenttinäytöllä: VHDL-koodin generointi ASM-kaavioista Tässä on esitetty 7-segmenttitehtävien - 3 ASM-kaaviot. Samalla mennään jokaisen kaavion yhteydessä läpi se, miten kukin kaavio muutetaan VHDL-koodiksi. Kuvan seitsensegmenttinäytöllä numerot - 3 saadaan aikaan sytyttämällä segmenttejä seuraavasti: : abcdef : bc 2: abdeg 3: abcdg Tehtävä : Suunnittele sekvenssipiiri, joka ohjaa yhtä 7-segmenttinäyttöä niin, että näytössä pyörii numerot kasvavassa järjestyksessä --2-3---2-3---2... niin että kukin numero on näkyvissä vuorollaan yhden sekunnin. Suunnittelun tulos: Lohkokaavio: ASM-kaavio: a clk naytto b c d e f g a a abcdef bc a2 abdeg a3 abcdg Lohkokaaviossa on hyvä kirjoittaa näkyviin laitteelle joku nimi, koska sellainen tarvitaan VHDL-koodissa. Tämän sekvenssipiirin nimi on siis naytto. ASM-kaaviossa tilojen nimet kannattaa valita niin, että ne kelpaavat sellaisenaan VHDL-koodiin tunnisteiksi (eli muuttujien nimiksi). Silloin nimi ei voi alkaa numerolla, joten ensimmäisenä mieleen tuleva tapa nimetä tilat (,, 2, 3) ei käy. ASM-kaavioon on merkitty myös 2-bittiset tilakoodit. Niitä käyttäen voitaisiin tehdä tilataulu ja lähtötaulu, ja niistä sitten nnitella kiikkujen (2 kpl) lisäksi tarvittava kombinaatiopiiri kuten oppituntikalvojen luvussa 3 on tehty. Jos sekvenssipiiri kuitenkin toteutetaan VHDL-koodauksen kautta (kuten teemme), niin silloin noita tilakoodeja ei tarvitse ASM-kaavioon laittaa. Tuossa alla ne onkin jätetty pois.
Miten tästä ASM-kaaviosta generoidaan VHDL-koodi? Opiskellaan seuraavaksi, miten ASM-kaaviosta kirjoitetaanvhdl-kielinen sekvenssipiirin käyttäytymiskuvaus. Tuloksena olevalla VHDL-koodilla voidaan sitten esim. Quartus II -ohjelman kautta ohjelmoida sekvenssipiirin toiminta ohjelmoitavaan logiikkaverkkoon. Näin teemmekin harjoitustyö 2:ssa. Opettajan vaatimattoman kokemuksen mukaan paras tapa oppia uusi ohjelmointikieli on kopioida toimivaksi tietämistään ohjelmista mahdollisimman paljon pohjaksi omalle sovellukselleen ja sitten etsiä jostain (mielellään keittokirja-tyyppisestä) oppaasta lisätietoa. (Näin olen viimeisten n. 35 vuoden aikana opetellut saamaan aikaan toimivia ohjelmia mm. seuraavilla kielillä: Basic, Fortran, Algol, Pascal, Perl, Java, PHP, Python.) Siksi tutustumme ensin siihen, millainen on tunnilla esitelty Jaskan kuppilan supermainoksen ASM-kaavio VHDL-kielisenä koodina. Tuosta koodista näemme, mitä osia VHDL-ohjelmassa pitää olla ja miten sekvenssipiirin tilamuutokset kuvataan, miten päätöslohkojen toiminta kuvataan ja miten generoidaan lähtösignaalit. Sitten vaan muutamme mallikoodia soveltumaan käsillä olevaan piiriin, ja se on siinä. Jaskan kuppilan supermainoksen lohkokavio ja Mooren kone -version ASM-kaaviohan ovat tällaiset Lohkokaavio: ASM-kaavio: Seuraavalla sivulla on tämän sekvenssipiirin toiminnan kuvaava VHDL-koodi. Rivinumerot eivät kuulu koodiin, ne on lisätty mukaan, jotta olisi helpompi viitata tiettyyn kohtaan. Lohkokaaviosta ja ASMkaaviosta puuttuu -toiminto, joka VHDL-koodissa on. Lohkokaaviossa laitteen nimi on JKS, alla olevassa VHDL-koodissa nimenä käytetään jksmoore, koska oppimateriaalissa on tehty myös Mealytoteutus.
-- Digitaalitekniikka (piirit) 2 -- Harjoitustyö 2 3 -- Esimerkki: Jaskan kuppilan supermainos Mooren koneena 4 -- VHDL-kuvaus 5 -- Esko T. Rautanen 6 7 -- Suunnitteluyksikön esittely 8 ENTITY jksmoore IS -- nnitteluyksikön nimeksi tiedoston nimi 9 PORT ( yo, hh: IN BIT; -- varsinaiset tulosignaalit clk, : IN BIT; -- kello- ja nollaussignaali 2 herk, jask, kupp: OUT BIT); -- lähtösignaalit 3 END jksmoore; 4 5 -- Supermainoksen ASM-kaavion kuvaus VHDL-käyttäytymiskuvauksena 6 ARCHITECTURE toiminta OF jksmoore IS -- arkkitehtuurin ja nnitteluyksikön nimi 7 -- Määritellään tyyppi "tilatyyppi" ja esitellään siihen kuuluva signaali "tila" 8 TYPE tilatyyppi IS (ei, h, hj, hjk, hjk2, hjk3); -- arvoina ASM:n tilat 9 SIGNAL tila: tilatyyppi; -- ASM:n tilasignaali "tila" 2 2 PROCESS (, clk) -- ASM:n toiminta kuvataan prosessina 22 23 IF = '' THEN -- kiikkujen nollaus -signaalilla 24 tila <= ei; -- alkutilana tila ei 25 ELSIF clk'event AND clk = '' THEN -- kellopulssin nouseva reuna 26 CASE tila IS -- tilanmuutokset kuvataan CASE-lauseella 27 WHEN ei => -- siirtymä tilasta ei 28 IF hh = '' THEN -- tilanmuutokseen vaikuttava päätöslohko 29 tila <= h; -- kuvataan IF-lauseella: jos hh =, 3 -- siirrytään tilaan h, muutoin tilaan hjk 3 tila <= hjk; 32 33 WHEN h => -- tilasta h siirrytään tilaan hj 34 tila <= hj; 35 WHEN hj => -- tilasta hj siirrytään tilaan hjk3 36 tila <= hjk3; 37 WHEN hjk => -- tilasta hjk siirrytään tilaan hjk2 38 tila <= hjk2; 39 WHEN hjk2 => -- tilasta hjk2 siirrytään tilaan hjk3 4 tila <= hjk3; 4 WHEN hjk3 => -- siirtymä tilasta hjk3 42 IF yo = '' THEN -- tilanmuutokseen vaikuttava päätöslohko 43 tila <= ei; -- kuvataan IF-lauseella: jos yo =, 44 -- siirrytään tilaan ei, muutoin tilaan hjk3 45 tila <= hjk3; 46 47 END CASE; 48 49 END PROCESS; 5 -- Sijoitetaan lähtösignaalien arvot valikoivilla signaalin sijoituslauseilla 5 52 herk <= '' WHEN ei, -- herk-signaalin arvoksi, kun tila on ei 53 '' WHEN OTHERS; -- herk-signaalin arvoksi muissa tiloissa 54 55 jask <= '' WHEN ei h, -- jask-signaalin arvoksi, kun tila on ei 56 '' WHEN OTHERS; -- tai h, muissa tiloissa arvoksi 57 58 kupp <= '' WHEN hjk hjk2 hjk3, -- kupp-signaalin arvoksi tiloissa hjk, 59 '' WHEN OTHERS; -- hjk2 ja hjk3, muissa tiloissa arvoksi 6 END toiminta; VHDL:ssä kommentit merkitään --:lla. Siis VHDL-kääntäjä jättää noteeraamatta kaiken tietyllä rivillä --:n jälkeen olevan. Esimerkkikoodissa on lihavoidulla punaisella merkitty ne VHDL-kielen rakenteet, jotka tarvitaan jokaisessa tällä kurssilla kirjoitettavassa VHDL-ohjelmassa. (Paitsi IF... THEN...... END IF - rakennetta ei WHEN -lauseiden yhteydessä tarvita seitsensegmenttiesimerkkimme ensimmäisessä toteutuksessa, koska siinä ei ole yhtäkään päätöslohkoa.)
Sinun tehtäväsi: Täydennä allaoleva VHDL-koodi niin, että tuloksena on tehtävässä aikaansaatua ASMkaaviota vastaava koodi. ENTITY IS PORT ( : IN BIT; : OUT BIT); END ; ARCHITECTURE toiminta OF IS TYPE tilatyyppi IS ( ); SIGNAL tila: tilatyyppi; PROCESS (, clk) IF = '' THEN tila <= ; ELSIF clk'event AND clk = '' THEN CASE tila IS END CASE; END PROCESS; '' WHEN OTHERS; <= '' WHEN ; '' WHEN OTHERS; '' WHEN OTHERS; '' WHEN OTHERS; '' WHEN OTHERS; '' WHEN OTHERS; END toiminta;
Tehtävä 2: Suunnittele sekvenssipiiri, joka ohjaa yhtä 7-segmenttinäyttöä niin, että näytössä juoksee numerot käyttäjän valinnan mukaan joko järjestyksessä --2-3---2-3---2- tai sitten järjestyksessä - 3-2---3-2---3-2- niin, että kukin numero on näkyvissä sekunnin. Suunnittelun tulos: Lohkokaavio: clk naytto2 a b c d e f g Sopimus: Jos =, niin numerot kiertävät järjestyksessä --2-3---2-3---2- ja jos =, niin numerot kiertävät järjestyksessä -3-2---3-2--- 3-2-. ASM-kaavio: a a a2 abcdef bc abdeg a3 abcdg Kun tämä koodataan VHDL:llä käyttäen pohjana tehtävän koodia, pitää ENTITY -lohkossa ja ARCHITECTURE -rivillä muuttaa laitteen nimi. Lisäksi PORT-määrittelyssä pitää näkyä, että nyt tulosignaaleja on yksi enemmän. Lisäksi tarvitaan CASE-rakenteessa (jota käyttäen kuvataan se, miten kustakin tilasta siirrytään seuraavaan tilaan) jokaisen WHEN-lauseen yhteyteen IF - THEN - - END IF - rakenne, koska ASMkaaviossa jokaisen tilalohkon jälkeen on päätöslohko.
Sinun tehtäväsi: Täydennä allaolevat VHDL-koodin osat niin, että tuloksena on tehtävän 2 ASM-kaaviota vastaavan VHDL-ohjelman vaatimaa koodia. ENTITY IS PORT ( : IN BIT; : OUT BIT); END ; ARCHITECTURE toiminta OF IS TYPE tilatyyppi IS ( ); SIGNAL tila: tilatyyppi; PROCESS (, clk) IF = '' THEN tila <= ; ELSIF clk'event AND clk = '' THEN CASE tila IS IF = '' THEN IF = '' THEN IF = '' THEN IF = '' THEN END CASE; END PROCESS; (Tämä jälkeen tulevat - rakenteet eivät muutu.)
Tehtävä 3: Suunnittele sekvenssipiiri, joka ohjaa yhtä 7-segmenttinäyttöä niin, että näytössä juoksee numerot käyttäjän valinnan mukaan joko järjestyksessä --2-3---2-3---2- tai sitten järjestyksessä - 3-2---3-2---3-2-. Lisäksi käyttäjän valinnan mukaan kukin numero näkyy aina joko sekunnin tai kaksi sekuntia. Suunnittelun tulos: Lohkokaavio: clk naytto3 a b c d e f g Sopimus : Jos =, niin numerot kiertävät järjestyksessä --2-3---2-3---2- ja jos =, niin numerot kiertävät järjestyksessä -3-2---3-2---3-2-. Sopimus 2: Jos =, niin numerot näkyvät sekunnin (eli yhden kellojakson) ja jos =, niin numerot näkyvät kaksi sekuntia (eli kaksi kellojaksoa). ASM-kaavio: a abcdef a2 abdeg b abcdef b2 abdeg a bc a3 abcdg b bc b3 abcdg Tilat on nimetty niin, että aina numeroa x vastaava ensimmäinen sekunti on ax ja toinen sekunti on bx. Tällaisen vähän mutkikkaamman kaavion piirtämisessä voi jokinlaisena haasteena pitää mahdollisimman selkeältä näyttävään tulokseen pääsemistä. Silloin kannattaa esim. pyrkiä minimoimaan risteävät viivat. Tässä tapauksessa piirtäminen ilman risteäviä viivoja ei taida onnistua. Tämän toteutuksen VHDL-koodi poikkeaa aiemmista koodeista kolmella tavalla Kohdat, joissa esiintyy laitteen nimi, pitää päivittää. TYPE-määrittelyyn tulee nyt kahdeksan tilaa (edellisissä neljä). PROCESS-rakenteen sisällä olevaan CASE-rakenteeseen tulee nyt kahdeksan WHEN-lausetta, joihin joka toiseen tulee IF - THEN - ELSIF - THEN - - END IF -rakenne ja joka toiseen IF - THEN - - END IF -rakenne. Tuo mutkikkaampi IF-lause tarvitaan, koska aina kun muuttuja on testattu, niin jos sen testin tulos on, testataan saman tien -muuttuja. Lopun WITH-lauseissa oleviin WHEN-lauseisiin tulee nyt enemmän tavaraa.
Sinun tehtäväsi: Täydennä allaolevaan pohjaan tehtävän 3 ASM-kaaviota vastaava VHDL-koodi kokonaidessaan. ENTITY IS PORT ( : IN BIT; : OUT BIT); END ; ARCHITECTURE toiminta OF IS TYPE tilatyyppi IS ( ); SIGNAL tila: tilatyyppi; PROCESS (, clk) IF = '' THEN tila <= ; ELSIF clk'event AND clk = '' THEN CASE tila IS IF = '' THEN ELSIF = '' THEN IF = '' THEN IF = '' THEN ELSIF = '' THEN IF = '' THEN IF = '' THEN ELSIF = '' THEN IF = '' THEN IF = '' THEN
ELSIF = '' THEN IF = '' THEN END CASE; END PROCESS; '' WHEN OTHERS; <= '' WHEN ; '' WHEN OTHERS; '' WHEN OTHERS; '' WHEN OTHERS; '' WHEN OTHERS; '' WHEN OTHERS; END toiminta; Nuo -rakenteilla toteutetut lähtösignaalien arvojen määrittelyt voi toteuttaa eri tavallakin. Miten?