Konstrukce číslicových systémů -- závěrečná práce

Zadání

Navrhněte pro obvody ALTERA ve VERILOGU následující obvody, demonstrujte je na funkčním vzorku a zpracujte laboratorní protokol.

  • obsluha klávesnice
  • obsluha sedmisegmentového displeje
  • obsluha čtrnáctisegmentového displeje

Společné prvky jednotlivých podúloh

Charakteristika

Jednotlivé obslužné moduly byl vyvinuty v prostředí Altera Quartus II (verze 6.0) v jazyce Verilog. Pro návrh stavového automatu, použitého v obslužných modulech pro LED-displeje bylo použito nástrojů z vývojového prostředí ActiveHDL.

Demostrační designy byly též vyvinuty v prosředí Altera Quartus, pro demonstraci funkčnosti byl zvolen vývojový kit Altera NIOS II Evaluation Kit. Jednotlivé obsluhované součástky (tj. displeje a klávesnice) byly doplněny o podpůrné obvody a připojeny k vývojovému kitu.

Pro napájení LED-displejů bylo použito externího zdroje o napětí 5V.

Přenositelnost

Zmíněný vývojový kit disponuje vnitřními hodinami o kmitočtu 24 MHz. Jednotlivé moduly pak byly parametrizovnány na tento kmitočet, pro použití na jiném čipu FPGA by bylo třeba:

  • modifikovat parametry hodinových děliček, nebo
  • předřadit separátní hodinovou děličku (ev. násobičku) na hodinový vstup obslužného modulu.

Přiřazení výstupních špiček kitu a výstupů designu FPGA bylo přizpůsobeno použitému kitu, stejně jako zapojení podpůrných obvodů.

Obsluha klávesnice

Popis problému

Cílem podúkolu bylo vytvořit obslužný modul pro maticovou klávesnici o 16 klávesách. Vnitřní struktura klávesnice a zapojení podpůrné logiky je znázorněno na obrázku 1.

Obr.1: Schema zapojeni maticove klavesnice

Obr. 1: Schéma zapojení maticové klávesnice 4×4 (převzato z [1])

Klávesy jsou zapojeny do matice 4 x 4, kde každá funguje jako spínač, který galvanicky propojuje daný řádek a daný sloupec.

Elementární metoda detekce a určení stisku klávesy je postupně přivádění kladného napětí (hodnoty log. 1) na jednotlivé sloupce matice a testování řádků na výskyt kladné hodnoty napětí – to indikuje stisknutou klávesu. Nevýhoda této metody je, že nestisknutá klávesa není rozpoznána jako log. 0, ale jako stav vysoké impedance.

Proto v předkládaném řešení jsou i jednotlivé řádky připojeny na zdroj kladného napětí (za použití tzv. pull-up odporů). Sloupce jsou oproti předchozí metodě buzeny inverzně, tedy na právě testovaný sloupec je přivedena hodnota log. 0, na ostatní hodnota log. 1. Nestisknutá klávesa je detekována jako hodnota log. 1. Stisknutá klávesa pak „svede“ budicí napětí na řádku na zem ve sloupci a na řádku je pak detekována hodnota logická 0.

Dalším jevem, který je nutno brát v potaz, je „šum“ při přechodu klávesy mezi stisknutým a nestisknutým stavem. Proto je nutno změnu stavu klávesy testovat dvakrát, s odstupem cca 10ms (experimantální výsledek, neověřeno) a teprve při stejném výsledku obou testů považovat stav za změněný.

Řešení

Na obrázku 2 je zachyceno schéma testovacího desginu, který využíva obslužný modul pro maticovou klávesnici a demonstruje jeho funkci.

Modul kbd_supp má na vstupu připojen hodinový signál CLK a reset RST (aktivní v nule, nevyužit), dále 4 piny ROW pro čtení hodnot na jednotlivých řádcích klávesnice. Budící výstupy COL jsou určeny pro jednotlivé sloupce klávesnicové matice. Vektor SIGNAL signalizuje stav jednotlivých kláves (log 1. indikuje stisknutou klávesu). Bity 0 - 9 signalizují stisk kláves „0“ - „9“, bity 10 - 14 klávesy „A“ - „D“ a bity 15,16 znaky *,#.

