FPGA:0008 – UART

Nu va. Schema didėja ir sudetingėja. Taip pat įvedami įvairūs pataisymai į jau esamus modulius. Todėl dabar stengsiuos prie straipsnio pridėti projekto archyvą. Tai bus su RARu suarchyvuotas Quartuso archyvas (qar) failas. Teoriškai, užteks tik importuoti archyvuotą projektą į Quartusą ir viskas veiks.

Komentaruose skaitytojas rašė apie RS232 modulį. Tiksliau į serial protokolo modulį. Aš nesu toks didelis gudrutis, todėl modulį paėmiau iš FPGA4FUN puslapio. Tačiau jo panaudojimą vilkinau tol, kol bus galima vizualiai panaudoti mūsų “pamokėlėse”. Taigi mintis tokia- sukurti kažkokią tai primityvią serial terminalo video plokštę. Vienam gale RS232 (konvertuotas iki LVTTL lygio), o kitame- monitorius.
Kaip bazę naudojam tą patį video generatorių ir jau spėjusius įgrįsti melynai žalius kvadratėlius.

Pats serial modulis plačiai aprašytasFPGA4FUN puslapiuose. Aš parašysiu apie jo panaudojimą.
Tačiau pradžiai tas minėtas quartuso archyvas. Norėčiau paplepėti apie šią išskirtą schemos dalį:

UART in FPGA
(schema aišku išsididina)

Čia matosi “asyn_receiver”- serial signalo imtuvas. Jis išduoda iš savęs priimta baitą ir kelis kontrolinius signalus. Jo įėjimas- duomenys iš kompo ir clock signalas. Šį imtuvą taktuoju 50MHz clock signalu iš kvarcinio osciliatoriaus. Gauti duomenys patenka į siustuvą- tai kiek griozdiškas metodas padaryti “echo”, bet kartu pasitikrina “async_transmiter” modulio veikimas. Dar duomenys eina į ATASCII_korektorių. Čia dėl to, kad 8 bitų ATARI kompiuteriuko ROMas kiek nesutampa su standartiniu ASCII kodu. Ten paprasčiausiai atimam 32 iš gauto kodo ir siunčiam duomenis į video atmintį. Kadangi video atmintis intensyviai bendrauja su ekrano generatorium, aš čia panaudojau dviejų portų atmintį. Ši atmintis leidžia nepriklausomai rašyti ir skaityti atmintį.
Rašomos video atminties adresas skaičiuojamas su baitų gaudyklės moduliu. Tai paprasčiausias skaitliukas kuris skaičiuoja “įkrentančius” baitus ir didiną atminties adresą. Dar vienas modulis- užlaikymas (delay). Čia jis reikalingas tam, kad iš imtuvo modulio baito priėmimo signalas naudojamas dviem tikslam- įrašyti baitą į atmintį (kaip WRITE signalas) ir kartu didina adresą. Be užlaikymo (tik per vieną 50MHz ciklą!) adresas ateidavo beveik tuo pat metu kaip ir įrašymas ir tik dėl nanosekundinių “kosminių fluktuacijų” priimta informacija papuldavo tai į vieną ar kitą šalia stovintį adresą. Uždelsima duoda griežtai apibrėžta laiką, kad duomenys PIRMA papuola į atmintį, įsirašo (atmintis gi taktuojama 130MHz), o tik tada padidinamas adresas.
Tas pats užvėlinimas garantuoja, kad serial siustuvas gaus stabilius duomenis.
Nu dabar užtenka prisijungti kokį nors USB/SER/TTL kabelį, nustatyti 115200 bodų greitį ir vualia:
Lorem Ipsum in FPGA
Kol kas mūsų video terminalas visiškai neprotingas, jis rodo visus baitus nuosekliai. Tikri terminalai turi biški valdymo. Ateityje pabandysiu padaryti ir tai. Tikiuose per tą laiką kas nors pabandys atkartoti šiuos eksperimentus ir atsiras daugiau feedbacko ir pasiūlymų. Dabar biški liūdna rašyti.
Ir pagaliau… reikia pašalinti šiuos kvadratėlius.

Kaip pagalvoji, šiai nesamonei aš sunaudojau 346 loginius elementus, 232 logikos registrus, 17 mikroschemos kojų, 29696 atminties bitus, vieną PLLą. Tai sudaro 4% mikroschemos logikos, 18% atminties bei 20% kojų. 🙂
Čia aš naudoju kiek storesnį cikloną (EP2C8T144C8), bet turi tilpti į kinišką penkiukę.

P.S. Dėl quartuso darbo subtilybiu, visada modulį ir jo failą vadinkite tuo pat vardu. Nes kitu atveju bagstėlėjus į schemą, automatiškai nerodys reikiamo modulio failo vidurių.

Leave a Reply

Your email address will not be published. Required fields are marked *