Sei sulla pagina 1di 17

Universidad de El Salvador

E scu e l a de I n ge n ie r a E l ct r ica
Sist ema s D ig it ales II (SD I215 )
Catedrtico: Ing. Salvador German.
Instructor: Br. Bryan No Castro Cortez
Gua No. 2 CPLD
Introduccin
Saber aplicar las herramientas disponibles dentro de un lenguaje de programacin otorga la
posibilidad simplificar problemas complejos, en AHDL se disponen de ciertas libreras por defecto
que pueden ser la diferencia entre un cdigo simple y uno muy extenso.
Dentro de la siguiente practica se harn uso de las libreras disponibles de MAX+PLUS para simplificar
problemas, se realizara de forma sencilla un contador y se implementara una mquina de estado,
esto permitir tener una forma de comprobar los resultados a travs de los diagramas de tiempo
resultantes de la simulacin.
Una ventaja que posee este programa es que todo cdigo que compile y simule bien, puede ser
perfectamente trasladado a dispositivos CPLD los cuales convierten los circuitos complejos, en uno
ms sencillo con el mnimo nmero de elementos posibles.
Objetivos
Aprender el uso de libreras para modelar circuitos en MAX+PLUS.
Implementar los conceptos aprendidos en clase sobre la lgica de estado a travs del
lenguaje AHDL.
Desarrollar los conceptos sobre lgica secuencial para crear circuitos aplicativos.

Desarrollo de la prctica
Ejercicio No. 1: Contador binario de cuatro bits modulo 16.
En este ejemplo se desarrollara un programa que genere un contador binario que vaya desde 0
(0000) hasta 15(1111), posee pin de reset y habilitador, ser para un dispositivo EPM3032ATC4410.
1. Se ejecuta el programa, clic en INICIO -> TODOS LOS PROGRAMAS -> MAX+PLUS II 10.2
BASELINE ->MAX+PLUS II 10.2 BASELINE.

2. Se abrir una ventana emergente, en la pestaa FILE -> NEW

3. Se selecciona la opcin TEXT EDITOR FILE y clic en OK.

4.

En la ventana emergente colocamos nuestro cdigo, en este cdigo se utilizara la librera


lpm_counter.inc que nos permite modelar contadores de cualquier modulo, ya que nos
permite elegir el numero de bits y el tipo de modulo, su uso es sencillo y prctico, esta
librera tambin incluye variables predeterminadas para funciones como el reset y la
habilitacin, el codigo ya implementado debe verse de la siguiente forma:

5.

En la pestaa FILE -> SAVE AS, se selecciona la carpeta a donde se guardan los archivos,
asegurndose que el archivo lleve el mismo nombre que el titulo dentro del programa y
clic en OK.

6. Siempre en la pestaa FILE -> PROJECT -> SET PROJECT TO CURRENT FILE

7.

La asignacin de pines en los ejemplos anteriores se haca manual pero en este caso se
recomienda dejar que el programa la realice, el dispositivo a utilizar siempre sera el
EPM3032ATC44-10

8. Luego en la pestaa FILE -> PROJECT -> SAVE AND COMPILE, si todo esta bien lanzara una
ventana como esta:

9. Luego en la pestaa FILE -> NEW -> WAVE EDITOR FILE -> OK, lanzara la siguiente ventana

10. En la pestaa NODE -> ENTER NODE FROM SNF

11. En la ventana emergente, clic en list, luego se seleccionan todos los nodos de la izquierda y
con el botn -> se incluyen en la derecha y luego ok.

12. Si se quiere visualizar todos los estados se debe aumentar el tiempo de simulacin, esto se
hace dando clic en FILE -> END TIME, luego en la ventana emergente cambiamos el tiempo
a 2us, este tiempo puede ser el que sea necesario para simular bien, para este caso con
2us basta.

13. Para visualizar toda la simulacin se da clic en la pestaa OPTIONS -> GRID SIZE

14. En la ventana emergente se le asigna un valor de 50ns esto dividir el diagrama de tiempo
en secciones de 50 ns.

15. Luego en la pestaa VIEW -> TIME RANGE, se cambia de 0.0ns a 2us.

16. Para la entrada clock_in se le da clic derecho, luego desplazarse al men overwrite
submen se selecciona la opcin clock:

