Anda di halaman 1dari 20

qwertyuiopasdfghjklzxcvbnmqw ertyuiopasdfghjklzxcvbnmqwert yuiopasdfghjklzxcvbnmqwertyui UNIVERSIDAD DE GUANAJUATO Electrnica Digital II opasdfghjklzxcvbnmqwertyuiopa sdfghjklzxcvbnmqwertyuiopasdf ghjklzxcvbnmqwertyuiopasdfghj klzxcvbnmqwertyuiopasdfghjklz xcvbnmqwertyuiopasdfghjklzxcv bnmqwertyuiopasdfghjklzxcvbn mqwertyuiopasdfghjklzxcvbnmq wertyuiopasdfghjklzxcvbnmqwe

rtyuiopasdfghjklzxcvbnmqwerty uiopasdfghjklzxcvbnmqwertyuio pasdfghjklzxcvbnmqwertyuiopas dfghjklzxcvbnmqwertyuiopasdfg hjklzxcvbnmqwertyuiopasdfghjk


PROYECTO FINAL Cabrera Sierra Ren Garca Villagmez Jos Mara Jurez Jurez German Velasco Coronel Dayniz Yael

RELOJ DE DOCE HORAS Introduccin: Al finalizar este curso se ha cubierto el marco terico de la Electrnica Digital con las tcnicas de diseo secuencial, se ha revisado la aritmtica binaria que opera en los sistemas digitales y sus principales bloques funcionales. Tambin se ha utilizado ampliamente el lenguaje descriptivo de hardware VHDL para inferir, simular y sintetizar los principales bloques funcionales de la electrnica secuencial. El siguiente paso consiste en realizar un proyecto final en donde se ponga en prctica los conocimientos tericos y prcticos adquiridos durante el curso, aplicndolos a la realizacin de diseos como sistemas digitales completos. Para probar y hacer funcionar un sistema secuencial, es necesario contar con un circuito que genere la seal de reloj, denominado base de tiempo. Fundamentalmente existen tres tcnicas principales para generar una base de tiempo peridica. Si se desea reproducir manualmente una forma de onda de un sistema secuencial, es necesario contar con un circuito que permita realizar los cambios en la seal de reloj de manera controlada y sin rebotes. El fenmeno de los rebotes se da en cualquier sistema mecnico o electromecnico al cambiar de estado, puesto que es fsicamente imposible que el cambio se realice de manera fija y precisa. Si se utiliza un interruptor para generar pulsos de reloj, manuales, como seal de control en los elementos de memoria de un sistema secuencial, no se puede garantizar la correcta operacin del mismo, debido a que la seal contiene rebotes o incertidumbres en su funcionamiento. Una tcnica particularmente til para poder realizar una seal de reloj manual consiste en el circuito denominado eliminador de rebotes. Este circuito, basado en un dispositivo de memoria asncrona, solamente atiende al cambio de estado del interruptor. Objetivos: Disear un reloj de doce horas que empiece a las 12:00 hrs y termine a las 11:59. Que con un push-button se puedan cambiar las horas y con otro los minutos, y si se dejan apretados los push-button las horas y minutos se incrementen a cada segundo, con la condicin que al incrementar los minutos con el push-button no se incrementen las horas. Desarrollo: Empleamos el diseo top-down que se menciona en el libro que utilizamos como bibliografa, este consiste en comenzar a disear desde el nivel superior y despus se va fragmentando hasta los bloques bsicos. En el bloque del primer nivel de abstraccin en el diseo jerrquico. Se encuentran las terminales de entrada y salida. Se muestran en la Figura 1.1, las entradas del reloj maestro y el reset junto con las salidas a los displays.

Figura 1.1 Reloj_12h

En un segundo nivel de abstraccin se puede pensar que el sistema quede formado como se muestra en la Figura 1.2, donde se cuenta con dos bloques generales: un generador de base de tiempo de un minuto y un contador de horas y minutos con salida en 7 segmentos.

