Reporte Práctica 1

23
Reporte de Práctica Cd. Victoria, Tamaulipas - Octubre 2012 1 Universidad Politécnica de Victoria Maestría en Ingeniería Tarea 1 Reporte de Práctica Profesor: Dr. Marco Aurelio Nuño Maganda Materia: Procesadores Digitales Alumno: Sergio Isauro Flores Vázquez

Transcript of Reporte Práctica 1

Page 1: Reporte Práctica 1

Reporte de Práctica

Cd. Victoria, Tamaulipas - Octubre 2012 1

Universidad Politécnica de Victoria

Maestría en Ingeniería

Tarea 1

Reporte de Práctica

Profesor: Dr. Marco Aurelio Nuño Maganda

Materia:

Procesadores Digitales

Alumno: Sergio Isauro Flores Vázquez

Page 2: Reporte Práctica 1

Reporte de Práctica

Cd. Victoria, Tamaulipas - Octubre 2012 2

Introducción

En este reporte de practica se podrá leer la descripción detallada de todo el proceso que se

siguió para llevar a cabo la práctica 1 que consto de dos ejercicios del libro “Digital Design

with CPLD Applications & VHDL”. Estos ejercicios se describirán a continuación.

Para el desarrollo de la práctica se tuvo que recurrir a las técnicas tanto de construcción como

de simplificación de circuitos lógicos digitales ya que, por ejemplo, en cada uno de los

ejercicios se nos dio una tabla de verdad a partir de la cual se escribió su función booleana.

Una vez obtenida la función booleana se redujo por medio de Mapas de Karnaugh y esta

reducción se comprobó mediante algebra booleana.

También se tuvieron que construir estos circuitos utilizando lenguaje VHDL, para esto se

utilizo un software proporcionado por el profesor llamada Aldec Active-HDL versión 8.1.

A continuación se mostrara a detalle cada uno de los problemas desarrollados en la práctica.

Page 3: Reporte Práctica 1

Reporte de Práctica

Cd. Victoria, Tamaulipas - Octubre 2012 3

Desarrollo de la Práctica

Problema 3.29 (Capitulo 3 - Digital Design with CPLD Applications & VHDL )

Resolver el siguiente ejercicio de simplificación de funciones lógicas mediante dos métodos:

1. Utilizando teoremas de Algebra Booleana 2. Utilizando el método de Mapas de Karnaugh

Implementar en VHDL ambas funciones (original y simplificada) y validar mediante una simulación la equivalencia de ambas funciones. En la Fig. 1 podremos ver la tabla de verdad del primer ejercicio.

A B C D Y

0 0 0 0 1

0 0 0 1 0

0 0 1 0 0

0 0 1 1 1

0 1 0 0 1

0 1 0 1 0

0 1 1 0 0

0 1 1 1 0

1 0 0 0 1

1 0 0 1 0

1 0 1 0 1

1 0 1 1 1

1 1 0 0 1

1 1 0 1 0

1 1 1 0 1

1 1 1 1 1 Fig.- Tabla de Verdad de ejercicio 1

Una vez que se nos proporcionó la tabla de verdad podemos usarla para obtener su función

Booleana, esta se construye tomando los valores que hay en la combinación de entradas (A,

B, C, D) en donde la salida este marcada como un 1 lógico.

Esta es la función lógica de la tabla de verdad mostrada:

Y = A’B’C’D’ + A’B’CD + A’BC’D’ + AB’C’D’ + AB’CD’ + AB’CD + ABC’D’ + ABCD’ + ABCD

Page 4: Reporte Práctica 1

Reporte de Práctica

Cd. Victoria, Tamaulipas - Octubre 2012 4

En base a la función lógica se puede crear el circuito lógico original, aun sin simplificar. Como

ya es sabido para construir el circuito lógico se utiliza la función booleana anterior, los

elementos multiplicados son unidos en una sola compuerta lógica AND y los elementos que

se suman, se unen mediante una compuerta lógica OR.

Cabe destacar que las compuertas lógicas utilizadas fueron adaptadas a las encontradas

comercialmente, por ejemplo en el caso de la compuerta OR, nuestra función cuenta con 6

elementos que deben ser sumados y esto se tuvo que adaptar en dimensión a las compuertas

OR de 4 entradas 1 salida, por lo que se usaron 3 compuertas en total.