17. Esto desplegara una nueva ventana, aqu nos indica el tiempo del ciclo de reloj, en este caso,
el ciclo va acorde con la separacin de la grid, por lo cual si quisiramos un ciclo mas
pequeo regresamos al paso 13 y ah colocamos el valor del semiciclo que deseemos.

18. Para las dems entradas, a reset se le asigna un 0 y a habilita se le asigna un 1, el diagrama
de tiempo debe verse asi:

19. Luego en la pestaa FILE -> PROJECT -> SAVE AND SIMULATE

20. Cuando termine dar clic en la opcin OPEN SCF, mostrara la simulacin final.

21. Para revisar la conexin de los pines y el reporte de simulacin, hay que abrir el archivo
primos.rpt con worpad o un bloc de notas.

Desarrollo de la prctica
Ejercicio No. 2: circuito detector de secuencia con maquina de Moore.
En este ejemplo se desarrollara un programa que detecte la secuencia 1000 si solapamiento,
mediante una maquina de estados Moore, empleando flip flops tipo D ara su sntesis, la salida ser
1 durante un ciclo de reloj, ser para un dispositivo EPM3032ATC44-10.
1. Se ejecuta el programa, clic en INICIO -> TODOS LOS PROGRAMAS -> MAX+PLUS II 10.2
BASELINE ->MAX+PLUS II 10.2 BASELINE.

2. Se abrir una ventana emergente, en la pestaa FILE -> NEW

3. Se selecciona la opcin TEXT EDITOR FILE y clic en OK.

4. En la ventana emergente colocamos nuestro cdigo, en este cdigo se utilizara funciones


ya predefinidas en MAX+PLUS las cuales no requieren declaracin previa, el diagrama para
el circuito es el siguiente y el codigo debe verse asi:

TITLE "MOORE";
SUBDESIGN MOORE
(
clk, reset, y
z
)

:INPUT;
:OUTPUT;

VARIABLE
ss: MACHINE OF BITS
WITH STATES

(z)
(s0
s1
s2
s3
s4
s5
s6
s7

BEGIN
ss.clk
ss.reset

=
=

clk;
reset;

TABLE
%current state, current input => next state%
ss, y
=>
ss;
s0, 0
s0, 1
s1, 0
s1, 1
s2, 0
s2, 1
s3, 0
s3, 1
s4, 0
s4, 1
s5, x
s6, x
s7, x
END TABLE;
END;

=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>

s0;
s1;
s2;
s1;
s3;
s1;
s4;
s1;
s0;
s1;
s0;
s0;
s0;

=
=
=
=
=
=
=
=

0,
0,
0,
0,
1,
0,
0,
0);

5.

En la pestaa FILE -> SAVE AS, se selecciona la carpeta a donde se guardan los archivos,
asegurndose que el archivo lleve el mismo nombre que el titulo dentro del programa y
clic en OK.

6. Siempre en la pestaa FILE -> PROJECT -> SET PROJECT TO CURRENT FILE

7.

La asignacin de pines en los ejemplos anteriores se haca manual pero en este caso se
recomienda dejar que el programa la realice, el dispositivo a utilizar siempre sera el
EPM3032ATC44-10

8. Luego en la pestaa FILE -> PROJECT -> SAVE AND COMPILE, si todo esta bien lanzara una
ventana como esta:

9. Luego en la pestaa FILE -> NEW -> WAVE EDITOR FILE -> OK, lanzara la siguiente ventana

10. En la pestaa NODE -> ENTER NODE FROM SNF

11. En la ventana emergente, clic en list, luego se seleccionan todos los nodos de la izquierda y
con el botn -> se incluyen en la derecha y luego ok.

12. Para visualizar toda la simulacin se da clic en la pestaa OPTIONS -> GRID SIZE

13. En la ventana emergente se le asigna un valor de 50ns esto dividir el diagrama de tiempo
en secciones de 50 ns.

14. Luego en la pestaa VIEW -> TIME RANGE, se cambia de 0.0ns a 1us.

15. Para las entradas, el clock se llenara como en el ejemplo anterior, reset se le asigna un 0 y
para y se le asignaran 1s en tramos especficos para que cumpla la secuencia, esto se hace
seleccionando el tramo en el diagrama de tiempo, luego click derecho sobre el area

sombreada y luego click en insert que nos mostrara las opciones, el diagrama de tiempo
debe verse asi:

16. Luego en la pestaa FILE -> PROJECT -> SAVE AND SIMULATE