Figura 1.2 Diagrama de bloques del reloj El generador de base de tiempo de un minuto de la figura 1.2 toma la seal de reloj y genera un pulso nico una vez que se ha completado el minuto de tiempo y lo enva por medio de la seal M a la siguiente etapa. El contador de horas y minutos incrementa su cuenta cada vez que le llega un pulso en M, en la forma en que operan los relojes y proporciona las salidas en cdigo de 7 segmentos. En el tercer nivel jerrquico, el mdulo generador de base de tiempo de un minuto, es un contador descendente mdulo 240,000,000 que comienza la cuenta en 239,999,999 y cuando llega a 0 entrega el pulso de salida a M y reinicia la cuenta. Dentro del tercer nivel jerrquico, el contador de 12 horas puede ser formado por tres contadores con habilitacin de entrada y salida para formar la cadena de la cuenta separada en unidades y decenas de minutos y horas como se muestra en la Figura 1.3.

Figura 1.3 Diagrama de bloques del contador de 12 horas. Los componentes de tercer nivel de jerarqua son secuenciadores que entregan directamente el cdigo en 7 segmentos de la cuenta por lo que pueden ser declarados como unidades primarias. Hasta se ha mostrado solo el diseo de un reloj de doce, pero para que al implementarlo en la tarjeta Cyclone III funcione correctamente tenemos que eliminar los rebotes cuando se apriete el push-button, para ello diseamos un cuarto nivel en donde se describe un contador de 200 ms que se utiliza para eliminar los rebotes y contador de un segundo, lo cuales van conectado a un bloque que controla la seal que enva el push-button al presionarlo. El contador de 200ms tiene una seal de entrada que se activa cuando se presiona el push-button indicando que el contador comience la cuenta para eliminar los rebotes, al terminar la cuenta manda una seal T0 que entra al bloque control_rebotes donde activa el contador de un segundo el cual manda una seal para activar el secuenciador de

minutos u horas segn sea el caso para incrementar las horas o los minutos. El bloque se muestra en la Figura 1.4 para los minutos y en la figura 1.5 para las horas.

Figura 1.4 Diagrama del control de rebotes para los minutos

Figura 1.5 Diagrama de control de rebotes para las horas

Incluyendo el control de rebotes al reloj de doce horas, el bloque del segundo nivel jerrquico para el contador de doce horas queda como se muestra en la Figura 1.6.

Figura 1.6 Contador de 12 horas con el control de rebotes en las horas y en los minutos El bloque de primer nivel se muestra en la figura 1.7.

Figura 1.7 Reloj de doce con el control de rebotes en las horas y minutos

Los cdigos que se utilizaron para describir cada bloque en VHDL se muestran a continuacin: a) Secuenciador de las UNIDADES de minuto

Figura 1.8 Bloque secuencial y grafo de la FSM que describe a las unidades de minutos Cdigo:
library IEEE; use IEEE.std_logic_1164.all; entity unidades is port( RST : in std_logic; CLK : in std_logic; HE : in std_logic; Y : in std_logic; HS : out std_logic; UM : out std_logic_vector(1 to 7) ); End unidades; architecture Nivel_3 of unidades is signal Qp,Qn: std_logic_vector(1 to 7); begin combinacional: process(HE,Y,Qp) begin if (HE='1')then case Qp is when "0000001" => Qn<= "1001111"; HS <= '0'; when "1001111" => Qn<= "0010010"; HS <= '0'; when "0010010" => Qn<= "0000110"; HS <= '0'; when "0000110" => Qn<= "1001100"; HS <= '0'; when "1001100" => Qn<= "0100100"; HS <= '0'; when "0100100" => Qn<= "0100000";

--0

--1

--2

--3

--4

--5