En la Fig. 2 se puede ver la forma en que fue construido el circuito lógico tomado

directamente de la tabla de verdad. El circuito fue diseñado en la sección de construcción de

diagramas lógicos del programa Aldec Active-HDL.

Fig. 2.- Circuito Lógico No Simplificado (Ejercicio 1).

Page 5: Reporte Práctica 1

Reporte de Práctica

Cd. Victoria, Tamaulipas - Octubre 2012 5

El siguiente paso fue que en base a la función lógica original se tuvo que realizar una

simplificación del circuito, esto con el fin de ver el modo en que el circuito es minimizado

logrando así un ahorro tanto en cantidad como en costo de componentes.

El Mapa de Karnaugh no es más que una representación visual de la tabla de verdad, esta

herramienta aprovecha la capacidad de nuestro cerebro para reconocer patrones y la

expresión analítica, de este modo es como nos es posible eliminar patrones o condiciones

redundantes. Para construirlo solo se necesita transferir los términos de la tabla de verdad al

mapa k en forma directa, es decir solo colocando los unos o ceros en su coordenada

respectiva.

En la Fig. 3 podemos ver como fue construido el Mapa K del ejercicio 1

Fig. 3.- Mapa de Karnaugh (ejercicio 1).

Una vez construido el mapa de Karnaugh, el siguiente paso es seleccionar los conjuntos de

términos de manera tal que se obtenga el menor número de términos posible. Estos términos

se seleccionan formando grupos de rectángulos cuyas áreas sean potencia de 2 tratando de

agrupar el mayor número de términos posible.

La función lógica fue reducida satisfactoriamente mediante la herramienta de Mapa K y quedo

de la siguiente manera:

Y = C’D’ + AC+ B’CD

Claramente se puede ver que después de la minimización los términos fueron reducidos en

gran medida, de tener 9 elementos sumados de 4 variables cada uno, ahora tenemos esta

función reducida a 3 elementos sumados de 2 y 3 términos. Gracias a esta reducción en la

función booleana el circuito lógico también es minimizado y trabaja del mismo modo que el

original.

En la Fig. 4. Podremos ver como quedo construido el circuito lógico de esta función booleana

reducida.

Page 6: Reporte Práctica 1

Reporte de Práctica

Cd. Victoria, Tamaulipas - Octubre 2012 6

Fig. 4.- Circuito Lógico reducido mediante Mapa de Karnaugh.

Por último solo hace falta realizar la simplificación de la función lógica original haciendo uso

del álgebra Booleana. A continuación se desarrollará el procedimiento.

Y = A’B’C’D’ + A’B’CD + A’BC’D’ + AB’C’D’ + AB’CD’ + AB’CD + ABC’D’ + ABCD’ + ABCD

(Función Original)

Y = A’B’C’D’ + A’B’CD + ABC’D’ + AB’C’D’ + ABCD + ABCD’ + AB’CD + AB’CD’ + A’B’CD + AB’CD

(Reacomodando términos según Mapa de Karnaugh)

C’D’ (A’B’ + AB) + C’D’ (A´B + AB’) >>> se eliminan los términos en paréntesis por el teorema de cancelación

C’D’ + C’D’ = C’D’ >>> se queda un solo termino por el teorema de idempotencia

C’D’ + ABCD + ABCD’ + AB’CD + AB’CD’ + A’B’CD + AB’CD

AC (BD + B’D’) + AC (BD’ + B’D) >>> Igual, se eliminan términos entre paréntesis por cancelación

AC + AC = AC

C’D’ + AC + A’B’CD + AB’CD

B’CD (A’ + A)

C’D’ + AC + B’CD (Función Reducida igual a la obtenida con Mapas K)

Page 7: Reporte Práctica 1

Reporte de Práctica

Cd. Victoria, Tamaulipas - Octubre 2012 7

Hasta este punto ya se realizo todo el trabajo a mano o a lápiz, por así decirlo, ya que el

siguiente paso fue implementar estos dos circuitos (original y simplificado) en un software de

diseño en lenguaje VHDL.

Para empezar a trabajar en esta parte de la práctica primero iniciamos el programa Aldec

Active VHDL, en este caso usamos la versión 8.1. La Fig. 5 nos muestra la pantalla de

bienvenida del software.

Fig. 5.- Pantalla de Bienvenida de Aldec Active VHDL.