Modul kbd_ind čte vektor SIGNAL a generuje výstupní vektor IND, u kterého se předpokládá připojení na indikační LED diody vývojového kitu. Při stisknutém čísle 0 - 9 svítí pro každé jedna dioda, pro písmena A-D svítí pro každé dvojice ledek a při stisku * nebo # diody zobrazí střídavý vzor.

Obr. 2: Schémá testovacího designu pro obsluhu klávesnice

Obr. 2: Schémá testovacího designu pro obsluhu klávesnice

Implementační detaily

Modul kbd_supp se skládají s těchto komponent:

  • delička hodin
  • „zpožďovač“ hodin, hodinovvý registr
  • multiplexor (+ registr pro vektor COL)
  • výstupní registr (pro vektor SIGNAL)
  • registr změn

Parametrická dělička hodin generuje na výstupu hodinový puls každých n (v našem případě je n = 60 000, tak aby perioda činila zhruba 2,5 ms) pulsů vstupních (systémových) hodin (tzv. dělené hodiny). „Zpožďovač“ při každém pulsu dělených hodin naplní první (nejpravější) bit hodinového registru jedničkou. Hodinový registr se dále při každé vzestupné hraně systémových hodin posouvá o jedna doleva a je zprava doplňován nulami – výstup k-tého bitu hodinového registru pak funguje jako hodinový signál zpožděný o k pulsů systémových hodin za hodinovým signálem dělených hodin.

Multiplexer na každý puls dělených hodin nastavuje jeden z budících vývodů do log. 0 (ostatní jsou nastaveny do log. 1). O jeden hodinový puls (systémových hodin) později dojde k zápisu do výstupního registru, pro bity relevantní k aktuálně zkoumanému řádku. V případě, že je pro j-tý bit rozdílná hodnota ve výstupním registru a v registru změn (nastavování obsahu registru změn viz následující odstavec), zapíše se do výstupního registru hodnota z registru změn, jinak se ponechá původní hodnota.

O další hodinový puls později dojde k zapsání aktuální hodnoty vstupu řádků klávesnice do registru změn.

Chování

Díky zpoždění zápisu do registru změn oproti zápisu do výstupního registru a dělení kmitočku systémových hodin je každá klávesa čtena každých 10 ms. Nejprve se změna stavu kláves zapisuje do registru změn, a o 10 ms později se změna stavu potvrdí a vypropaguje na výstup zápisem do výstupního registru.

Po implementaci se ukázala skrytá nevýhoda maticového zapojení – při stistku 3 a více kláves dochází k falešné indikaci stisknutí kláves. Pro běžné aplikace toto nemusí být na závadu.

Ačkoliv obslužný modul vnitřně pracuje synchronně, poskytuje v podstatě asynchronní výstup, kdy využívající aplikace musí neustále kontrolovat změny stavu kláves. Možným vylepšením v tomto ohledu je implementace synchronního předávání zpráv o stisknutí / uvolnění kláves, např. s pomocí kruhového bufferu pro ukládání událostí před odesláním.

Poznámka: Na základě toho, že jazyk VERILOG podporuje práci i s nedefinovanými hodnotami a hotnatami vysoké impedance, byl proveden pokus o implementaci „naivního“ zapojení maticové klávesnice, bohužel však be úspěchu. Z důvodů časových jsem se přiklonil k „tradičnímu“ řešení.

Obsluha 7-segmentového LED-displeje

Popis problému

Cílem této podúlohy bylo vytvořit pro 4 ciferný 7 segmentový LED displej podpůrnou logiku a obslužný modul v jazyce VERILOG pro programovatelné HW struktury.

Použil jsem již sestavený podpůrný obvod pro displej, sestavený s budících obvodů pro displej (displej je napájen napětím 5V, ve srovnáním s 3.3V pracovním napětím kitu) a posuvného registru (dále pomocný registr) pro uložení právě zobrazované číslice.

Fyzický displej má pouze jednu sadu vstupních kontaktů pro jednotlivé segmenty a 4 selektory číslice. Úkolem obzlužného modulu je jednotlivé cifry pravidelně obnovovat.

Řešení