HS <= '0'; when "0100000" => Qn<= "0001111"; HS <= '0'; when "0001111" => Qn<= "0000000"; HS <= '0'; when "0000000" => Qn<= "0000100"; HS <= '0'; when others => Qn<= "0000001"; HS <= '1'; end case; else Qn<=Qp; HS <='0'; end if; if(Y='1')then case Qp is when "0000001" => Qn<= "1001111"; HS <= '0'; when "1001111" => Qn<= "0010010"; HS <= '0'; when "0010010" => Qn<= "0000110"; HS <= '0'; when "0000110" => Qn<= "1001100"; HS <= '0'; when "1001100" => Qn<= "0100100"; HS <= '0'; when "0100100" => Qn<= "0100000"; HS <= '0'; when "0100000" => Qn<= "0001111"; HS <= '0'; when "0001111" => Qn<= "0000000"; HS <= '0'; when "0000000" => Qn<= "0000100"; HS <= '0'; when others => Qn<= "0000001"; HS <= '1'; end case; else Qn<=Qp; end if; UM<=Qp; end process combinacional; Secuencial: process(RST,CLK) begin if(RST='0')then Qp<= "0000001" ; elsif(CLK'event and CLK='1')then Qp<= Qn; end if; end process Secuencial; end Nivel_3;

--6

--7

--8

--9

--0

--1

--2

--3

--4

--5

--6

--7

--8

--9

b) Secuenciador de las DECENAS de minuto

Figura 1.9 Bloque secuencial y grafo de la FSM que describe al secuenciador de las decenas de minutos Cdigo:
library IEEE; use IEEE.std_logic_1164.all; entity decenas is port( RST : in std_logic; CLK : in std_logic; HE : in std_logic; HS : out std_logic; DM : out std_logic_vector(1 to 7) ); End decenas; architecture Nivel_3 of decenas is signal Qp,Qn: std_logic_vector(1 to 7); begin combinacional: process(HE,Qp) begin if (HE='1')then case Qp is when "0000001" => Qn<= "1001111"; HS <= '0'; when "1001111" => Qn<= "0010010"; HS <= '0'; when "0010010" => Qn<= "0000110"; HS <= '0'; when "0000110" => Qn<= "1001100"; HS <= '0'; when "1001100" => Qn<= "0100100"; HS <= '0'; when others => Qn<= "0000001"; HS <= '1'; end case; else Qn<=Qp; HS <='0'; end if; DM<=Qp; end process combinacional; Secuencial: process(RST,CLK) begin if(RST='0')then Qp<="0000001"; elsif(CLK'event and CLK='1')then Qp<= Qn; end if; end process Secuencial; end Nivel_3;

--0

--1

--2

--3

--4

--5

c) Secuenciador de las HORAS

Figura 1.10 Bloque secuencial y grafo de la FSM que describe al secuenciador de las horas Cdigo:
library IEEE; use IEEE.std_logic_1164.all; entity horas is port( RST : in std_logic; CLK : in std_logic; X : in std_logic; HE : in std_logic; S : in std_logic; UH : out std_logic_vector(1 to 7); DH : out std_logic_vector(2 downto 1) ); End horas; architecture Nivel_3 of horas is signal Qn, Qp: std_logic_vector(1 to 9); begin combinacional: process(X,S,HE,Qp) begin if(HE='1')then case Qp is when "001001000" => --12 Qn<="100111111"; when "100111111" => --1 Qn<= "001001011"; when "001001011" => Qn<= "000011011"; when "000011011" => Qn<= "100110011"; when "100110011" => Qn<= "010010011"; when "010010011" => Qn<= "010000011"; when "010000011" => Qn<= "000111111"; when "000111111" => Qn<= "000000011"; --2

--3

--4

--5

--6

--7

when "000000011" => Qn<= "000010011"; when "000010011" => Qn<= "000000100"; when "000000100" => Qn<= "100111100"; when others => --11 Qn<= "001001000"; end case; else Qn<=Qp; end if; if(X='1')then case Qp is when "001001000" => --12 Qn<="100111111"; when "100111111" => --1 Qn<= "001001011"; when "001001011" => Qn<= "000011011"; when "000011011" => Qn<= "100110011"; when "100110011" => Qn<= "010010011"; when "010010011" => Qn<= "010000011"; when "010000011" => Qn<= "000111111"; when "000111111" => Qn<= "000000011"; when "000000011" => Qn<= "000010011"; when "000010011" => Qn<= "000000100"; when "000000100" => Qn<= "100111100"; when others => --11 Qn<= "001001000"; end case; else Qn<=Qp; end if; if(S='1')then case Qp is when "001001000" => --12 Qn<="001001000"; when "100111111" => --1 Qn<="100111111" ;