Al terminar el proceso de carga del programa nos aparecerá un cuadro de dialogo como el de

la Fig. 6, en el seleccionaremos “Create a New Work Space”

Nota: En la imagen mostrada aparecen varios diseños creados, esto es porque al momento

de redactar este reporte los diseños ya habían sido terminados.

Fig. 6.- Getting Started

Page 8: Reporte Práctica 1

Reporte de Práctica

Cd. Victoria, Tamaulipas - Octubre 2012 8

Al Work Space lo llamaremos Problema_tarea_1, después de esto hay que crear un nuevo

diseño para empezar a trabajar en el, en este caso nuestro diseño será el correspondiente al

primer ejercicio asignado, que es el que se ha ido mostrando en las páginas anteriores.

La creación de diseños corresponde al diseño en donde se alojaran los circuitos original,

simplificado y la validación de estos dos, pero hay que recordar que también tienen que ser

creadas las compuertas y circuitos de forma separada dentro del diseño.

Para crear un nuevo diseño hay que seleccionar, “Create New Design” y nos aparece una

ventana como la que se muestra en la Fig. 7.

Fig. 7.- New Disign Wizard

A cada diseño hay que ajustarle las propiedades básicas, estas se dejan tal cual aparecen por

default en la pantalla de modificación, además tenemos que asignarle un nombre a cada

diseño.

Fig. 8 y 9.- Default Properties e Información Básica de los Diseños.

Page 9: Reporte Práctica 1

Reporte de Práctica

Cd. Victoria, Tamaulipas - Octubre 2012 9

Una vez que se creo el primer diseño bajo el nombre “Problema_1” hay que empezar a crear

las arquitecturas de las compuertas lógicas que se van a utilizar, para esto nos dirigimos a la

sección de “Add new file” en la sección de “Design Browser”, se selecciona la opción de VHDL

Source Code para crear la arquitectura de la compuerta lógica.

Fig. 10.- Abriendo un nuevo Archivo (Creación de elementos)

Cuando se llegue al punto en donde se nos pida asignarle el nombre a cada archivo y a su

arquitectura de trabajo se usara el mismo nombre solo agregando las siglas Arq seguidas de

un guion bajo antes del nombre del diseño (por ejemplo: Arq_nombre de diseño), esto solo

con el fin de diferenciar visualmente los nombres para evitar confusiones.

Fig. 11.- Nomenclatura utilizada en Archivos y Arquitecturas de Archivos

En la Fig. 12 se muestra un ejemplo de como puede ser creada una compuerta lógica, en este

punto solo se definen el nombre de cada puerto de entrada y salida. Esta forma de asignación

será la misma que se empleará en la creación de circuitos y en la validación.

Page 10: Reporte Práctica 1

Reporte de Práctica

Cd. Victoria, Tamaulipas - Octubre 2012 10

Fig. 12.- Ejemplo de Asignación y Etiquetado de puertos de compuertas y/o circuitos.

Una vez creado el nuevo elemento (Ya sea compuerta, circuito o bloque de validación) el

siguiente paso es asignarle la operación lógica que hará, esto mediante lenguaje VHDL.

Para hacer esto basta con dirigirnos a la sección del “Design Browser” en donde esta el

elemento creado y dar click para abrir la opción de edición en VHDL, en la Fig. 13 se muestra

como ejemplo como es asignada la función lógica AND a un archivo creado con 3 puertos,

dos entradas y una salida, en la sección de entity vemos la asignación de puertos y en la

sección después de la arquitectura denotada con la palabra clave “begin” es en donde

escribimos como trabajará este elemento. Para el caso de la compuerta AND se escribió en

código lo siguiente: S <= A and B; con esto decimos que se hará la función lógica AND entre

los puertos A y B y el resultado será asignado al puerto de salida denotado como S.

Fig. 13.- Asignación de modo de trabajo a los archivos creados

(Ejemplo de Compuerta AND).

Page 11: Reporte Práctica 1

Reporte de Práctica

Cd. Victoria, Tamaulipas - Octubre 2012 11

Cuando hayamos terminado de crear todas las compuertas lógicas, nos aparecerán en el

Design Browser tal como se muestra en la Fig. 14.

Fig. 14 Design Browser con todos los archivos creados.

Ahora el siguiente paso es crear los circuitos (Simplificado y Original), estos se compondrás