Schéma řešení je zachycena na obrázku 3.

Vstupem obslužného modulu je signál systémových hodin a reset (aktivní v nule), dále adresová (2 bity), datová (4 bity) sběrnice a příznak zápisu pro datový vstup. Výstupem jsou pak 4 vodiče pro výběr cifry (řízene multiplexorem) a 3 vodiče sériové rozhraní pro zápis cifry do posuvného registru v podpůrném obvodu (řízené stavovým automatem).

Testovací generátor postupně imkrementuje vniřní 16-bitový čítač, jeho obsah po čtveřicích bitů nahrává do obslužného modulu, který je pak zobrazuje jako 4-ciferné hexadecimání číslo na displeji.

Obr. 3: Schéma testovacího designu pro 7-segmentový displej

Obr. 3: Schéma testovacího designu pro 7-segmentový displej

Implementační detaily

Pro převod binární reprezentace číslic je využita paměť ROM o šířce adresy 4 bity, kde na každé adrese je uložen 8bitové kód císlic definující grafickou reprezentaci.

Pro správné časovaní je i v obslužném modulu i v testovacím modulu použita dělička hodin.

Sériový zápis do pomocného registru je řízen jednoúčelovým konečným automatem, který generuje hodinový a datový signál pro externí obvody (vně programovatelného HW) a konečně signál STORE pro pomocný registr (signál pro zápis přijatého sériového vstupu na paralelní výstup).

Obsluha 14-segmentového LED-displeje

Cílem této podúlohy bylo vytvořit pro 2 ciferný 14 segmentový LED displej podpůrnou logiku a obslužný modul v jazyce VERILOG pro programovatelné HW struktury.

Tato podúloha byla řešena modifikací hotového řešení podúlohy předcházející.

Potřebné modifikace

Podle vzoru jsem zapojil pomocné obvody pro 14-segmentový displej, oproti předcházejícímu bylo pouze nutno přidat druhý posunvý registr, zapojený sériově na stejný hodinový signál a stejný signál STORE. Sériový výstup z prvního posuvného registru byl pak připojen na sériový vstup druhého.

Schéma zapojení testovacího designu, který používá obzlužný modul, je na obrázku 4.

Multiplexer byl zredukován z 1 ze 4 na 1 ze 2.

Datová sběrnice byla rozšířena ze 4 na 6 bitů. Pro bitovou reprezentaci znaků byly vybrány části tabulky znaků ASCII, kdy znakům 00 - 1F hexadecimálně odpovídají znaky 40-5F hexadecimálně z tabulky ASCII, a znakům 20-3F odpovídají znaky 20-3F v tabulce ASCII.

Navrhl jsem grafické reprezentace většiny znaků (sada písmen, sada číslic, aritmetická znaménka, závorky, částečně interpunkce) a uložil je do vytvořené paměti ROM se šířkou adresy 6 bitů.

Šířka adresové sběrnice zůstala 2 bity, ale změnil se význam:

  • kombinace 01 (resp. 10) určuje zápis znaku do první (či druhé) cifry
  • 11 znamená zápis do obou cifer současně,
  • 00 určuje přesunutí znaku z pravé cifry do levé a následný zápis do levé (efekt posouvajícího se textu)

Stavový automat byl modifikován pro vysílání 16 bitů místo puvodních osmi, aby bylo možno naplnit oba pomocné registry.

Byl vytvořen nový testovací generátor, který ve své interní paměti ROM obsahuje sekvenci adres (pro obsluhu displeje) a znaků, kterou postupně vysílá obslužnému modulu. Po resetu je registr adresy nastaven na poslední adresu v ROM a její hodnota je interpretována jako adresa začátku (skoku). Při opětovném dosažení konce se do registru adresy načítá hodnota předposlední adresy.

Do ROM v testovacím generátoru jsem vytvořil sekvenci, která demonstruje vzhled jednotlivých znaků a funkce obslužného modulu.

Obr. 4: Schéma testovacího designu pro 15-segmentový displej

Obr. 4: Schéma testovacího designu pro 15-segmentový displej

Literatura

 
skola/lab/arch_final_p2006.txt · Poslední úprava: 2007/11/29 10:42 autor: srerucha

TOPlist