DGD-Memòria3 (2015)

Pràctica Catalán
Universidad Universidad Politécnica de Cataluña (UPC)
Grado Ingeniería Telemática - 2º curso
Asignatura DGD Diseño Digital
Año del apunte 2015
Páginas 17
Fecha de subida 20/03/2016
Descargas 26
Subido por

Vista previa del texto

Memòria 3 Disseny d’un Joc Sundus Ishaque i Sergi Novella Un joc dissenyat sobre els coneixements assolits en la implementació de màquines seqüencials i programació integra en codi VHDL.
27/12/2015 Sergi Novella, Sundus Ishaque Memoria 3 Introducció Aquest projecte consisteix en dissenyar un sistema seqüèncial síncron que será capaç d’endevinar un número aleatori entre 0 i 99, que l’anomenarem JOC.
Un cop dissenyat joc, dissenyaremjocDE2, que ens permetrà jugar a la plaça DE2.
(Visualitzar el funcionament de joc a la placa) Funcionament: El funcionament general del joc: quan comenci el joc, es començarà generar el número aleatori que no será visible pel jugador. El jugador podrá introduir números des del teclar i visualitzarà si el número introduït és més gran, més petit o igual al número ocult.
Per aconseguir els nostres objectius necesitarem seguir unes pautes que ens ajudaran a dissenyar el nostre JOC.
    Inicialment tots els leds verds estaran encesos fins que el jugador prem la tecla ‘#’. Aleshores tots els leds s’apagaran i es permetrà introduir números per teclat.