de las compuertas cuyas arquitecturas ya fueron creadas en los archivos correspondientes.

Para esto se repetirán los pasos anteriores de creación de archivos.

Empezaremos primero con el Circuito Original, una vez que fue creado el archivo lo primero

que tenemos que hacer es crear las señales con que trabajara el circuito. Estas señales no

son más que señales temporales (interconexiones entre compuertas lógicas), aclarando que

no corresponden a las señales de entrada y salida del circuito.

En mi caso particular opte por denominar las señales con nombres que fueran fácilmente

identificables con dimensiones cortas, pro ejemplo para denominar las señales negadas de

las entradas se escribió “acomplemento” a la señal A’, las señales llamadas “saladn1”, según

mi nomenclatura adoptada significa Salida de la compuerta AND numero 1.

Fig. 15.- Señales creadas para el Circuito Original.

Page 12: Reporte Práctica 1

Reporte de Práctica

Cd. Victoria, Tamaulipas - Octubre 2012 12

Una vez que fueron declaradas todas las señales temporales que se utilizaran es momento de

crear las interconexiones entre los componentes del circuito, esto se hizo mediante lenguaje

VHDL. En este punto se les asigno un nombre y numero a cada compuerta lógica para

diferenciarlas tanto en el diagrama como en el código, por ejemplo en este caso se

necesitaron 4 inversores, cada uno fue nombrado con las siglas INV seguido de un numero

(INVX), esto se repetirá con cada una de las compuertas ya que esta técnica nos permite

darle una mejor estética a la estructura del código en el programa.

En la Fig. 16 podemos ver una sección del código VHDL en la cual están creadas ya las

compuertas con sus debidas interconexiones.

Fig. 16.- Compuertas e Interconexiones del Circuito Original.

== CIRCUITO ORIGINAL TERMINADO ==

Page 13: Reporte Práctica 1

Reporte de Práctica

Cd. Victoria, Tamaulipas - Octubre 2012 13

Ya tenemos terminada la parte del circuito original, ahora lo siguiente es crear el circuito

simplificado, para evitar extender este reporte nos brincaremos los pasos de creación de

diseños y archivos anteriores y nos situaremos en el punto de asignación de señales.

Como podemos ver en la Fig. 17, para el Circuito Simplificado las señales temporales se

redujeron.

Fig. 17.- Señales Temporales de Circuito Simplificado

Ya que se crearon las señales temporales ahora sigue las interconexiones entre compuertas

para formar el circuito lógico en lenguaje VHDL. En la figura siguiente se podrá ver todo esto.

Fig. 18.- Compuertas e Interconexiones del Circuito Simplificado.

== CIRCUITO SIMPLIFICADO TERMINADO ==

Page 14: Reporte Práctica 1

Reporte de Práctica

Cd. Victoria, Tamaulipas - Octubre 2012 14

Por último solo falta validar que los dos circuitos creados funcionan de igual forma, ya que los

dos deben de realizar la misma función.

Para realizar esta validación solo fue necesario crear un nuevo bloque en el diseño que lo

llamamos “probador_circuitos” este bloque consto de un puerto de entrada tipo vector (4 bits)

en el cual se le inyectaría la señal de las 4 entradas (A, B, C y D) y dos salidas llamadas

“Salida 0” y “Salida 1” por las cuales saldrá la señal de salida del Circuiro Original y Circuito

Simplificado respectivamente.

Esto ya implementado en código VHDL quedo tal como se muestra en la Fig. 18, ahí

podremos ver que como se menciono antes tiene 3 puertos, 1 entrada tipo vector y dos

salidas estándar, y solo dos entidades, correspondientes al circuito original y al circuito

simplificado.

Figura. 19.- Código VHDL de la prueba de circuitos (Validación).

Page 15: Reporte Práctica 1

Reporte de Práctica

Cd. Victoria, Tamaulipas - Octubre 2012 15

Una vez que compilamos el programa y no marco ningún error es momento de abrir una

herramienta muy práctica con la que cuenta este software, se trata de un simulador de formas

de onda de las señales del circuito lógico, para esto solo es necesario dirigirnos a la barra de

herramientas de la parte superior, dar click sobre el icono que dice se llama “New Wave Form”

(flecha roja Fig. 20) y se abrirá una nueva ventana en la cual seleccionaremos la arquitectura