--8

--9

--10

--2

--3

--4

--5

--6

--7

--8

--9

--10

when "001001011" => Qn<= "001001011"; when "000011011" => Qn<= "000011011"; when "100110011" => Qn<= "100110011"; when "010010011" => Qn<= "010010011"; when "010000011" => Qn<= "010000011"; when "000111111" => Qn<= "000111111"; when "000000011" => Qn<= "000000011"; when "000010011" => Qn<="000010011"; when "000000100" => Qn<="000000100"; when "100111100" => --11 Qn<= "100111100"; when others => Qn<="001001000";

--2

--3

--4

--5

--6

--7

--8

--9

--10

end case; end if UH <= Qp(1 to 7); DH <=Qp(8 to 9); end process combinacional; Secuencial: process(RST,CLK) begin if(RST='0')then Qp<= "001001000"; --Inicia en 12 representado en 7 segmentos elsif(CLK'event and CLK='1')then Qp<= Qn; end if; end process Secuencial; end Nivel_3;

d) Generador de un minuto

Figura 1.11Diagrama de la FSM que describe al generador de un minuto

Cdigo:
library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_arith.all; use EEE.std_logic_unsigned.all; entity genera_minuto is port( RST : in std_logic; CLK : in std_logic; M : out std_logic ); End genera_minuto; architecture Nivel_2 of genera_minuto is signal Qp,Qn: std_logic_vector(31 downto 0); begin combinacional: process(Qp) begin if(Qp="00000000000000000000000")then M <='1'; Qn<="10110010110100000101110111111111"; -- 60 segundos else M <='0'; Qn<=Qp-1; end if; end process combinacional; Secuencial: process(RST,CLK) begin if(RST='0')then Qp<="10110010110100000101110111111111"; elsif(CLK'event and CLK='1')then Qp<= Qn; end if; end process Secuencial; end Nivel_2;

e) Contador de 1 segundo

Figura 1.12Diagrama de la FSM que describe al contador de 1 segundo Cdigo:


library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_arith.all; use IEEE.std_logic_unsigned.all; entity contador_1s is port( RST : in std_logic; CLK : in std_logic; P1 : in std_logic; T1 : out std_logic ); end contador_1s;

architecture Descendente of contador_1s is signal Qn,Qp : std_logic_vector(25 downto 0); begin Secuencial: process(RST,CLK) begin if(RST='0')then Qp<=(others=>'0'); elsif(CLK'event and CLK='1')then Qp<= Qn; end if; end process Secuencial; Combinacional:process(P1,Qp) begin case P1 is when '1' => if(Qp<= "00000000000000000000000000")then Qn<= "10111110101111000001111111"; --- base de tiempo de un segundo T1 <= '1'; else Qn<= Qp - 1; T1 <= '0'; end if; when others => Qn<=Qp; end case; end process Combinacional; end Descendente;

f)

Contador de 100 ms

Figura 1.13Diagrama de la FSM que describe al contador de 100 ms Cdigo:


library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_arith.all; use IEEE.std_logic_unsigned.all; entity contador_100ms is port( RST : in std_logic; CLK : in std_logic; P : in std_logic; T0 : out std_logic ); end contador_100ms; architecture Descendente of contador_100ms is signal Qn,Qp : std_logic_vector(22 downto 0); begin

Secuencial: process(RST,CLK) begin if(RST='0')then Qp<=(others=>'0'); elsif(CLK'event and CLK='1')then Qp<= Qn; end if; end process Secuencial; Combinacional:process(P,Qp) begin case P is when '1' => if(Qp<= "00000000000000000000000") then Qn<= "11100100111000011011111"; -- 150 ms T0 <= '1'; else Qn<= Qp - 1; T0 <= '0'; end if; when others => Qn<=Qp; end case; end process Combinacional; end Descendente;

g) Control de rebotes