Un cop donat a la tecla ‘#’, podrem introduir les tecles decimals (0 a 9), que el sistema guardarà i mostrarà en dos 7 segments. D’aquesta manera si introduïm la se ‘#’, ‘1’, ‘5’, ‘7’, ‘3’ veurem ‘3’ i ‘7’.
Si es prem ‘*’ es compara el número introduït ambl’ocult i mostra el resultat als vuit LEDs verds de la placa DE2.Seguint el següent patró: Quan s’hagi endevinat el nombre cal prémer ‘#’ per poder començar el joc un altre cop. El judagor en qualsevol moment pot abandonar i reiniciar el joc si prem ‘#’.
1 Sergi Novella, Sundus Ishaque Memoria 3 Estructura del disseny Un cop tenim clar el funcionament mirarem l’estructura que tindrà el nostre disseny. Tindrem una xarxa jeràrquica, on els blocs dependran d’altres blocs.
Dividirem el nostre projecte en dues etapes: - Primera etapa :Dissenyar els diferents blocs del sistema, és a dir, del Joc, i comprovar el seu funcionament simulant.
Segona etapa :adaptarem el joc a la placa DE2 jocDE2.
Disseny de la primera etapa: A continuació tenim l’estructura que tindrà JOC.
JOC com senyals d’entrades té :clk (síncron), nrst (asíncron), nkey i keycode[].
I com senyals de sortida té: less,equal,great (anomenarem en el nostre projecte leg) i num[].
Tenim 2 mòduls que aprofitarem del projecte anterior, per tant només els introduirem: KEYGROUP :És un sistema combinacional que té dues entrades i tres sortides.
Aquest mòdul és el mateix que vam utilitzar al projecte anterior.
REGISTRES :És un mòdul seqüencial síncron, és a dir, es carregarà l’entrada quan hagi un flanc de pujada de rellotge i altrament memoritzarà. Aquest és el segon mòdul que utilitzarem del projecte anterior.
2 Sergi Novella, Sundus Ishaque Memoria 3 A continuació veurem quin paper juguen els nous mòduls de JOC.
COMPTADOR : És un comptador síncron BCD de 2 dígits, que generarà el número a endevinar.
Té un sortida numx[] , que és el número per endevinar. I té tres entrades: clk, nrst i ecnt( senyal d’habilitació), aquest últim donarà permís per comptar si ecnt =’1’ i altrament no comptarà.
Aquí tenim el nostre comptador en format vhdl que generarà un número de 0 a 99.
3 Sergi Novella, Sundus Ishaque Memoria 3 Ara mirarem si aquest mòdul compleix els nostres requisits .
Quant tenim reset activat (nrst=0), el nostre comptador pasarà a 0 (marcat en rosa). I quant nrst=’1’ i ecnt=1 (permís a incrementar el comptador), el comptador continuarà incrementant.
La part més important d’aquest comptador és que vagi a 00,quant estigui a 99 incrementar. (marcat en groc) COMPARADOR : És un mòdul combinacional que compara el número introduït amb el número ocult.
Entrades: Té dues entrades de 4 bits. Num[], és el número introduït des de teclat i numx[], és el número ocult.
Sortides: té tres sortides. Ngtx, neqx, i nltx.
Quant tenim el número ocult més gran que el número introduït (numx>num), tindrem la sortida nltx activada (nltx=’1’). Quant tenim el número ocult més petit que el número emmagatzemat (numx<num), la sortida ngtx s’activa (ngtx=’1’) i si el número ocult és igual que el número introduït (num=numx) tindrem la sortida netx activada (netx=’1’).
4 Sergi Novella, Sundus Ishaque Memoria 3 Fem el mòdul comparador en format vhdl, seguint el criteri, tal com hem comentat abans.
Ara comprovarem el funcionament d’aquest mòdul.
Tenim un número aleatori creat en el numx, en aquest cas (numx=76). Simulem que introduïm el número, num=50, com que (76>50), s’activarà nltx=’1’, que indica que el número guardat és més petit. (marcat en rosa) 5 Sergi Novella, Sundus Ishaque Memoria 3 Ara tenim num=80, com que (76<80), s’activarà ngtx=1’ que indica, el número guardat és més gran.(marcat en blau) I finalment, quant tenim num=76, s’activarà la sortida neqx=’1’, que indica que el número marcat és igual al número ocult. (marcat en vermell) CONTROL : És la màquina d’estats síncrona que governa els mòduls anteriors, per tal que el joc funcioni de la mateixa manera que hem indicat abans.
Entrades: 8 entrades. clk,nrst,ngtx, neqx,nltx, bcd,ast, icoi.
Sortides : 2 sortides ecnt i eshft.
6 Sergi Novella, Sundus Ishaque Memoria 3 Inicialment tenim tots els leds encesos. leg = ‘11111111’ (marcat en marro) Quan s’activa el coi, coi=’1’, tindrem tots els leds apagats i el joc ens deixarà escriure. (marcat en vermell) Quant tenim asterisc activat (ast=’1’), es mostra els resultats de la comparació, en aquest cas com que tenim activat ngtx, a la sortida leg tenim ‘00001111’, que vol dir, el número introduït és més gran que l’ocult. (marcat en verd) Tornem a tenir bcd=1 i tots els leds s’apagen. I quant tornem a tenir coi=’1’ tornem a l’estat inicial (tots els leds estan encesos).
Ara cal crear simbols d’aquests mòduls i connectar-los de forma adient, per poder crear el disseny de JOC tal com hem vist abans, i comprovar si realment aquests mòduls també funcionen junts.
7 Sergi Novella, Sundus Ishaque Memoria 3 8 Sergi Novella, Sundus Ishaque Memoria 3 Inicialment tenim tots els leds encesos, fins que premem coixinet(keycode=F) (marcat en marro).
Tots els leds s’apagen i podem introduir els números (marcat en rosa).
Ara tenim E, és a dir, asterics, per tant comparem els resultats, i tenim LEG=’00001111’, el número guardat és més gran del ocult. (marcat en taronja) Simulem marcar els números i tindrem els leds apagats. (marcat en gris) Tornem a demanar que es mostri el resultat de la comparació, i continua sent major. (marcat en verd) Tenim keycode=F (coixinet), per tant anireml’estat inicial del joc, on tots els leds estaran encesos. (marcat en lila) Al final quant tornem a tenir keycode=E(asteric), per tant, el resultat de la comparació del número introduït i de l’ocult, en aquest hem endevinat el número i això fa que tinguem a LEG=’00111100’.
Observant aquesta simulació arribem a la conclusió de que tots els mòduls fan la seva funció correctament en conjunt, per tant, el joc globalment funciona tal com vam descriure al inici.
9 Sergi Novella, Sundus Ishaque Memoria 3 Disseny de la segona etapa: jocDE2 A continuació tenim el disseny d’adaptació de JOC a la placa DE2.
jocDE2 està format per 5 mòduls, dels quals 3 ja ens donen fets, o millor dit, els utilitzarem dels projectes anteriors.
L’únic mòdul nou que tenim en aquest disseny és leds.
LEDS : És un mòdul que té una entrada LEG(less, equal, great) i una sortida LED_GREEN[].
Aquest mòdul ens ajudarà a visualitzar els resultats de la comparació del número guardat a memòria del número ocult.
10 Sergi Novella, Sundus Ishaque Memoria 3 AMPLIACIÓ PRÀCTICA 3 INTRODUCCIÓ: En aquest apartat d’ampliació d’ens demana 3 coses:    Descriure l’estructura de joc i de jocDE2 integrament en VHDL.
Ampliar el sistema fet en la part obligatoria pel cas d’endevinar un nombre de tres xifres.
Modificar el joc per introduir la opció de fer “trampes” i poder veure el número amagat.
Un cop descrites totes les tres opcions han sigut implementades de cop, la manipulació de dades un cop el codi està integrament en VHDL facilita molt el treball d’edició.
JUGAR AMB TRES XIFRES Introducció: Per a poder jugar amb tres xifres ha calgut modificar bona part dels elements, introduir un comptador de tres xifres, un registre de tres xifres, un sortida més en la placa i tota la ampliació en nombre de bits per les variables corresponents.
Comptador de tres xifres Un comptador idèntic al que ja en teníem però amb una xifra de més. La estructura del codi segueix la mateixa pauta que el comptador original de la pràctica.
11 Sergi Novella, Sundus Ishaque Memoria 3 El comptador va sumant valors de un en un mentre el valor estigui per sota de 999, un cop arriba, salta a 0.
Registre de tres nombres Al igual que amb comptador de tres xifres, seguim el mateix patró que teníem en el registre original, afegint un tercer registre de xifres de 4 bits.
Lo demes del codi ja quedaria igual amb les respectives modificacions de cada una de les entrades, sortides i senyals interns que tindran joc_ampliació i joc_ampliació_de2.
FER TRAMPES Introducció: La opció de poder fer trampes és la que ens permetrà veure el nombre que tenim que buscar. Té molt de sentit si es vol comprobar que el joc funciona quan estas buscant un nombre ja no de 2 xifres, sino de 3.
Podríem avorrir el professor fins que trobéssim el valor i demostrar que el joc SI funciona.
12 Sergi Novella, Sundus Ishaque Memoria 3 Com s’ha fet: Per introduir la opció de trampes hem tingut que tornar a modificar alguns blocs de VHDL ja establerts en aquesta pràctica o la pràctica 2.
Primerament donarem la opció del bloc de control de poder llegir del teclat les lletres A,B,C i D que seran les que activaran la funció trampa.
Keygroup_amp Per poder fer-ho hem donat al bloc keygroup la opció d’interpretació de cada una de les lletres i la transmissió cap a control d’aquest nou senyal.
Control_amp 13 Sergi Novella, Sundus Ishaque Memoria 3 En control s’ha afegit un quart estat anomenat st_trampa o “estat trampa”. Aquest estat s’encarrega de gestionar la senyal de sortida trampa on donem un bit que ens diu ‘1’ estem fent trampa o ‘0’ no estem fent trampa.
Finalment, el codi ja en VHDL de joc i joc_de2 amb els components de la ampliació ve donat com: --Joc-library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity joc_ampliacio is port (clk, nrst, nkey: in std_logic; keycode: in std_logic_vector(3 downto 0); leg:out std_logic_vector(7 downto 0) num: out std_logic_vector(11 downto 0) ); end joc_ampliacio; architecture blocs of joc_ampliacio is signal Sbcd, Sast, Scoi, Sgreat, Sless, Sequal, Secnt, Seshft, Sletter, Strampa: std_logic; signal Snumx, Snum: std_logic_vector(11 downto 0); component keygroup_amp is port (nkey : in std_logic; keycode: in std_logic_vector(3 downto 0); bcd, ast, coi, letter: out std_logic); end component; component comptador_amp is port (ecnt, clk, nrst : in std_logic; numx : out std_logic_vector(11 downto 0)); end component; component control_amp is port(bcd, ast, coi, letter, clk, nrst, ngtx, negx, nltx: in std_logic ; ecnt, eshft, trampa : out std_logic; leg: out std_logic_vector (11 downto 0)); end component; component regs_amp is port (intro, clk, nrst : in std_logic; keycode: in std_logic_vector(3 downto 0); opB, opA, opC: out std_logic_vector(3 downto 0)); end component; component comparador_amp is port (numx, num: in std_logic_vector(11 downto 0); ngtx, neqx, nltx: out std_logic); end component; begin kgroup: keygroup_amp port map (nkey => nkey, keycode=>keycode , bcd => Sbcd, ast => Sast, coi => Scoi, letter=>Sletter ); cmpt: comptador_amp port map(ecnt => Secnt, clk => clk, nrst => nrst, numx => Snumx); comp: comparador_amp port map (num => Snum, numx => Snumx, ngtx => Sgreat, neqx => Sequal, nltx => Sless ); resgistre: regs_amp port map(clk => clk, nrst => nrst, intro => Seshft, keycode => keycode, opA => Snum(11 downto 8), opB => Snum(7 downto 4), opC=>Snum(3 downto 0) ); ctrl:control_amp port map (bcd=>Sbcd, ast=>Sast, coi=>Scoi, letter=>Sletter, ngtx=>Sgreat, negx=>Sequal, nltx=>Sless, leg=>leg, eshft=>Seshft, clk=>clk, nrst=>nrst, ecnt=>Secnt, trampa=>Strampa); num <= Snumx(11 downto 0) when Strampa='1' else Snum(11 downto 0); end blocs; 14 Sergi Novella, Sundus Ishaque Memoria 3 En aquest codi que es mostra es destaquen tres coses per sobre: RECTANGLE VERD: La incorporació en VHDL de tot el codi s’ha simplificat gracies a la funció component de VHDL que ens permet “reciclar” el codi guardat en altres arxius del projecte.
RECTANGLE VERMELL: La incorporació ‘una tercera xifra al joc, ha fet pujar de 8 bits a 12 bits necessaris per poder treballar amb la mateixa estructura que teniem.
RECTANGLE TARONJA: La opció de poder fer trampes ens dona com a resultat aquesta última instancia remarcada on el senyal Strampa és l’encarregat de gestionar que es mostrarà o deixarà de mostrar pels displais més endavant.
--JocDE2-library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity joc_DE2_ampliacio is port(OSC_50, nrst, clkin: in std_logic; COL, KEY: in std_logic_vector( 3 downto 0); LED_GREEN: out std_logic_vector(7 downto 0); HEX0, HEX1, HEX2, HEX3, HEX4, HEX5, HEX6, HEX7: out std_logic_vector(6 downto 0); ROW: out std_logic_vector(3 downto 0)); end joc_DE2_ampliacio; architecture DE2 of joc_DE2_ampliacio is signal signal signal signal Sclk, Skey: std_logic; Skeycode: std_logic_vector(3 downto 0); Snum: std_logic_vector(11 downto 0); Sleds: std_logic_vector( 7 downto 0); component f_div is port (nrst, clkin: in std_logic; clkout: out std_logic); end component; component keytest is port (COL: in std_logic_vector(3 downto 0); clk, nrst: in std_logic; nkey: out std_logic; keycode, row: out std_logic_vector(3 downto 0) ); end component; component joc_ampliacio is port (clk, nrst, nkey: in std_logic; keycode: in std_logic_vector(3 downto 0); LEG, num: out std_logic_vector(7 downto 0)); end component; component leds is port(leg: in std_logic_vector(7 downto 0); led_green: out std_logic_vector(7 downto 0)); end component; component hex_disps is port (num0, num1, num2: in std_logic_vector(3 downto 0); HEX0, HEX1, HEX2, HEX3, HEX4, HEX5, HEX6, HEX7: out std_logic_vector(6 downto 0)); end component; 15 Sergi Novella, Sundus Ishaque Memoria 3 begin fdiv: f_div port map(nrst=> KEY(0), clkin=> OSC_50, clkout=> Sclk); ktest: keytest port map (keycode=>Skeycode, nkey=>Skey, col => COL, row=>ROW, clk=>Sclk, nrst=>KEY(0)); jo: joc_ampliacio port map(num => Snum, nrst => KEY(0), clk=> Sclk, nkey => Skey, keycode => Skeycode, LEG=>Sleds); ld: leds port map(leg => Sleds, led_green => LED_GREEN); hd: hex_disps port map(num0=>Snum(3 downto 0), num1 => Snum(7 downto 4), num2 =>Snum(11 downto 8), HEX0 => HEX0, HEX1 => HEX1, HEX2=> HEX2); HEX3<="0000000"; HEX4<="0000000"; HEX5<="0000000"; HEX6<="0000000"; HEX7<="0000000"; end DE2; En el codi de JOCDE2 l’única part afectada és l’incorporació d’un displai de 7 segments més per visualitzar les tres xifres, tan les que l’usuari escriu, com el nombre quan s’activa tampa.
Segueix la mateixa estructura que joc amb les instancies component. I tots els senyals interns necessaris.
16 ...



Comentario de mguennoun62 en 2017-12-14 15:43:45
parece estar bien