de “prueba_circuitos” (recuadro amarillo Fig. 20).

Fig. 20.- Abrir herramienta de formas de onda.

Una vez que se abrió la ventana hay que agregar las señales que queremos ver, solo

seleccionamos la opción “Add Signals”, se abre una nueva ventana y seleccionamos la

entrada y las dos salidas (Fig. 21a).

Después es necesario estimular la entrada tipo vector con un contador binario ya que hay que

recordar que esta entrada consta de 4 entradas que deben corresponden a una suma binaria.

Fig. 21a Fig. 21b

(Agregar señales) (Asignar contador binario a entrada)

Page 16: Reporte Práctica 1

Reporte de Práctica

Cd. Victoria, Tamaulipas - Octubre 2012 16

Al final solo es necesario simular o correr el programa y se obtuvo la forma de onda que se

muestra en la Fig. 22, como podemos ver claramente se esta realizando la misma función de

salida tanto en el circuito original como en el simplificado.

Fig. 22.- Forma de onda de las salidas del circuito.

Ahora bien podemos desplegar la entrada tipo vector para ver que una a una las entradas que

estimulan a los circuitos.

Fig. 23.- Forma de onda desplegada de las salidas del circuito.

== LOS CIRCUITOS FUNCIONAN CORRECTAMENTE ==

Page 17: Reporte Práctica 1

Reporte de Práctica

Cd. Victoria, Tamaulipas - Octubre 2012 17

Problema 3.36 (Capitulo 3 - Digital Design with CPLD Applications & VHDL )

Resolver el siguiente ejercicio de simplificación de funciones lógicas mediante dos métodos:

3. Utilizando teoremas de Algebra Booleana 4. Utilizando el método de Mapas de Karnaugh

Implementar en VHDL ambas funciones (original y simplificada) y validar mediante una simulación la equivalencia de ambas funciones. En la Fig. 1 podremos ver la tabla de verdad del primer ejercicio.

A B C D Y

0 0 0 0 0

0 0 0 1 0

0 0 1 0 1

0 0 1 1 1

0 1 0 0 0

0 1 0 1 0

0 1 1 0 0

0 1 1 1 0

1 0 0 0 0

1 0 0 1 1

1 0 1 0 X

1 0 1 1 X

1 1 0 0 X

1 1 0 1 X

1 1 1 0 X

1 1 1 1 X

En este ejercicio volvemos a obtener la función booleana de la tabla de verdad, pero como

podemos notar la tabla cuanta con valores marcados como X, esto es conocido como

condiciones de no importa, las cuales pueden ser tomadas como ceros o unos, a

conveniencia.

Por el momento la función booleana queda de este modo, mas adelante con el mapa k

veremos si nos conviene tomar alguna de las X como unos o no.

Y = A’B’CD’ + A’B’CD + AB’C’D

Page 18: Reporte Práctica 1

Reporte de Práctica

Cd. Victoria, Tamaulipas - Octubre 2012 18

Ahora, minimizando mediante mapa de Karnaugh obtenemos los grupos pero analizando bien

vemos que las condiciones de no importa que corresponden a la entrada 1101, 1111, 1011 y

1010 fueron tomadas como unos lógicos para poder formar grupos mas grandes y realizar

una reducción mayor de términos. En la Fig. 24 podemos ver los grupos en el mapa K.

Fig. 24.- Mapa de Karnaugh ya marcado con los grupos seleccionados.

Entonces ahora la función booleana original aumenta en numero de elementos ya que 4

condiciones de no importa fueron tomadas como unos, y quedo de la siguiente manera.

Y = A’B’CD’ + A’B’CD + AB’C’D + AB’CD’ + AB’CD + ABC’D + ABCD

Se construye el circuito lógico en base a esta función booleana.

Fig. 24.- Circuito Original del problema 2.

Page 19: Reporte Práctica 1

Reporte de Práctica

Cd. Victoria, Tamaulipas - Octubre 2012 19

La función booleana ya considerando las condiciones de no importa fue reducida gracias al

mapa K quedando de esta forma:

Y = AD + B’C

De nuevo, es necesario construir el circuito lógico de esta función, en este podemos ver que

la reducción de espacio y componentes de nuevo es considerable y fácil de distinguir.

Fig. 25.- Circuito Simplificado del problema 2.