Figura 1.14Diagrama de la FSM que describe al circuito que controla los rebotes

Figura 1.15Grafo de la FSM que describe al circuito que controla los rebotes Cdigo:
library IEEE; use IEEE.std_logic_1164.all; entity control_rebotes_h is

port( RST : in std_logic; CLK : in std_logic; BTN,Z,EOC: in std_logic; STR,OPC,H: out std_logic ); End control_rebotes_h; architecture FSM of control_rebotes_h is signal Qn,Qp: std_logic_vector(2 downto 0) begin combinacional: process(BTN,Z,EOC,Qp) begin case Qp is when "000" => --S0 case BTN is when '1' =>Qn<=Qp; when others =>Qn<="001"; end case; STR<='0'; OPC<='0'; H <='0'; when "001" => --S1 case Z is when '0' =>Qn<=Qp; when others =>Qn<="010"; end case; STR<='1'; OPC<='0'; H <='0'; when "010" => case BTN is when '0' =>Qn<="011"; when others =>Qn<="110"; end case; STR<='0'; OPC<='0'; H <='1'; when "011" => --S3 case EOC is when '0' =>Qn<=Qp; when others =>Qn<="111"; if (EOC='1')then Qn<="100"; else Qn<=Qp; end if; end case; STR<='0'; OPC<='1'; H <='0'; when "100" => --S4 case BTN is when '0' =>Qn<= "101"; when others =>Qn<= "110"; end case; STR<='0'; OPC<='0'; H <='1'; when "101" => --S5

case EOC is when '0' =>Qn<= Qp; when others =>Qn<= "100"; end case; STR<='0'; OPC<='1'; H <='0'; when "110" => --S6 case Z is when '0' =>Qn<=Qp; when others =>Qn<="000"; end case; STR<='1'; OPC<='1'; H <='0'; when others=>Qn<= "000"; STR<='0'; OPC<='0'; H<='0'; end case; end process combinacional; Secuencial: process(RST,CLK) begin if(RST='0')then Qp<=(others=>'0'); elsif(CLK'event and CLK='1')then Qp<= Qn; end if; end process Secuencial; end FSM;

h) General_rebotes

Figura 1.16Diagrama de la FSM del general_rebotes Cdigo:


library IEEE; use IEEE.std_logic_1164.all; entity general_rebotes is port( RST : in std_logic; CLK : in std_logic; BTN : in std_logic; H : out std_logic ); End general_rebotes; architecture simple of general_rebotes is component control_rebotes_h port( RST : in std_logic;

CLK : in std_logic; BTN,Z,EOC : in std_logic; STR,OPC,H : out std_logic ); end component; component contador_100ms port( RST : in std_logic; CLK : in std_logic; P :instd_logic; T0 : out std_logic ); end component; component contador_1s port( RST : in std_logic; CLK : in std_logic; P1 : in std_logic; T1 : out std_logic ); end component; signal T0,T1:std_logic; signal Z,EOC,STR,OPC,P,P1:std_logic; begin U1: control_rebotes_h port map(RST,CLK,BTN,T0,T1,STR,OPC,H); U2: contador_100ms portmap(RST,CLK,STR,T0); U3: contador_1s portmap(RST,CLK,OPC,T1); end simple;

i)

Contador de 12 horas

Figura 1.17Diagrama de la FSM que describe al contador de 12 horas Cdigo:


library IEEE; use IEEE.std_logic_1164.all; entity contador_12h is port( RST : in std_logic; CLK : in std_logic; M : in std_logic; BTN : in std_logic; BTN_1: in std_logic; UM : out std_logic_vector(1 to 7); DM : out std_logic_vector(1 to 7); UH : out std_logic_vector(1 to 7); DH : out std_logic_vector(2 downto 1) );