17. Cuando termine dar clic en la opcin OPEN SCF, mostrara la simulacin final.

18. Para revisar la conexin de los pines y el reporte de simulacin, hay que abrir el archivo
primos.rpt con worpad o un bloc de notas.

Asignaciones
Compile y simule el programa del anexo No.1 al final de esta gua, de acuerdo a los pasos
de simulacin seguidos en el ejercicio 1, analice y documente los resultados.
Tomando como base el anexo No. 1, cree un reloj digital teniendo en cuenta que el
EPM3032ATC44-10 solo soporta tres contadores y tres decodificadores, separe el circuito
para dos dispositivos, en el primer programa deben ir el primer display para minutos y los
dos display de segundo, se debe agregar un pin de acarreo que servir como senal de reloj
para el segundo dispositivo, en el segundo programa deber ir el display faltante de
minutos y los dos display para horas, el reloj debe ser en formato de 24 horas.
Disee un programa para una chapa digital, teniendo en cuenta que la contrasea debe
ser de 4 digitos, la salida debe ser 1 durante un ciclo de reloj

Anexo 1
3 contadores en cascada, con pin de acarreo y salida directa a display de
7 segmentos.
TITLE "CONTADORCASCADA";
INCLUDE "lpm_counter.inc";
SUBDESIGN CONTADORCASCADA
(
clock_in, reset, habilita

:INPUT;

decoder2[6..0], decoder1[6..0], decoder0[6..0], acarreo

:OUTPUT;

)
VARIABLE
contador0: lpm_counter WITH (LPM_WIDTH=4, LPM_MODULUS=10);
contador1: lpm_counter WITH (LPM_WIDTH=3, LPM_MODULUS=6);
contador2: lpm_counter WITH (LPM_WIDTH=4, LPM_MODULUS=10);

sal_cont2[3..0], sal_cont1[2..0], sal_cont0[3..0]

: NODE;

BEGIN
contador0.clock =clock_in;
contador1.clock =clock_in;
contador2.clock =clock_in;

contador0.cnt_en = habilita;
contador1.cnt_en = habilita & contador0.eq[9];
contador2.cnt_en = habilita & contador0.eq[9] & contador1.eq[5];

contador0.aclr = reset;
contador1.aclr = reset;
contador2.aclr = reset;

sal_cont0[3..0] = contador0.q[];
sal_cont1[2..0] = contador1.q[];
sal_cont2[3..0] = contador2.q[];

CASE

sal_cont0[] IS
WHEN 0

=>

decoder0[] = B"1111110";

WHEN 1

=>

decoder0[] = B"0110000";

WHEN 2

=>

decoder0[] = B"1101101";

WHEN 3

=>

decoder0[] = B"1111001";

WHEN 4

=>

decoder0[] = B"0110011";

WHEN 5

=>

decoder0[] = B"1011011";

WHEN 6

=>

decoder0[] = B"1011111";

WHEN 7

=>

decoder0[] = B"1110000";

WHEN 8

=>

decoder0[] = B"1111111";

WHEN 9

=>

decoder0[] = B"1111011";

WHEN 0

=>

decoder1[] = B"1111110";

WHEN 1

=>

decoder1[] = B"0110000";

WHEN 2

=>

decoder1[] = B"1101101";

WHEN 3

=>

decoder1[] = B"1111001";

WHEN 4

=>

decoder1[] = B"0110011";

WHEN 5

=>

decoder1[] = B"1011011";

WHEN 0

=>

decoder2[] = B"1111110";

WHEN 1

=>

decoder2[] = B"0110000";

END CASE;
CASE

sal_cont1[] IS

END CASE;
CASE

sal_cont2[] IS

WHEN 2

=>

decoder2[] = B"1101101";

WHEN 3

=>

decoder2[] = B"1111001";

WHEN 4

=>

decoder2[] = B"0110011";

WHEN 5

=>

decoder2[] = B"1011011";

WHEN 6

=>

decoder2[] = B"1011111";

WHEN 7

=>

decoder2[] = B"1110000";

WHEN 8

=>

decoder2[] = B"1111111";

WHEN 9

=>

decoder2[] = B"1111011";

END CASE;
IF

contador0.eq[9] & contador1.eq[5] & contador2.eq[9] == 1 THEN


acarreo = B"1";

ELSE
acarreo = B"0";
END IF;
END;

Potrebbero piacerti anche