Y realizando la comprobación mediante algebra booleana podemos ver que la reducción es

correcta, esto se muestra a continuación.

Como podemos ver la comprobación mediante algebra booleana fue correcta.

Page 20: Reporte Práctica 1

Reporte de Práctica

Cd. Victoria, Tamaulipas - Octubre 2012 20

Ahora de nuevo sigue la parte de la realización en código VHDL, pero esta vez omitiremos el

procedimiento ya que fue explicado en el problema anterior, solo nos enfocaremos a explicar

los detalles y notas importantes.

Del mismo modo que en problema anterior se tuvieron que agregar las señales con las cuales

trabajaría nuestro circuito original, en la Fig. 26 se pueden ver las señales temporales que se

declararon.

Fig. 26.- Señales Temporales declaradas en Circuito Original.

Ahora, omitiendo las explicaciones anteriormente dadas, el código completo del archivo del

circuito original es el siguiente.

Fig. 27.- Código VHDL del Circuito Original.

== CIRCUITO ORIGINAL TERMINADO ==

Page 21: Reporte Práctica 1

Reporte de Práctica

Cd. Victoria, Tamaulipas - Octubre 2012 21

Una vez terminado el circuito original se paso a la realización en lenguaje VHDL del circuito

simplificado, en este podremos ver que tanto el código como las señales temporales

declaradas son menores.

Fig. 27.- Código VHDL y Señales declaradas en Circuito Simplificado.

== CIRCUITO SIMPLIFICADO TERMINADO ==

Del mismo modo que en el problema 1 es necesario comprobar que los dos circuitos tanto

original como simplificado realizan la misma función de salida.

En la Fig. 28 podemos ver la salida generada por los dos circuitos y podemos compararlas.

Fig. 28.- Ondas de salida de la prueba de circuitos.

Page 22: Reporte Práctica 1

Reporte de Práctica

Cd. Victoria, Tamaulipas - Octubre 2012 22

En la Fig. 29 podremos ver que en la señal de salida, correspondiente a la salida 1 que fue

asignada al circuito simplificado tenemos una serie de dos pulsos positivos que en el circuito

original no tenemos. Esto se debe a que si observamos bien, el circuito original que creamos

en código VHDL no consideramos ninguna de las condiciones de no importa de la tabla de

verdad, fueron tomadas a conveniencia como ceros lógicos para minimizar el circuito pero

caso contrario, en el circuito simplificado si fueron tomadas algunas de las condiciones de no

importa como unos ya que según el mapa de Karnaugh nos permitió hacer una reducción

mayor de componentes, pero si estos circuitos son llevados a la práctica se supone que estos

pulsos positivos no afectarían para nada el proceso en donde se encuentre funcionando este

circuito ya que las condiciones de no importa nos dicen que no afectan ni alteran el

funcionamiento final del proceso en el cual esta aplicado el circuito.

Fig. 29.- Pulsos positivos en causados por las condiciones de no importa.

== LOS CIRCUITOS FUNCIONAN CORRECTAMENTE ==

Page 23: Reporte Práctica 1

Reporte de Práctica

Cd. Victoria, Tamaulipas - Octubre 2012 23

Conclusiones

Durante la realización de esta práctica fue necesario dar un repaso general de algunos temas

de algebra booleana y de la realización y minimización de circuitos lógicos digitales, esto nos

ayudo mucho a recordar algunos aspectos que nos servirán para la realización de todas las

prácticas posteriores y además nos ayudan no solo a desempolvar el conocimiento sino que

también nos ayudan a mejorar las técnicas aprendidas en la Licenciatura para poder enfrentar

los problemas viéndolos desde una perspectiva diferente con la que los veíamos en ocasiones

pasadas.

Además esta práctica nos fue muy útil en el sentido de que nos permitió comprender el

proceso de realización de programas y la estructuración del lenguaje VHDL en este entorno

de desarrollo. Aunque este lenguaje tiene una similitud con el lenguaje C es muy diferente no

solo en la estructuración sino en capacidades, ya que este tipo de código es descargado en

un hardware que actualmente es de los mas rápidos y funcionales en el mercado, los FPGA’s,

este procedimiento se verá algunas prácticas adelante con lo que espero que las técnicas

aprendidas en este curso me sean de gran utilidad para mi futuro en mi proceso de formación

en este programa de posgrado.