end contador_12h; architecture Nivel_2 of contador_12h is component unidades port( RST : in std_logic; CLK : in std_logic; HE : in std_logic; Y : in std_logic; HS : out std_logic; UM : out std_logic_vector(1 to 7) ); end component; component decenas port( RST : in std_logic; CLK : in std_logic; HE : in std_logic; HS : out std_logic; DM : out std_logic_vector(1 to 7) ); end component;

component horas port( RST : in std_logic; CLK : in std_logic; HE : in std_logic; X : in std_logic; S :in std_logic; UH : out std_logic_vector(1 to 7); DH : out std_logic_vector(2 downto 1) ); end component; component general_rebotes port( RST : in std_logic; CLK : in std_logic; BTN : in std_logic; H : out std_logic ); end component; component general_rebotes_m port( RST : in std_logic; CLK : in std_logic; BTN_1: in std_logic; M_1 : out std_logic ); end component; signal S, M_1,Y,X,H,H1, H2: std_logic; begin Modulo_3: unidades port map(RST, CLK, M,M_1,H1, UM); Modulo_4: decenas port map(RST, CLK, H1, H2, DM); Modulo_5: horas port map(RST, CLK,H2,H,M_1, UH,DH); Modulo_6:general_rebotes port map(RST,CLK,BTN,H); Modulo_7:general_rebotes_m port map(RST,CLK,BTN_1,M_1); end Nivel_2;

j)

Reloj de 12 horas

Figura 1.18Diagrama de la FSM que describe al reloj de doce horas Cdigo:


library IEEE; use IEEE.std_logic_1164.all; entity reloj_12h is port( RST : in std_logic; CLK : in std_logic; BTN : in std_logic; BTN_1 : in std_logic; UM : out std_logic_vector(1 to 7); DM : out std_logic_vector(1 to 7); UH : out std_logic_vector(1 to 7); DH : out std_logic_vector(2 downto 1) ); end reloj_12h; architecture Nivel_1 of reloj_12h is component genera_minuto port( RST : in std_logic; CLK : in std_logic; M : out std_logic ); end component; component contador_12h port( RST : in std_logic; CLK : in std_logic; M : in std_logic; BTN : in std_logic; BTN_1 : in std_logic; UM : out std_logic_vector(1 to 7); DM : out std_logic_vector(1 to 7); UH : out std_logic_vector(1 to 7); DH : out std_logic_vector(2 downto 1) ); end component; signal M_1,H,M: std_logic; begin Modulo_1: genera_minuto port map(RST, CLK, M); Modulo_2: contador_12h port map(RST, CLK, M,BTN,BTN_1, UM, DM, UH, DH); end Nivel_1;

Conclusiones: Al realizar este proyecto, nos dimos cuenta de la importancia de saber utilizar el lenguaje VHDL, este lenguaje es de gran ayuda para resolver problemas en el mundo de la electrnica digital, as como en el modelado e implementacin de sistemas digitales para aplicaciones industriales y en sus diversas opciones de aplicacin, la elaboracin del proyecto nos llev mucho tiempo, tuvimos muchos problemas para la realizacin del cdigo, especialmente para los botones de las horas y los minutos, otro problema que tuvimos era que cuando adelantbamos los minutos, al llegar al minuto 59, se nos adelantaba tambin la hora, lo cual era incorrecto de acuerdo a las restricciones que nos indic el profesor. El problema de los botones era que al apretar un botn, ste nos mandaba muchos rebotes y el programa para eliminarlos no lo haca correctamente. Este problema lo corregimos con un contador de 150 ms, realizamos varias pruebas con diferentes tiempos desde los 100 ms hasta los 200 ms para eliminar los rebotes y el tiempo que nos pareci mejor para eliminar los rebotes fue el de 150 ms. El problema de los minutos lo corregimos con otro contador de 60 segundos, para que nos adelantara un minuto cada segundo y despus de llegar al 59 cambiara a 00 pero sin adelantar las horas. Despus de hacer varios ajustes, por fin logramos que el programa funcionara correctamente de acuerdo a las restricciones que nos indic el profesor. Anexo: Anexamos la simulacin que se realiz en VHDL del reloj funcionando

Anda mungkin juga menyukai