Circuitos
Upcoming SlideShare
Loading in...5
×
 

Circuitos

on

  • 1,185 views

 

Statistics

Views

Total Views
1,185
Views on SlideShare
977
Embed Views
208

Actions

Likes
0
Downloads
6
Comments
0

6 Embeds 208

http://maurycastillom.blogspot.com 173
http://maurycastillom.blogspot.mx 20
http://maurycastillom.blogspot.com.ar 9
http://maurycastillom.blogspot.com.es 4
http://maurycastillom.blogspot.com.br 1
http://maurycastillom.blogspot.pt 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Circuitos Circuitos Document Transcript

  • CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALESIV DESCRIPCIÓN DE CIRCUITOS DIGITALESIEC FRANCISCO JAVIER TORRES VALLE 54
  • CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES4.1 PROYECTOS EN WARP 5.0 Figura 4.2 El objetivo de este capítulo es enseñarte a crear 3. Posteriormente debe aparecer un cuadro deproyectos en VHDL utilizando Warp de Cypress dialogo como el que se muestra a continuación.Semiconductors. Así como diferentes métodos Para crear un proyecto con el que quieresprácticos para la síntesis de los circuitos digitales programar un dispositivo debes de seleccionar lamás comunes. segunda opción (Project [Target - Device]).PROCEDIMIENTO 1. Una vez en Windows haz click en el botón deinicio, selecciona Programas > Warp R5.0 >Galaxy. 4. Cuando selecciones la opción de Project [Target - Device] aparecerá una ventana que te pide que pongas un nombre a tu proyecto, escribe el nombre de nuevo. En el segundo cuadro de texto te pide que especifiques el directorio en donde debe de guardar tu proyecto, puedes hacer un directorio nuevo desde esa misma ventana con solo escribir el nombre, por ejemplo c:nuevo, o puedes buscar una carpeta ya existente con la opción Browse. Cuando hayas terminado de especificar los nombres haz click en el botón de Siguiente. Figura 4.1 2. Cuando te encuentres dentro del Galaxy,selecciona File > New. Figura 4.3 5. Aparecerá una ventana con título Add Files to Project, esta ventana se usa cuando ya tienes archivos que quieres agregar a tu proyecto, pero en esta ocasión por tratarse de un proyecto totalmente nuevo no es necesario especificar nada dentro de esta ventana. Solo haz click en el botón de Siguiente.IEC FRANCISCO JAVIER TORRES VALLE 55
  • CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES 7. Luego de lo anterior, aparecerá una ventana que te pregunta si deseas guardar tu nuevo proyecto, solo haz click en Sí. 8. Ahora ya tienes un nuevo proyecto donde se encuentra suficiente información para que el compilador te genere el archivo .jed. Pero te falta agregar el código que habrá de compilarse. Selecciona File > New > Text File, o puedes hacer click en el icono de nuevo. Escribe lo siguiente dentro del archivo de texto: library ieee; Elige File > Save As y en la opción de Guardar en, selecciona el nombre de la carpeta que usaste Figura 4.4 en el paso número 4 (c:nuevo). Una vez que hayas 6. La siguiente ventana lleva el título de Select seleccionado el directorio, escribe el nombre deTarget Device, esta ventana es muy importante ya archivo, se sugiere el nombre nuevo, con laque es aquí donde debes de especificar el PLD en extensión .vhd, ya que de esta manera se especificael que vas a trabajar. Los PLDs que se usan un archivo que contiene un código en VHDL.cuando se está aprendiendo son los pequeños Luego de hacer esto, guarda tu archivo.(generalmente 16V8, 22V8 ó 22V10), estos PLDs 9. Cierra el archivo de texto.están en la ventana como SPLD. Haz doble clicksobre este texto, te aparecerá una lista de los 10. Selecciona Project > Add Files, te apareceráSPLDs más comunes, selecciona el SPLD que te una ventana que debe de tener tu archivointerese y nuevamente aparecerá una lista donde nuevo.vhd , haz click en Add, y posteriormente enhay varios tipos del mismo SPLD, por ejemplo OK.PALCE16V8-10PC/PI. Esta parte es importante,ya que debes de seleccionar un SPLD que tenga unencapsulado de tipo PDIP, para que lo puedasmontar en tu protoboard. En la parte inferioraparece información sobre el SPLD que te interese.Cuando escojas el SPLD adecuado haz click enFinalizar. Figura 4.6 11. Tu archivo de texto se ha convertido en un archivo de VHDL y está dentro de tu proyecto, todo lo que programes, será compilado en el dispositivo que especificaste. En tu ventana de proyecto (si no se encuentra abierta, la puedes activar haciendo View > Project Window) debe de aparecer un icono en forma de hoja que tiene el nombre de tu proyecto. Haz click en esta hoja y te Figura 4.5 debe de aparecer un archivo con la instrucción: library ieee; solo que ahora la palabra library estáIEC FRANCISCO JAVIER TORRES VALLE 56
  • CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALESen color azul porque es una palabra reservada. Esto 1. Una vez que se ha creado un nuevo proyectodemuestra que haz hecho correctamente el en Galaxy, dentro del menú Project seleccionaprocedimiento. Compiler Options. Figura 4.7 12. Si la configuración de colores es la normal, Figura 4.8notarás que todas las palabras reservadas semuestran en color azul y los comentarios en color 2. Lo anterior abrirá la ventana de opciones derojo. Ahora ya puedes comenzar a hacer tu compilación, dentro de esta se encuentra unadescripción en VHDL. sección para elegir el formato de los retardos para simular el circuito Simulation—Timing Model. Aquí es donde debes de seleccionar el formato4.2 SIMULACIÓN DE 1164/VHDL. PROYECTOS Active - HDL de la empresa Aldec Inc. es unsimulador que utiliza un archivo de post - síntesiscreado por WARP. Éste es un archivo .vhd con losretardos de tiempo del código sintetizado en eldispositivo seleccionado. Este tema tiene porobjetivo dar una pequeña introducción a estesimulador de VHDL en las siguientes tressecciones. 1. Formato de simulación 1164/VHDL. 2. Simulación. 3. Tipos de señales de estimulación.FORMATO DE SIMULACIÓN 1164/VHDL El archivo de entrada para Active - HDL es unmodelo de simulación post - síntesis generado Figura 4.9cuando se compila un archivo .vhd en eldispositivo elegido. En WARP es posible crear 3. Asegúrate que se encuentre habilitado elarchivos con diferentes formatos para simulación cuadro de Enable Testbench Output.post - síntesis. Active - HDL requiere de un archivocon el formato de simulación IEEE - 1164 / VHDL. 4.2.1 PROCESO DE SIMULACIÓN Para crear este archivo post - síntesis debes El proceso de simulación lo podemos resumir enseguir el siguiente procedimiento. los siguientes siete pasos.IEC FRANCISCO JAVIER TORRES VALLE 57
  • CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES 1. Cargar un archivo con el formato de 2. - INICIACIÓN DE LA SIMULACIÓN simulación 1164/VHDL. Para iniciar la simulación, activa el simulador utilizando la opción Initialize Simulation, dentro 2. Iniciación de la simulación. del menú Simulation. Después abre una ventana 3. Agregar señales. para el análisis de señales Waveform Window, si es que no se encontrara ya una abierta.. Para crear 4. Asignar señales de estimulación. una nueva ventana de este tipo, haz clic en el icono 5. Correr la simulación. dentro de la barra estándar de trabajo o selecciona File > New Waveform.. 6. Observación de la simulación. 3. - AGREGANDO SEÑALES 7. Guarda la simulación. El siguiente paso es agregar señales a la ventana1. - CARGA DEL ARCHIVO de análisis, para esto selecciona Add Signals...en el menú Waveform. La ventana para agregar señales El primer paso es abrir el programa Active-HDL aparecerá con una lista de todas las señales deSim que normalmente se encuentra en Menu Inicio entrada, salida, entrada/salida y nodos internos de> Programas > Warp > Active-HDL Sim. Para conexión disponibles en el diseño. Para agregarcargar el archivo selecciona Open Vhdl dentro del alguna de las señales que se encuentran en estaMenú File. lista basta con hacer doble clic sobre el nombre de la señal. Si deseas agregar varias señales al mismo tiempo, puedes seleccionarlas mediante la tecla control y haciendo clic sobre cada señal que deseas agregar para después hacer clic sobre el botón Add que se encuentra en la parte inferior de la ventana. Figura 4.10 Es importante mencionar que el archivo con el Figura 4.11formato 1164/VHDL se crea en el subdirectoriovhd dentro del directorio de trabajo del proyecto 4. - TIPOS DE SEÑALES DE ESTIMULACIÓNuna vez que éste es compilado. Si se selecciona poraccidente el archivo .vhd creado por el usuario, el Las señales de estimulación son utilizadas paracompilador del programa generará varios errores y definir diferentes impulsos a los puertos de entradano podrá ser simulado. Una vez que el archivo del diseño que esta siendo simulado. Paraapropiado es cargado, se desplegarán una serie de seleccionar alguno de estos tipos primeromensajes dentro de la ventana de compilación. selecciona la señal y después selecciona WaveformUno de los mensaje que debería aparecer cuando el > Stimulators..., a continuación se describearchivo es compilado correctamente es el brevemente los diferentes tipos de señales desiguiente: estimulación de Active-HDL Sim.-- Compile success 0 Errors 0 WarningsAnalysis time: 3.0 [s].IEC FRANCISCO JAVIER TORRES VALLE 58
  • CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES VALOR Con este tipo de estimulador asignamos un valor constante a la señal especificada. HOTKEY Con este estimulador podemos estar cambiando el valor de la señal presionando una tecla. Cuando asignamos este tipo de estimulador es conveniente asignar una lista de valores. Cada que presionemos la tecla asignada, estaremos cambiando entre los valores de esta lista. Para una descripción más completa de las Figura 4.12 características del simulador consulta la ayuda del programa.CLOCK 5. - CORRIENDO LA SIMULACIÓN Sirve para definir señales de reloj definidas conlos siguientes parámetros: frecuencia, valor inicial, Para correr la simulación selecciona Simulationciclo de trabajo y tiempo de inicio. > Run. La simulación se detendrá después que la duración especificada haya sido terminada. En esteCUSTOM momento las señales de estimulación para los Un estimulador personalizado se crea editando puertos de entrada pueden ser alterados ylos valores deseados en la ventana de simulación. producirán efectos sobre la simulación cuando estaEstado en el modo de edición, al estimulador de continué. Para volver a iniciar la simulaciónentrada se le puede asignar un estado bajo o un selecciona Simulation > Restart Simulation.estado alto presionando 1 o 0 respectivamente. 6. - OBSERVANDO LA SIMULACIÓNFORMULA Varias propiedades pueden ser manipuladas Un estimulador del tipo formula produce una para mejorar la apariencia de la simulación. Aseñal definida por una simple sintaxis. La señal es continuación se describen brevemente algunas dedefinida con secuencias pares de valor - tiempo. estas propiedades.Con la componente tiempo indicamos el momento BUSen el que la señal asume el valor especificado. Launidad del tiempo es en picosegundos. Para repetir La líneas individuales que forman un busdurante un periodo especificado, se agrega el pueden ser mostradas y editadas. Para mostrarlasmodificador -r. La sintaxis del estimulador tipo haz clic sobre "+" que se encuentra a junto alformula se muestra a continuación. nombre el bus. Las señales de estimulación pueden ser asignadas a cada línea del bus o al bus<valor> <tiempo> [,<valor> <tiempo>, completo.<valor> <tiempo>, ...] [ -r <periodo>] COLOREJEMPLO Las señales de la simulación pueden ser de0000 0 ps, 1111 100000 ps, 0011 diferentes colores para una mejor claridad cuando200000 ps -r 300000 varias señales son desplegadas. Para agregar color a todas las señales visibles, selecciona Waveform >PREDEFINIDOS Colorize Waveforms, esto asignará diferentes colores, arbitrariamente a cada señal dentro de la Los estimuladores predefinidos son una serie de ventana de simulación. Para asignar color a cadaseñales tipo clock con diferentes frecuencias o señal, haz clic con el boton derecho sobre elseñales del tipo formula que pueden ser asignados nombre de la señal y selecciona la opcióna las señales. Para agregar un nuevo estimulador a Properties..esta lista, lo puedes hacer en la misma ventanadentro del cuadro Predefined.IEC FRANCISCO JAVIER TORRES VALLE 59
  • CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALESZOOM ventas de simulación abiertas. La extensión de los archivos de simulación en Active-HDL Sim es Para aumentar o reducir la escala de tiempo de .awf.la simulación, selecciona View > Zoom >In/Out/Full. 4.3 COMPARADORESBOOKMARKS Para colocar marcas sobre la ventana de El objetivo de este tema es crear, sintetizar, ysimulación primero selecciona Waveform > Select simular la descripción de circuitos comparadoresMode. Cuando este modo se encuentra de magnitud utilizando WARP.seleccionado, es posible colocar marcas sobre PROCEDIMIENTOdiferentes puntos de la simulación para una rápidareferencia a ciertos puntos importantes de la 1. Primero crearemos un proyecto para elmisma. Para colocarlas primero haz clic con el ejemplo del comparador visto en el tema 3.1.2botón izquierdo en donde deseas colocar una Antes que nada debemos crear el proyecto dentromarca, después selecciona Search > Toggle de un directorio en el que se encontrarán todos losBookmark. Utilizando Next/Previous Bookmark archivos del proyecto (.pfg, .vhd, .jed, .rpt, etc. ).del mismo menú puedes cambiar entre una marca y Se sugiere crear primero una carpeta para todos losotra dentro de la simulación. Las marcas son proyectos VHDL y dentro de esa carpeta crear otradesplegadas como un triángulo azul sobre la escala carpeta para el presente proyecto, por ejemplode tiempo en la ventana de simulación. Para c:vhdl_projcomparador_1, con el nombreeliminar alguna marca selecciona Waveform > Edit comparador_1.Mode y después haz clic con el botón izquierdosobre la marca que deseas eliminar.MODO DE MEDICIÓN Para entrar al modo de medición seleccionaWaveform > Measurement Mode. En este modo esposible desplegar el tiempo exacto entre doseventos de la simulación. Para obtener estainformación coloca el puntero sobre una transiciónnegativa o positiva, cuando el puntero es colocadosobre alguna transición debe cambiar a colorverde, presiona el botón izquierdo sobre latransición y arrastra el puntero hasta otra transiciónde cualquier señal dentro de la ventana desimulación y entonces suelta el botón. La medidaexacta entre estas dos transiciones se desplegaracomo una etiqueta entre las dos transiciones. Si la Figura 4.13etiqueta no es mostrada o no se ve completa,amplia el alto de la fila haciendo clic con el botón 2. Seleccionaremos un 22V10 con empaquetadoderecho sobre alguna de las señales que tipo DIP para sintetizar el código.intervienen en la medición y después selecciona 3. Ahora creamos un nuevo archivo de textoProperties, dentro de la venta de propiedades para editar el código (File > New > Text File).aumenta la altura modificando el valor del cuadro Este archivo debe ser guardado con extensión .vhdde texto Height. Para eliminar alguna etiqueta de y en la misma carpeta del proyecto. Se sugieremedición selecciona Waveform > Edit Mode, guardarlo como:después seleciona la etiqueta y presiona suprimir c:vhdl_projcomparador_1comparador1.vhd7. - GUARDANDO LA SIMULACIÓN 4. A continuación se muestra la tabla de Existen dos formas de guardar la simulación. funcionamiento de este comparador y basándoseGuardar solamente la simulación de la ventana en ella haremos el código de descripción enactiva o guardar todas las simulaciones de las VHDL. Primero utilizaremos el estilo deIEC FRANCISCO JAVIER TORRES VALLE 60
  • CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALESdescripción de flujo de datos, que es el mismo que a agregarlo al presente proyecto. Para agregarlo lose utilizó cuando se expuso el ejemplo en el tema hacemos desde el menú Project y dentro de éste3.1.2. hacemos clic en Add Files... (Project > Add Files...). Una vez que aparece la ventana paraTABLA DE FUNCIONAMIENTO agregar archivos al proyecto, seleccionamos el archivo comprador_1.vhd y presionamos el botón "Add". ENTRADAS SALIDAS Si por error hacemos clic en la opción Add All x<y x_men_y 1 Files, todos los archivos .vhd dentro de la carpeta x<y equals 0 del proyecto se agregaran al mismo. En este caso el único archivo .vhd que debería estar dentro de la x<y x_may_y 0 carpeta del proyecto es comparador_1.vhd, lo cual x=y x_men_y 0 en esta ocasión no nos afectará. En caso de que hubiera más de un archivo .vhd y no deseamos x=y equals 1 tenerlo dentro del proyecto basta con seleccionarlo x=y x_may_y 0 en la ventana de proyecto y presionar la tecla suprimir, o también desde Project > Remove x>y x_men_y 0 Selected Source File(s). Si la ventana de proyecto x>y equals 0 no está visible entonces seleccionamos View > x>y x_may_y 1 Reset Docking Windows. 5. Abajo se muestra el listado del comparadorcorrespondiente al estilo de descripción de flujo dedatos. Este listado debemos editarlo dentro delarchivo comparador_1.vhd.ENTITY comparador IS PORT ( x: IN bit_vector(3 DOWNTO 0); y: IN bit_vector(3 DOWNTO 0); x_may_y: OUT bit; equals: OUT bit; x_men_y: OUT bit );END comparador;ARCHITECTURE comparador OF comparador ISBEGIN equals <= 1 WHEN x = y ELSE Figura 4.14 0; x_may_y <= 1 WHEN x > y ELSE 7. Una vez editado y agregado el archivo al 0; x_men_y <= 1 WHEN x < y ELSE proyecto se procede a sintetizar el código en el 0; 22V10. Seleccionamos Compile > Project oEND comparador; también lo podemos hacer presionado el icono de compilación. 6. Como se puede observar no se cargó ningunalibrería, y no es necesario hacerlo porque el tipo bites un tipo predefinido en WARP y en muchosotros sintetizadores de VHDL. Por esto nonecesitamos de ninguna librería para poderutilizarlo. Además, recuerde que la última Figura 4.15declaración de puertos no lleva ; Si el archivo tiene errores, estos aparecerán en Una vez que se terminó de editar el código, la ventana de salida (Output Window). Dentro deprocedemos a guardar los cambios en el archivo y "Errors & Warnings" en la ventana de salida seIEC FRANCISCO JAVIER TORRES VALLE 61
  • CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALESmuestra una lista completa de los errores así como las ecuaciones que resultaron durante el proceso deuna descripción de cada error. Para acceder síntesis, la asignación de pines, y un informe derápidamente a la línea en la cual ocurrió el error, utilización del dispositivo. En ocasiones esbasta con hacer doble clic sobre el error e complicado realizar algunas descripciones y,inmediatamente el programa se colocará sobre la aunque el código se sintetiza, durante lalínea en donde se encuentra dicho error. Los simulación hace algo diferente a lo queerrores pueden ser algunos de los siguientes: omitir esperábamos. La función del sintetizador, en estealgún punto y coma, no escribir correctamente caso WARP, es la de interpretar nuestraalgún identificador, sintaxis incorrecta de las descripción en VHDL para generar la lógica deinstrucciones utilizadas, o uso incorrecto de los salida. En estos casos posiblemente la descripciónoperadores. Recordemos que VHDL es un no corresponde exactamente a lo que queremos.lenguaje en el que los tipos de datos son Para corregir la descripción es útil consultar lassumamente importantes y no se pueden mezclar a ecuaciones, ya que en estas nos podemos darmenos que se utilicen las librerías adecuadas. cuenta que es lo que estamos describiendo realmente. En temas posteriores se presentan 8. La ventana de proyecto tiene 3 modos o algunos ejemplos en los que se exponen con másvistas: "Source Files View", "Hierarchy View", y detalle este tipo de problemas."Output Files View". En la primera se muestran losarchivos que se han agregado al proyecto. La SIMULACIÓN"Vista de Jerarquía" es útil cuando se hacen 9. Ahora que ya hemos logrado sintetizar eldiseños jerárquicos, ya que en esta se muestra cual código y obtenido los archivos .jed y .vhd dees el orden de importancia que hay entre ellos. postsíntesis procedemos a simular la descripción.Dentro de la "Vista de Archivos de Salida" Las simulaciones las haremos en Active-HDL Simaparecen los archivos que se generaron durante la como se explicó en tema 4.2. Podemos abrir elcompilación, los cuales fueron creados dentro de la programa desde Galaxy desde Tools > Active-HDLcarpeta del proyecto. Tales archivos de salida son: Sim..jed, .rpt y un .vhd que se encuentra dentro de lacarpeta "vhd" que está en la misma carpeta delproyecto (ver tema 4.2). Figura 4.17 10. Una vez iniciado el simulador, ahora abrimos el archivo .vhd de postsíntesis como se explica a continuación. Primero seleccionamos File > Open VHDL. Figura 4.16 En el archivo .rpt se muestra un informe de losresultados de la compilación. En éste se encuentranIEC FRANCISCO JAVIER TORRES VALLE 62
  • CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES Figura 4.18 7 us, 1000 8 us, 1001 9 us, 1010 10 us, 1011 11 us, 1100 12 us, 1101 13 us, 1110 14 us, 1111 15 us -r 16 us Para después abrir el archivo .vhd depostsíntesis, el cual debería estar (si seguistecorrectamente todos los pasos) en el subdirectorio: Y al bus "y" también le asignaremos unc:vhdl_projcomparador_1vhdcomparador1. estimulador del mismo tipo con la siguientevhd formula. 0000 0 ns, 1111 1 us, 1110 2 us, 1101 3 us, 1100 4 us, 1011 5 us, 1010 6 us, 1001 7 us, 1000 8 us, 0111 9 us, 0110 10 us, 0101 11 us, 0100 12 us, 0011 13 us, 0010 14 us, 0001 15 us -r 16 us 13. Una vez que asignamos los estimuladores iniciamos la simulación seleccionando: Simulation > Initialize Simulation. 14. Una vez iniciada la simulación ahora corremos la simulación. Para poder correrla existen tres opciones: correr completamente la simulación (el máximo es de 2ms+3), correrla y Figura 4.19 que se detenga en un momento especifico, o adelantar la simulación solamente por algún 11. Hecho lo anterior ahora agregamos las tiempo. Para correr la simulación completamenteseñales y/o puertos que deseamos simular. seleccionamos Simulation > Run. Si queremosSeleccionamos Waveform > Add Signals... correr la simulación y especificar un tiempo en el que debe detenerse seleccionamos Simulation > Run Until... . Para correr la simulación "por pasos" o por tiempos especificados, seleccionamos Simulation > Run For. El tiempo de paso se especifica a un lado del icono de Run For. Esta última opción es la más practica al momento de simular descripciones. Figura 4.21 Figura 4.20 Si deseas utilizar Run For cerciórate que el tiempo de "paso" sea de 1 us. Ya que cuando Ahora seleccionamos los puertos como se asignamos los estimuladores el valor de los busesexplicó en el tema 4.2. En este ejercicio de entrada cambia cada 1 us. Si deseas utilizar Runseleccionaremos solamente los puertos declarados Until... bastara con especificar un tiempo de 32 usen la entidad, tal y como se muestra en la figura para observar como se comporta el ciclo de4.22 asignaciones que especificamos mediante la 12. Lo siguiente es asignar señales de estimulo a formula, el tiempo mínimo para comprobar todoslos puertos de entrada. Al bus "x" le asignaremos los valores (por lo menos un ciclo) es de 16 us.un estimulador tipo formula usando la siguiente 15. A continuación en la figura 4.23 se muestranformula. los resultados de la simulación. Si seguiste correctamente todos los pasos deberías obtener0000 0 ns, 0001 1 us, 0010 2 us, 0011 3us, 0100 4 us, 0101 5 us, 0110 6 us, 0111 algo similar a lo mostrado en la siguiente figura.IEC FRANCISCO JAVIER TORRES VALLE 63
  • CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES Figura 4.22 Figura 4.23 Figura 4.24IEC FRANCISCO JAVIER TORRES VALLE 64
  • CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES4.4 MULTIPLEXORES descripción de circuitos digitales utilizando WARP. De esta librería se llamó el paquete En este tema el objetivo es elaborar std_arith, el cual contiene muchas funciones quedescripciones de circuitos multiplexores utilizando facilitan el uso de vectores tipo std_logic conlos tres estilos de descripción de VHDL. enteros. De no haber utilizado este paquete no podríamos hacer ninguna de la comparaciones quePROCEDIMIENTO están en la asignación condicional WHEN... ELSE. Es decir, no es posible hacer la comparación "selec Para la síntesis utilizaremos un 22V10 siguiendo = 3" porque "selec" es del tipo std_logic_vector yla siguiente tabla de funcionamiento en los tres "3" es un número entero. El paqueteestilos de descripción. std_logic_1164 contiene los tipos de datos std_logic y std_logic_vector que comúnmenteTABLA DE FUNCIONAMIENTO utilizamos por lo que es necesario cargar el paquete para poder utilizar estos tipos, sin embargo, no contiene funciones de comparación selec salida entre tipos std_logic (o arreglos de este) y enteros. 00 a Como la librería es de propia del sintetizador, es decir, que siempre esta cargada dentro del área de 01 b trabajo del proyecto o "work", podemos llamar el 10 c paquete como se muestra a continuación. 11 d USE work.std_arith.ALL; SIMULACIÓN4.4.1 DESCRIPCIÓN DE FLUJO DE DATOS Para la simulación se sugiere que asignes un estimulador tipo formula a los vectores de entrada,LIBRARY ieee; y al vector "selec" le asignes un estimulador tipoUSE ieee.std_logic_1164.ALL; "HOTKEY". Una vez que agregaste las señales aLIBRARY cypress; la simulación, selecciona con el puntero el vectorUSE cypress.std_arith.ALL ; "selec", después seleccionas Waveform >ENTITY multiplexor IS Stimulators..., cuando aparezca el cuadro de PORT(a, b, c, d: IN std_logic_vector estimuladores selecciona "HOTKEY" dentro de (3 DOWNTO 0); "Stimulator type", y en "Press new hotkey" escribe selec: IN std_logic_vector la letra "s" o cualquier otra. (1 DOWNTO 0); salida: OUT std_logic_vector (3 DOWNTO 0));END multiplexor;ARCHITECTURE data_flow OF multiplexor ISBEGIN salida <= a WHEN selec = 0 ELSE b WHEN selec = 1 ELSE c WHEN selec = 2 ELSE d WHEN selec = 3 ;END data_flow; El listado anterior corresponde a un multiplexor4 a 1. El bus de salida es seleccionado mediante lasseñales de selección selec(1) y selec(0)(std_logic_vector es un arreglo de datos del tipo Figura 4.25std_logic). Como habrás notado se hizo el llamadoa una librería no mencionada anteriormente, la Cada que presiones la tecla "s" el vector s estarálibrería "cypress". Esta librería es de Cypress cambiando de valor, por omisión la lista de valoresSemiconductors y fue desarrollada para facilitar la de asignación incluye el 0 y el 1 solamente, enIEC FRANCISCO JAVIER TORRES VALLE 65
  • CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALESeste caso necesitamos generar valores para unvector de 2 bits. Para poder hacerlo, en el mismocuadro de dialogo cámbiate a la sección de"Hotkeys". En esta parte aparecerán las teclas queya han sido asignadas dentro del archivo para serutilizadas como estimuladores, así como la lista devalores de asignación de cada tecla. Para modificarla lista de valores de la tecla "s" (la que estamosutilizando), con el puntero colócate en el cuadro desecuencia y escribe la nueva lista de valores. 4.4.2 DESCRIPCIÓN COMPORTAMENTAL LIBRARY ieee; USE ieee.std_logic_1164.ALL; USE work.std_arith.ALL; ENTITY multiplexor IS Figura 4.26 PORT(a: std_logic_vector (3 DOWNTO 0); Ahora puedes correr la simulación poco a poco b: std_logic_vector (3 DOWNTO 0);utilizando Simulation > Run For, o presionando la c: std_logic_vectortecla "F5". Y cada que lo desees presionas la tecla (3 DOWNTO 0);"s" para cambiar el valor del vector "selec". En la d: std_logic_vectorfigura 4.24 se muestran los resultados de la (3 DOWNTO 0); selec: std_logic_vectorsimulación. (1 DOWNTO 0); salida: OUT std_logic_vector (3 DOWNTO 0)); A continuación se muestran las ecuaciones END multiplexor;obtenidas utilizando el estilo de descripción deflujo de datos. Estas ecuaciones deben ser las ARCHITECTURE behavorial OF multiplexor ISmismas para cualquier estilo que utilicemos, ya BEGIN PROCESS(selec, a, b, c, d)que estamos describiendo el mismo multiplexor VARIABLE selec_int: integer;sólo que de manera diferente y esto no implica que BEGINlas ecuaciones vayan a ser distintas. Cuando selec_int := to_integer(selec);compiles este multiplexor, en cualquiera de los tres CASE selec_int IS WHEN 0 =>estilos, consulta las ecuaciones dentro del archivo salida <= a ;.rpt y verifica que sean iguales. WHEN 1 => salida <= b ; WHEN 2 => salida <= c ; WHEN 3 => salida <= d ; WHEN OTHERS => NULL; END CASE; END PROCESS; END behavorial;IEC FRANCISCO JAVIER TORRES VALLE 66
  • CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES Dentro del proceso se hace uso de un objeto dedatos del tipo variable declarado como entero. Alinicio del proceso se hace la asignación "selec_int<= to_integer ( selec ) ;", esto es para poder usarenteros en la instrucción CASE, de otra maneratendríamos que indicar todos los casos utilizandolos valores naturales de un vector, es decir, "00","01", "10", y "11" para este ejemplo. Esto essolamente para facilitar la descripción y nosignifica que obtengamos una mejor síntesis delcódigo en el dispositivo. Es necesario que"selec_int" sea una variable para que se le asigne Figura 4.27inmediatamente el valor actual del vector "selec" yestemos describiendo el correctamente el 4.4.3 DESCRIPCIÓN ESTRUCTURALfuncionamiento del multiplexor. Si quisiéramosutilizar una señal en vez de una variable tenemos Para la descripción estructural primero debemosque hacerlo de la siguiente manera. realizar la descripción de un multiplexor 2 a 1 para después interconectar tres de ello como se muestraARCHITECTURE behavorial2 OF multiplexor IS en la figura siguiente. SIGNAL selec_int:integer;BEGIN selec_int <= to_integer( selec ); PROCESS(selec_int, a, b, c, d) BEGIN CASE selec_int IS WHEN 0 => salida <= a ; WHEN 1 => salida <= b ; WHEN 2 => salida <= c ; WHEN 3 => salida <= d ; WHEN OTHERS => NULL; END CASE; END PROCESS;END behavorial2; Si observas con cuidado podrás ver que Figura 4.28seguimos describiendo exactamente los mismo.Tanto el procesos como la asignación son de Para realizar descripciones estructurales lonaturaleza concurrente, por lo que selec_int tiene recomendable es utilizar varios archivos .vhd, cadasiempre el valor actual de selec y lo convertimos a uno para una entidad o paquete en particular. Creaun tipo entero para facilitar la descripción. Trata de un proyecto para la descripción estructural delimaginar la asignación "selec_int <= to_integer ( multiplexor 4 a 1. Ahora crea un nuevo archivo deselec )" como un circuito combinacional cuya texto y copia la siguiente descripción.función es cambiar el tipo de datos con el estamosmanejando el vector selec y cuya salida (selec_int) LIBRARY ieee; USE ieee.std_logic_1164.ALL;se la conectamos (piensa en señales como cables)al proceso, que viene siendo otro circuito que PACKAGE multiplexor IS"procesa" la información que se le suministra y COMPONENT mux_2_a_1obtiene finalmente la lógica de salida. A PORT( in1: IN std_logic_vector (3 DOWNTO 0);continuación se muestra un diagrama a bloques in2: IN std_logic_vectorque trata de representar lo que estamos haciendo (3 DOWNTO 0);en la arquitectura anterior (behavorial2). sel: IN std_logic; out1: OUT std_logic_vector (3 DOWNTO 0));IEC FRANCISCO JAVIER TORRES VALLE 67
  • CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES END COMPONENT; funcionamiento. Dentro de la ventana de proyectoEND multiplexor; en la "vista de jerarquía" (Hierarchy View) apareceLIBRARY ieee; el orden en que los componentes están siendoUSE ieee.std_logic_1164.ALL; utilizados dentro del diseño jerárquico.ENTITY mux_2_a_1 IS PORT (in1, in2: IN std_logic_vector (3 DOWNTO 0); sel: IN std_logic; out1: OUT std_logic_vector (3 DOWNTO 0));END mux_2_a_1;ARCHITECTURE data_flow OF mux_2_a_1 ISBEGIN out1 <= in1 WHEN sel = 0 ELSE in2;END data_flow; Guarda este archivo como mux_2_a_1.vhd Figura 4.29dentro de la carpeta de trabajo del proyecto. Comopodrás ver estamos creando un paquete con Una vez que has compilado y simulado estenombre "multiplexor" el cual se agrega a la librería multiplexor utilizando los tres estilos podrás verdel proyecto work. Además se tienen que llamar que no hay ninguna diferencia entre usar un estilolas librerías que se necesiten antes del paquete y u otro. Lo importante es describir el mismoantes de la entidad. Ahora abre un nuevo archivo funcionamiento para obtener los mismo resultados.de texto y copia en él la siguiente descripción. De hecho, mientras estemos describiendo exactamente lo mismo no importa el número de-- mux_structural.vhdLIBRARY ieee; líneas que se hagan, porque VHDL no es unUSE ieee.std_logic_1164.ALL; lenguaje de programación de software.USE work.multiplexor.ALL;-- llamado al paquete multiplexor que se-- encuentra en la librería 4.5 SUMADORES-- del proyecto El diseño de circuitos aritméticos eficientes esENTITY multiplexor ISPORT ( a,b,c,d: IN std_logic_vector un tema fundamental en el diseño de circuitos (3 DOWNTO 0); digitales, por lo que es importante para el selec: IN std_logic_vector diseñador estar familiarizado con las opciones (3 DOWNTO 0); disponibles en la selección de algoritmos eficientes salida: OUT std_logic_vector (3 DOWNTO 0)); en sus aplicaciones. Está práctica tiene porEND multiplexor; objetivo familiarizarte en el diseño de circuitos sumadores utilizando algoritmos eficientes enARCHITECTURE structural OF multiplexor IS SIGNAL salida1, salida2: VHDL. std_logic_vector(3 DOWNTO 0);BEGIN 4.5.1 SUMADOR TOTAL u1: mux_2_a_1 PORT MAP(a, b, selec(0), salida1); El componente básico usado en la adición de u2: mux_2_a_1 PORT MAP(c, d, selec(0), dos operandos es conocido como "sumador total". salida2); u3: mux_2_a_1 PORT MAP ( salida1, Este sumador total representa el componente con salida2, selec(1), salida); el cual podemos formar sumadores de cualquierEND structural; número de bits. A continuación se muestra la tabla de funcionamiento y la representación esquemática Guarda este archivo como mux_structural.vhd, de un sumador total, y basándose en la tabla sey agrega ambos archivos al proyecto (Proyect > hará la descripción de sumador total en VHDL,Add Files...). Compila el proyecto y comprueba para posteriormente diseñar un circuito sumador deque las ecuaciones de salida siguen siendo las 4 bits utilizando un 22V10.mismas ya que estamos describiendo el mismoIEC FRANCISCO JAVIER TORRES VALLE 68
  • CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES "10" WHEN entradas = 5 ELSE "10" WHEN entradas = 6 ELSE "11" WHEN entradas = 7; sum <= salidas(0); co <= salidas(1) ; END data_flow; Si conoces las ecuaciones del circuito también puedes utilizarlas para hacer la descripción. ARCHITECTURE data_flow OF full_adder IS BEGIN sum <= a XOR b XOR C; Figura 4.30 co <= (a AND b) OR (a AND ci) ORTABLA DE FUNCIONAMIENTO (b AND ci); END data_flow; ENTRADAS SALIDAS a b ci co suma Crea un nuevo proyecto en c:vhdl_projprac5 y llámalo sumador. Después crea un nuevo archivo 0 0 0 0 0 de texto y copia en él la descripción anterior. 0 0 1 0 1 Guarda el archivo de texto como full_adder.vhd 0 1 0 0 1 dentro de la carpeta de trabajo del proyecto. 0 1 1 1 0 Agrega el archivo al proyecto y compila el 1 0 0 0 1 proyecto utilizando la arquitectura data_flow. Abre 1 0 1 1 0 el reporte de compilación y observa las ecuaciones. 1 1 0 1 0 Ahora compila el proyecto utilizando la segunda 1 1 1 1 1 arquitectura data_flow. Vuele a abrir el proyecto y observa las ecuaciones. ¿Por qué son las mismasLIBRARY ieee; -- full_adder.vhd ecuaciones? porque estamos describiendo elUSE ieee.std_logic_1164.ALL; mismo funcionamiento y el estilo o el número dePACKAGE adder IS líneas que utilices no importa siempre y cuando COMPONENT full_adder este describiendo exactamente el mismo circuito. PORT(ci: IN std_logic; a, b: IN std_logic; sum: OUT std_logic; 4.5.2 SUMADOR DE CUATRO BITS co: OUT std_logic); END COMPONENT;END adder; Para hacer la descripción utilizaremos cuatro unidades del sumador total (u1 a u4) y lasLIBRARY ieee; conectaremos como se muestra continuación.USE ieee.std_logic_1164.ALL;USE work.std_arith.ALL;ENTITY full_adder IS PORT(ci: IN std_logic; a, b: IN std_logic; sum: OUT std_logic; co: OUT std_logic);END full_adder;ARCHITECTURE data_flow OF full_adder IS SIGNAL entradas: std_logic_vector (2 DOWNTO 0); SIGNAL salidas: std_logic_vector (1 DOWNTO 0); Figura 4.31BEGIN entradas <= a&b&ci ; Abre un nuevo archivo de texto y copia en él la salidas <= "00" WHEN entradas = 0 ELSE "01" WHEN entradas = 1 ELSE siguiente descripción. "01" WHEN entradas = 2 ELSE "10" WHEN entradas = 3 ELSE -- sumador de 4 bits utilizando "01" WHEN entradas = 4 ELSE -- un sumador totalIEC FRANCISCO JAVIER TORRES VALLE 69
  • CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES co, c1, c2, c3: INOUT std_logic);LIBRARY ieee; END sumador;USE ieee.std_logic_1164.ALL;USE work.std_arith.ALL;USE work.adder.ALL; De esta forma enviamos los nodos c1, c2, y c3 a la salida de una macroceldas, en el caso del 22V10ENTITY sumador IS a un pin de salida, y así evitamos que el PORT (ci: IN std_logic; sintetizador elimine el nodo porque ya lo a, b: IN std_logic_vector (3 DOWNTO 0); declaramos como puerto. sum: OUT std_logic_vector (3 DOWNTO 0); co: OUT std_logic); 4.5.3 SYNTHESIS OFFEND sumador; Otra forma de evitar que se simplifique el nodoARCHITECTURE structural OF sumador IS es utilizando directivas de síntesis. En este caso SIGNAL c1, c2, c3: std_logic;BEGIN utilizaremos la directiva synthesis_off que está u1: full_adder PORT MAP (ci, a(0), b(0), incluida en WARP. Esta directiva nos permite sum(0), c1 ) ; controlar la forma en que el sintetizador factoriza y u2: full_adder PORT MAP (c1, a(1), b(1), obtiene las ecuaciones de salida y de esta manera sum(1), c2 ) ; u3: full_adder PORT MAP (c2, a(2), b(2), evitar que la ecuación de un nodo se incluya en la sum(2), c3); ecuación de otro nodo y así evitar u4: full_adder PORT MAP (c3, a(3), b(3), retroalimentaciones. Para entender como funciona sum(3), co); esta directiva observe el siguiente ejemplo.END structural; ENTITY synthesis_off IS Guarda el archivo de texto en la carpeta de PORT ( a, b, c: IN bit;trabajo del proyecto (c:vhdl_projprac5) como y: OUT bit);sumador.vhd. Compila el proyecto y observa lo END synthesis_off;que sucede. Si estas usando la versión 5.0 o 5.2 de ARCHITECTURE simplifica_nodo OFWARP, la compilación te indicará los siguientes synthesis_off ISerrores. SIGNAL x: bit; BEGIN x <= a AND b;Error: Logic equation has too many product y <= x OR c;terms on signal co. END simplifica_nodo;Error: Logic equation has too many productterms on signal sum(2). Cuando compilemos el archivo la ecuación delError: Logic equation has too many product nodo "x" se sustituye en la ecuación del puerto "y"terms on signal sum(3). como se muestra abajo. Abre el reporte de compilación y observa las y = a * b + cecuaciones. La descripción no se pudo compilarporque las ecuaciones tienen demasiadas sumas de Lo que trataríamos de hacer entonces seríaproductos. El sintetizador de WARP siempre trata declara el nodo "x" como puerto y no como señalde evitar retroalimentaciones para que el circuito de interconexión, pero observa que es lo quefuncione con la mayor velocidad posible. Nosotros sucede.deseamos que los nodos c1, c2, y c3 queden en unpin de salida del 22V10 para de esta forma hacer x = a * b y = a * b + clas conexiones como se muestran en el diagrama abloques del sumador de 4 bits. Para lograrlo basta La ecuación de "x" se sigue sustituyendo en lacon describir la entidad como se muestra a ecuación del puerto "y". Como habíamoscontinuación. mencionado, el sintetizador siempre busca que el circuito que le estamos describiendo funcione a laENTITY sumador IS PORT ( ci: IN std_logic; mayor frecuencia posible. Al obtener las a, b: IN std_logic_vector ecuaciones de la forma anterior evitamos que (3 DOWNTO 0); exista una retroalimentación desde el pin del sum: OUT std_logic_vector puerto "x", ya que si retroalimentamos tenemos (3 DOWNTO 0); que esperar el tiempo de retardo de las compuertasIEC FRANCISCO JAVIER TORRES VALLE 70
  • CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALESque intervienen en las ecuaciones de "x" para que Esta directiva sólo puede ser aplicada a señales,después el valor de "x" se incorpore a las para una explicación más detallada de esta y otrasecuaciones del puerto "y". Por lo que el tiempo de directivas de síntesis consulta la ayuda delretardo para el puerto "y" sería mayor. Sin programa (Help > Help Topics). Para diseño deembargo, aunque lo mejor es que nuestro circuito circuitos aritméticos y no aritméticos que seanfuncione a mayor velocidad, en ocasiones grandes o complejos, lo mejor es hacernecesitamos que el nodo quede en una macrocelda descripciones estructurales y utilizar las directivaspara que después se retroalimente hacia otras de síntesis cuando sea necesario.ecuaciones. Ya sea por que lo necesitamos en eldiseño del circuito o por las limitaciones deldispositivo programable. Es aquí donde las 4.6 REGISTROSdirectivas de síntesis nos permiten controlar el Existen dos métodos para implementar lógicaproceso de síntesis. Observa el siguiente ejemplo registrada en VHDL: mediante instanciación deen el que se muestra como utilizar la directiva registros (utilizando librerías de componentes) osynthesis_off. utilizando procesos para realizar la descripciónENTITY synthesis_off IS comportamental del registro. PORT ( a, b, c: IN bit; y: OUT bit); Por ejemplo, si se desea utilizar un registro D yEND synthesis_off; un contador de 4 bits, basta con realizar laARCHITECTURE no_simplifica_nodo OF instanciación de dichos componentes después desynthesis_off IS incluir los paquetes apropiados. SIGNAL x: bit;ATTRIBUTE synthesis_off OF x: SIGNAL IS true; EJEMPLOBEGIN x <= a AND b; USE work.rtlpkg.ALL; -- paquetes de WARP y <= x OR c; USE work.lpmpkg.ALL;END no_simplifica_nodo; . . . -- DSRFF: definido en rtlpkg Las ecuaciones que resultan del proceso de d1: dsrff PORT MAP(d, s, r, clk, q ;síntesis son las siguientes. -- Mcounter: definido en lpmpkg c1: Mcounter GENERIC MAP (4)/y = /c * /x PORT MAP (data, clk, one,x = a * b one, one, count, zero, rst, zero, zero, zero, zero zero, zero, OPEN); Ahora las ecuaciones tienen menos términos yobligamos a que el nodo "x" quede en unaterminal, obligándolo a quedar en una macrocelda Otra forma de registrar elementos es incluir unpara que después se retroalimente. Para el circuito proceso que sea sensible a las transiciones de unasumador de cuatro bits podemos utilizar esta señal de reloj o que espere una transición de relojdirectiva de la siguiente forma. utilizando la instrucción WAIT, de esta manera el compilador asigna un registro a las señalesARCHITECTURE structural OF sumador IS afectadas dentro del proceso. Existen 4 formas SIGNAL c1, c2, c3: std_logic; básicas para describir registros, cada una de ellas ATTRIBUTE synthesis_off OF c1, c2, c3: se explica a continuación. SIGNAL IS true;BEGIN u1: full_adder PORT MAP (ci, a(0), b(0), PROCESS sum(0), c1 ) ; BEGIN u2: full_adder PORT MAP (c1, a(1), b(1), WAIT UNTIL clk = 1; sum(1), c2 ) ; . . . u3: full_adder PORT MAP (c2, a(2), b(2), END PROCESS; sum(2), c3); u4: full_adder PORT MAP (c3, a(3), b(3), Este proceso no tiene lista sensible, por lo que sum(3), co);END structural; comienza con una instrucción WAIT. Las instrucciones dentro del proceso se comenzarán a ejecutar cuando exista una transición positiva de laIEC FRANCISCO JAVIER TORRES VALLE 71
  • CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALESseñal de reloj "clk". Todas las asignaciones a . . . END IF;señales dentro del proceso serán registradas, ya END PROCESS;que estas sólo cambian de valor en las transicionesde reloj y lo retienen por lo menos hasta la Este proceso es sensible a los cambios en lasiguiente transición. señales "clk", "rst" y "pst", como se indica en laPROCESS (clk) lista sensible. De esta forma es posible realizar laBEGIN descripción de registros con "preset" y "reset" IF ( clkevent AND clk =1 ) THEN asíncronos. La primera instrucción dentro del . . . proceso checa el estado de la señal "rst". Todas las END IF;END PROCESS; señales que son asignadas dentro de la primera porción de la estructura, se asume que serán Este proceso es sensible solamente a los registradas mediante la señal de "rst" asíncrono. Lacambios en la señal "clk", como se indica en la segunda condición checa el estado de la señallista sensible. La primera instrucción, IF... THEN, "pst", y todas las señales que sean asignadas dentrodentro del proceso restringe al resto de las de esta porción del proceso son registradasinstrucciones a ser ejecutadas únicamente durante asíncronamente mediante la señal de "preset"la transición positiva de la señal "clk", por lo que asíncrono "pst". Si las dos primeras condiciones noahora también todas las señales que reciban una se cumplen, el resto de la instrucción IF... THEN...asignación dentro de la instrucción IF... THEN ELSIF, representa el funcionamiento síncrono delserán registradas y mantendrán dicho valor registro.recibido por lo menos hasta la siguiente transición EJEMPLOde reloj.PROCESS(rst, clk) A continuación se muestra una forma de realizarBEGIN la descripción de un registro de 32 bits con "reset" IF rst = 1 THEN asíncrono. . . . ELSIF(clkevent AND clk=1) THEN PROCESS(r, clk2) . . . BEGIN END IF; IF (r = 1) THENEND PROCESS; q <= x"123DEABC" ; ELSIF (clk2event AND clk2=1) THEN Este proceso es sensible a los cambios en la q <= d; END IF;señal de reloj "clk" y la señal de reinicio "rst", END PROCESS;como es indicado en la lista sensible. Medianteeste método de descripción comportamental es Asumiendo que "q" y "d" son declarados comoposible registrar señales y además tener un "reset" señales o puertos de 32 bits, entonces este códigoasíncrono. La primera instrucción checa primero el ejemplifica la implementación de un registro de 32estado de la señal "rst". Las señales que son bits con d(i) como entrada, q(i) como salida, "clk2"asignadas dentro de esta porción de la estructura como la señal de reloj, y "r" como la señal deIF... THEN... ELSIF, se asume que son registradas "reset" asíncrono para algunos registros y tambiénasíncronamente con la señal de "reset" asignada, y como señal de "preset" asíncrono para otros. Estoserán sintetizadas en registros con capacidad para significa que cuando se cumple la condición: r =realizar dicha acción. Si la condición de "reset" no 1, la asignación q <= x"ABC123DE" provocaráse cumple, el resto de la instrucción IF... THEN... que algunos registros sean puestos en alto mientrasELSIF, funciona como el proceso explicado que otros van a quedar en un estado de cero lógico.anteriormente.PROCESS(rst, pst, clk) EJEMPLOSBEGINIF rst = 1 THEN A continuación realice la descripción de los. . .ELSIF pst = 1 THEN siguientes registros de acuerdo con su tabla de. . . funcionamiento.ELSIF (clkevent AND clk=1) THENIEC FRANCISCO JAVIER TORRES VALLE 72
  • CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALESREGISTRO NO. 1 ARCHITECTURE areg2 OF reg2 IS Elabore la descripción del registro utilizando un BEGIN PROCESS(clk, reset, d)22V10 y posteriormente trate de implementar la BEGINdescripción en un 16V8, simule la descripción y IF clkevent AND clk = 1 THENobtenga sus conclusiones. IF reset = 0 THEN q <= 0;TABLA DE FUNCIONAMIENTO ELSE q <= d; END IF; ENTRADAS SALIDAS END IF; END PROCESS; reset d clk q END areg2; 1 0 transición positiva 0 REGISTRO NO. 3 1 1 transición positiva 1 Elabore la descripción del siguiente registro 0 - - 0 utilizando un 22V10, simule la descripción y obtenga sus conclusiones.ENTITY reg1 IS PORT(reset: IN bit; TABLA DE FUNCIONAMIENTO d: IN bit; clk: IN bit; q: OUT bit); ENTRADAS SALIDASEND reg1; enable d clk qARCHITECTURE areg OF reg1 ISBEGIN 1 0 transición positiva 0 PROCESS(clk, reset, d) BEGIN 1 1 transición positiva 1 IF reset = 0 THEN q <= 0; 0 - - Z ELSIF clkevent AND clk = 1 THEN q <= d; LIBRARY ieee; END IF; USE ieee.std_logic_1164.ALL; END PROCESS;END areg; ENTITY reg2 IS PORT(enable: IN std_logic; d: IN std_logic;REGISTRO NO. 2 clk: IN std_logic; q: OUT std_logic); Elabore la descripción del registro utilizando un END reg2;22V10 y posteriormente utilice un 16V8, simule ladescripción en ambos casos y obtenga sus ARCHITECTURE areg2 OF reg2 ISconclusiones. SIGNAL q_tmp: std_logic; BEGINTABLA DE FUNCIONAMIENTO -- lógica registrada ENTRADAS SALIDAS PROCESS(clk, reset, d) BEGINreset d clk q IF clkevent AND clk = 1 THEN q_tmp <= d; 1 0 transición positiva 0 END IF; END IF; 1 1 transición positiva 1 END PROCESS; 0 - transición positiva 0 -- buffer q <= q_tmp WHEN enable = 1 g Z; END areg2;ENTITY reg2 IS PORT(reset, d,clk: IN bit; q: OUT bit);END reg2;IEC FRANCISCO JAVIER TORRES VALLE 73
  • CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES4.7 CONTADORES LIBRARY ieee; USE ieee.std_logic_1164.ALL; La finalidad de un contador es computar el USE ieee.numeric_std.ALL;número de ocurrencias de un evento que se da enintervalos aleatorios o uniformes. En los siguientes ENTITY counter IS PORT (clk, load, reset: IN std_logic;ejemplos se muestran diferentes tipos de data: IN unsigned(3 DOWNTO 0);contadores y la forma más común de describir su count: BUFFER unsigned(3 DOWNTO 0));comportamiento con VHDL. END counter;EJEMPLOS ARCHITECTURE archcounter OF counter IS BEGINLIBRARY ieee; PROCESS(clk, reset, load, count, data)USE ieee.std_logic_1164.ALL; BEGINUSE ieee.numeric_std.ALL; IF ( clk’event AND clk= 1 ) THEN IF reset = 1 THENENTITY counter IS count <= (OTHERS => 0); PORT( clk, load: IN std_logic; ELSIF load = 1 THEN data: IN unsigned(3 DOWNTO 0); count <= data; count: BUFFER unsigned(3 DOWNTO 0)); ELSEEND counter; count <= count + 1; END IF;ARCHITECTURE archcounter OF counter IS END IF;BEGIN END PROCESS; PROCESS( clk, load, count, data ) END archcounter; BEGIN IF( clkevent AND clk= 1 ) THEN En este ejemplo se describe un contador IF load = ’1’ THEN count <= data; ascendente, con reset síncrono dependiendo de la ELSE entrada "reset", además, con capacidad de carga count <= count + 1; paralela de datos mediante el puerto de control END IF; "load". Al igual que el ejemplo anterior, la END IF; END PROCESS; instrucción IF (clkevent AND clk = 1 ) aparece alEND archcounter; principio e implica que todas las operaciones del La instrucción USE ieee.numeric_std.ALL es contador se ejecuten durante la transición positivapara incluir el tipo de datos unsigned, así como las de la señal de reloj "clk". La subsecuentefunciones aritméticas y lógicas que nos permiten instrucción IF describe la operación de resetmanipular objetos de datos que manejen este tipo. síncrono durante la transición positiva del reloj. ElEn este ejemplo en particular nos interesa la resto de las operaciones, el conteo y la cargafunción "+" definida para ser utilizada con el tipo paralela, son descritas en las siguientes cláusulasunsigned y enteros. Ya que el operador "+" en ELSIF y ELSE dentro de la misma instrucción IF,VHDL originalmente está definido únicamente por lo que podemos observar que la operación depara ser utilizado con enteros. La arquitectura que reset tiene precedencia sobre las operaciones dedescribe al contador utiliza el estilo carga y conteo. Así, si reset no es 1, entonces lacomportamental. En este diseño el contador operación de conteo depende de la señal "load".funciona ascendentemente y, además, realiza carga Como podemos ver las operaciones de carga yparalela de datos síncronamente con la señal de conteo son identificas al contador en el ejemploreloj dependiendo del valor del puerto de control anterior."load". Ahora se expone a continuación un contador Dentro del proceso, la instrucción IF ( clk’event con reset asíncrono y con capacidad para salida enAND clk= ’1’ ) THEN... implica que el alta impedancia.funcionamiento del contador, conteo y carga LIBRARY ieee;paralela, tome lugar durante la transición positiva USE ieee.std_logic_1164.ALL;de la señal de reloj "clk". La siguiente instrucción USE ieee.numeric_std.ALL;IF... THEN... define la operación de conteo o de ENTITY cnt_oe IScarga paralela del circuito dependiendo de la PORT(clk, reset, oe: IN std_logic;condición: load = 1. A continuación se expone un count_io: INOUT std_logic_vectorcontador similar pero con reset síncrono. (7 DOWNTO 0));IEC FRANCISCO JAVIER TORRES VALLE 74
  • CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALESEND ldcnt; 1 0 transición positiva descendenteARCHITECTURE arch_cnt_oe OF cnt_oe IS SIGNAL count: std_logic_vector 0 - - 0 (7 DOWNTO 0);BEGIN PROCESS(clk, reset, count) ENITTY counter IS BEGIN PORT(reset: IN bit; IF reset = 0 THEN ud: IN bit; count <= (OTHERS => 0); clk: IN bit; ELSIIF ( clk’event AND clk=’1’ ) THEN conteo: INOUT integer RANGE 0 TO 15 count <= count + 1; ); END IF; END counter; END PROCESS; count_io <= count WHEN oe = ’1’ ELSE ARCHITECTURE counter OF counter IS (OTHERS => Z); BEGINEND arch_cnt_oe; PROCESS(reset,ud,clk) BEGIN IF reset = 1 THEN Este diseño desempeña un contador ascendente conteo <= 0;con reset asíncrono. Cuando se cumple la ELSIF (clkevent AND clk = 1) THENcondición: reset = 0, se produce un reset IF ud = 1 THENasíncrono en el contador. Cuando esta condición conteo <= conteo + 1; ELSEno se satisface, la operación de conteo funciona conteo <= conteo - 1;síncronamente con la señal de reloj "clk". Además, END IF;independientemente de las señal de reset, el uso de END IF; END counter;los buffers de tres estados en los pines de I/O esposible mediante el uso del puerto de entrada "oe".Así, cuando se satisface la condición oe = 1, el CONTADOR NO. 2conteo es conducido hacia los pines de salida. Delo contrario presentarán alta impedancia en los ENTRADAS SALIDASpines del circuito. Conceptualmente, el código enVHDL del contador se implementa de la siguiente reset up_down clk conteomanera. 1 1 transición positiva ascendente 1 0 transición positiva descendente 0 - transición positiva 0 ENITTY counter IS PORT(reset: IN bit; ud: IN bit; clk: IN bit; Figura 4.32 conteo: INOUT integer RANGE 0 TO 15 ); A continuación se elabore la descripción en END counter;VHDL para los siguientes contadores de cuatro ARCHITECTURE counter OF counter ISbits de acuerdo a su tabla de funcionamiento y BEGINposteriormente realice las simulaciones. Elija el PROCESS(reset,ud,clk) BEGINdispositivo que más convenga. IF (clkevent AND clk = 1) THEN IF reset = 1 THENCONTADOR NO. 1 conteo <= 0; ELSIF ud = 1 THEN conteo <= conteo + 1; ENTRADAS SALIDAS ELSE conteo <= conteo - 1; reset up_down clk conteo END IF; END IF; 1 1 transición positiva ascendente END counter;IEC FRANCISCO JAVIER TORRES VALLE 75
  • CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALESCONTADOR NO. 3 transición descendente 1 1 0 positiva 9-0 ENTRADAS SALIDAS 0 1 - - 0reset oe up_down clk conteo 0 0 - - Z 1 1 1 transición positiva ascendente 1 1 0 transición positiva descendente ** NOTA 0 1 - - 0 Aunque se encuentre la salida del circuito en alta impedancia, el conteo y reset asíncrono deben 0 0 - - Z seguir funcionando internamente. En el momento de cambio de sentido ascendente/descendente, el ** NOTA contador no debe de iniciar la cuenta, por ejemplo: si el contador está funcionando ascendentemente y Aunque se encuentre la salida del circuito en se encuentra en el número 5 cuando se cambia aalta impedancia, el conteo y reset asíncrono deben descendente, en la siguiente transición positiva seseguir funcionando internamente. debe continuar la cuenta con un 4, después un 3... etc.LIBRARY ieee;USE ieee.std_logic_1164.ALL;USE ieee.numeric_std.ALL; LIBRARY ieee; USE ieee.std_logic_1164.ALL;ENITTY counter IS USE ieee.numeric_std.ALL; PORT(reset: IN std_logic; ud: IN std_logic; ENITTY counter IS oe: IN std_logic; PORT(reset: IN std_logic; clk: IN std_logic; ud: IN std_logic; conteo: INOUT unsigned (3 DOWNTO 0) oe: IN std_logic; ); clk: IN std_logic;END counter; conteo: INOUT unsigned (3 DOWNTO 0) );ARCHITECTURE counter OF counter IS END counter; SIGNAL count_tmp: unsigned(3 DOWNTO 0);BEGIN ARCHITECTURE counter OF counter IS PROCESS(reset,ud,clk) SIGNAL count_tmp: unsigned(3 DOWNTO 0); BEGIN BEGIN IF reset = 1 THEN PROCESS(reset,ud,clk) count_tmp <= (OTHERS => 0); BEGIN ELSIF (clkevent AND clk = 1) THEN IF reset = 1 THEN IF ud = 1 THEN count_tmp <= (OTHERS => 0); count_tmp <= count_tmp + 1; ELSIF (clkevent AND clk = 1) THEN ELSE IF ud = 1 THEN count_tmp <= count_tmp - 1; count_tmp <= count_tmp + 1; END IF; IF count_tmp = 9 THEN END IF; count_tmp <= (OTHERS => 0); END IF;-- instanciación de los buffers ELSIF ud = 0 THEN conteo <= count_tmp WHEN oe = 1 ELSE count_tmp <= count_tmp - 1; (OTHERS Z); IF count_tmp = 0 THENEND counter; count_tmp <= "1001"; END IF; END IF;CONTADOR NO. 4 END IF; -- instanciación de los buffers ENTRADAS SALIDAS conteo <= count_tmp WHEN oe = 1 ELSE (OTHERS Z);reset oe up_down clk conteo END counter; transición ascendente 1 1 1 positiva 0-9IEC FRANCISCO JAVIER TORRES VALLE 76
  • CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES4.8 ALU DE CUATRO BITS solamente con un bit, y en la entidad TOP se realiza la interconexión de cuatr de estos módulos Realice la descripción en VHDL para la para formar la ALU de cuatro bits.siguiente unidad aritmético - lógica de acuerdo a ENTIDAD TOPla tabla de funcionamiento utilizando un 22V10. Elcircuito consta de 2 bus de entrada "a" y "b", de 4 LIBRARY ieee;bits cada uno y mediante el bus "s", de 3 bits, se USE ieee.std_logic_1164.ALL;selecciona la operación a realizar en la ALU. USE work.modulo_alu.ALL;Dicha operación se realiza combinacionalmente y ENTITY alu ISen el momento que ocurre una transición positiva PORT(a: IN std_logic_vector(3 DOWNTO 0);en la señal de reloj el resultado de dicha operación b: IN std_logic_vector(3 DOWNTO 0);se registra en los flip-flops tipo D del 22V10. cin: IN std_logic ;Además, la salida registrada será conducida hacia clk: IN std_logic ; reset: IN std_logic ;los pines de salida (I/O pads) únicamente cuando oe: IN std_logic ;se habiliten los buffers de tres estados mediante la s: IN std_logic_vector(2 DOWNTO 0);entrada de control "oe", de lo contrario deberán cout: OUT std_logic; output: OUT std_logic_vector(3 DOWNTO 0)encontrarse en alta impedancia. ); END alu ; ENTRADAS SALIDAS ARCHITECTURE a_alu OF alu ISs(2) s(1) s(0) clk oe output cout SIGNAL c2, c3, c4: std_logic; SIGNAL salida_r: std_logic_vector transición a AND (3 DOWNTO 0); 0 0 0 0 0 positiva b ATTRIBUTE synthesis_off OF c2, c3, c4: SIGNAL IS true; transición BEGIN 0 0 1 0 a OR b 0 positiva x0: modulo PORT MAP(a(0), b(0), cin, clk, reset, s, c2, salida_r(0)); transición a XOR 0 1 0 0 0 positiva b x1: modulo PORT MAP(a(1), b(1), c2, clk, reset, s, c3, salida_r(1)); transición 0 1 1 0 NOT a 0 positiva x2: modulo PORT MAP(a(2), b(2), c3, clk, reset, s, c4, salida_r(2)); transición x3: modulo PORT MAP(a(3), b(3), c4, clk, 1 0 0 0 a+0 0 positiva reset, s, cout, salida_r(3)); transición acarreo de -- instanciación de los biffers 1 0 1 0 a+b positiva la suma output <= (OTHERS=>Z) WHEN oe=1 ELSE salida_r; transición acarreo de END a_alu; 1 1 0 0 a + b positiva la suma transición MÓDULO 1 1 1 0 a-1 0 LIBRARY ieee ; positiva USE ieee.std_logic_1164.ALL; - - - - 1 Z 0 ENTITY modulo IS PORT (in1: IN std_logic; in2: IN std_logic; ** NOTA cin: IN std_logic; clk: IN std_logic; b = NOT b reset: IN std_logic; selec: IN std_logic_vector(2 DOWNTO 0); cout: OUT std_logic ;4.8.1 DESCRIPCIÓN ESTRUCTURAL salida_r: INOUT std_logic); END modulo; La descripción se realiza utilizando tresarchivos, los cuales contienen: la entidad TOP, el ARCHITECTURE a_modulo OF modulo IS SIGNAL salida_comb: std_logic ;módulo y el paquete respectivamente. El módulo BEGINrealiza todas las operaciones dela ALU pero PROCESS(in2, in1, selec, cin)IEC FRANCISCO JAVIER TORRES VALLE 77
  • CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES CONSTANT uno: std_logic := 1; 4.8.2 DESCRIPCIÓN BEGIN CASE selec IS COMPORTAMENTAL WHEN o"0" => LIBRARY ieee ; salida_comb <= in1 AND in2; USE ieee.std_logic_1164.ALL; cout <= 0; USE ieee.numeric_std.ALL; WHEN o"1" => salida_comb <= in1 OR in2; ENTITY aluIS cout <= 0; PORT (in1: IN unsigned(3 DOWNTO 0); WHEN o"2" => in2: IN unsigned(3 DOWNTO 0); salida_comb <= in1 XOR in2; cin, clk: IN std_logic; cout <= 0; oe: IN std_logic; WHEN o"3" => reset: IN std_logic; salida_comb <= NOT in1; selec: IN integer RANGE 0 TO 7; cout <= 0; cout: OUT std_logic ; WHEN o"4" => salida: INOUT unsigned(3 DOWNTO 0); salida_comb <= in1; ); cout <= 0 ; END alu; WHEN o"5" => salida_comb<=in2 XOR in1 XOR cin; ARCHITECTURE alu OF alu IS cout <= ( in1 AND cin ) OR SIGNAL comb, reg: unsigned(3 DOWNTO 0); ( in2 AND cin ) OR SIGNAL c: unsigned(4 DOWNTO 0); ( in2 AND in1 ); SIGNAL c1,c2,c3 WHEN o"6" => ATTRIBUTE synthesis_off OF c1, c2, c3: salida_comb<= (NOT in2) XOR in1 SIGNAL IS true XOR cin; BEGIN cout <= (in1 AND cin) OR c(0) <= cin; (( NOT in2 ) AND cin) OR cout <= c(4); (( NOT in2 ) AND in1); c1 <= c(1); WHEN o"7" => c2 <= c(2); salida_comb<=uno XOR in1 XOR cin; c3 <= c(3); cout <= ( in1 AND cin) OR PROCESS(in2, in1, selec, cin) (uno AND cin ) OR CONSTANT uno: unsigned:= "0001"; ( uno AND in1 ) ; BEGIN WHEN OTHERS => FOR i IN in1range LOOP NULL; CASE selec IS END CASE; WHEN 0 => END PROCESS; comb(i) <= in1(i) AND in2(i); c(i+1) <= 0; PROCESS( salida_comb, clk, reset ) WHEN 1 => BEGIN comb(i) <= in1(i) OR in2(i); IF rising_edge( clk ) THEN c(i+1) <= 0; salida_r <= salida_comb; WHEN 2 => END IF; comb(i) <= in1(i) XOR in2(i); END PROCESS; c(i+1) <= 0; WHEN 3 =>END a_modulo; comb(i) <= NOT in1(i); c(i+1) <= 0;PAQUETE WHEN 4 => comb(i) <= in1(i); c(i+1) <= 0 ;LIBRARY ieee; WHEN 5 =>USE ieee.std_logic_1164.ALL; comb(i) <= in2(i) XOR in1(i) XOR c(i);PACKAGE modulo_alu IS c(i+1) <= (in1(i) AND c(i)) OR COMPONENT modulo (in2(i) AND c(i)) OR PORT(in1: IN std_logic; (in2(i) AND in1(i); in2: IN std_logic ; WHEN 6 => cin: IN std_logic ; comb(i) <= (NOT in2(i)) XOR clk: IN std_logic ; in1(i) XOR c(i); reset: IN std_logic ; c(i+1) <= (in1(i) AND c(i)) OR selec: IN std_logic_vector(2 DOWNTO 0); ((NOT in2(i)) AND c(i)) OR cout: OUT std_logic ; ((NOT in2(i)) AND in1(i)); salida_r: INOUT std_logic ) ; WHEN 7 => END COMPONENT; comb(i) <= uno(i) XOR in1(i)END modulo_alu; XOR c(i); c(i+1) <= (in1(i) AND c(i)) ORIEC FRANCISCO JAVIER TORRES VALLE 78
  • CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES (uno(i) AND c(i)) OR 1. REGISTRO DEL ESTADO PRESENTE. (uno(i) AND in1(i)) ; Este registro es un conjunto de n flip-flops WHEN OTHERS => NULL; sincronizados con la misma señal de reloj END CASE; para almacenar el estado presente en la END LOOP; máquina. END PROCESS; 2. LÓGICA COMBINACIONAL PARA GENERAR EL PROCESS( comb, clk, reset ) SIGUIENTE ESTADO. BEGIN IF rising_edge( clk ) THEN 3. Una máquina de estados solamente puede reg <= comb; estar en un estado a un tiempo dado, es END IF; END PROCESS; decir no puede hacer dos cosas a la vez. La lógica combinacional permite que en cada salida <= reg WHEN oe = 0 ELSE transición activa del reloj, la máquina vaya (OTHERS => Z); de un estado a otro o se mantenga en el cout <= 0 WHEN selec = 7 ELSE mismo dependiendo de las condiciones c(4); definidas por el diseñador.END alu;s 4. LÓGICA COMBINACIONAL DE SALIDA.4.9 MÁQUINAS DE ESTADO Las salidas normalmente están en función del estado presente y/o también en función de las Una máquina de estados es un circuito entradas (Máquina de Estados de Mealy). Essecuencial que es diseñado para seguir un patrón común que en una máquina de estados dede funciones previamente definidas. Existen dos Moore se desee que las salidas estén entipos de máquinas de estado: Mealy y Moore. En función del siguiente estado en vez de utilizaruna máquina de estados de Moore, las salidas están el actual cuando se utiliza una señal de relojúnicamente en función del estado presente. Si es de alta frecuencia.una máquina de estados de Mealy, las salidas estánen función del estado presente y de las entradas. A continuación se muestran las estructuras paraUna máquina de estados se compone de tres partes: máquinas de estados de Moore y Mealy Figura 4.33 Máquina de Estados de Moore Figura 4.34 Máquina de Estados de MealyIEC FRANCISCO JAVIER TORRES VALLE 79
  • CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES El uso del reset garantiza un comportamiento funcionar. Por lo que el reset siempre debe serseguro del circuito. Esto asegura que la máquina implementado en una máquina de estados parasiempre comience en un estado conocido y válido asegurar un correcto funcionamiento. Se prefiere elantes de la primera transición de reloj. Si no se uso de reset asíncrono sobre el síncrono porque unutiliza el reset, no existe una forma de predecir el reset asíncrono no requiere ser implementadovalor inicial de los flip-flops del registro de estado mediante ecuaciones, minimizando la lógicadurante el encendido del dispositivo en el que se combinacional del circuito. A continuación seimplementa la máquina de estados. Además existe muestran las tres formas más comunes de codificarla posibilidad de que la máquina comience en un los estados en una máquina, suponiendo que utilizaestado no válido y entonces nunca comenzaría a ocho estados: SECUENCIA ONE HOT SECUENCIA ESTADOS BINARÍA ENCODIG GRAY S0 000 00000001 000 S1 001 00000010 001 S2 010 00000100 011 S3 011 00001000 010 S4 100 00010000 110 S5 101 00100000 100 S6 110 01000000 101 S7 111 10000000 111 Cuando se implementa una máquina de estados eficiente y las herramientas de síntesis generanen un FPGA se prefiere la codificación ONE circuitos con área optimizada y mejor desempeño.HOT ENCODING porque estos dispositivos Aunque también es posible que el usuario asignecuentan con bastantes flip-flops y una máquina de los valores de los estado como mejor convenga.estados codificada de esta manera es másIEC FRANCISCO JAVIER TORRES VALLE 80
  • CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALESEJEMPLO Figura 4.35 Diagrama de Estados-- Máquina de Estados del tipo Mealy state <= S0; ELSIF clkevent and clk = 1 THENLIBRARY ieee; state <= next_state ;USE ieee.std_logic_1164.ALL; END IF; END PRCESS;ENTITY mealy IS PORT ( clk: IN std_logic; -- lógica combinacional para definir el reset: IN std_logic; -- siguiente estado entradas: IN std_logic_vector PROCESS(entradas, state) (3 DOWNTO 0); BEGIN salidas: OUT std_logic_vector CASE state IS (3 DOWNTO 0)) ; WHEN S0 =>END mealy; IF entradas = "0001" THEN next_state <= S1;ARCHITECTURE comportamental OF mealy IS END IF; -- ONE HOT ENCODED state machine WHEN S1 =>TYPE states IS (S0, S1, S2, S3, S4); IF entradas = "1001" THENATTRIBUTE enum_encoding OF states: TYPE IS next_state <= S1;"00001 " & -- S0 -- atributo de WARP ELSIF entradas <= "1011" THEN"00010 " & -- S1 next_state <= S4;"00100 " & -- S2"01000 " & -- S3 ELSIF entradas = "0101" THEN"10000" ; -- S4 next_state <= S2;SIGNAL state, next_state: states ; END IF;BEGIN WHEN S2 =>-- registro del estado presente IF entradas = "0111" THENPROCESS(clk, reset) next_state <= S1;BEGIN ELSIF entradas = "0010" THEN IF reset=0 THEN next_state <= S2 ;IEC FRANCISCO JAVIER TORRES VALLE 79
  • CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES ELSIF entradas = "1100" THEN 1. - Suponiendo que esta vacía al principio, next_state <= S3; END IF; cuando se presione el botón de "INICIO", activo WHEN S3 => en ALTO, se enciende la válvula de agua fría. IF entradas = "0101" THEN next_state <= S4; 2. - En el momento que el nivel del agua llegue END IF; al SENSOR, activo en ALTO, se apaga la válvula WHEN S4 => de agua fría y se enciende la de agua caliente IF entradas = "0011" THEN next_state <= S2; durante dos minutos. ELSIF entradas = "0100" THEN next_state <= S3; 3. - Después se apaga la válvula de agua caliente ELSIF entradas = "0110" THEN y se enciende el motor durante cuatro minutos. next_state <= S4; ELSIF entradas = "1110" THEN 4. - Transcurridos los cuatro minutos, se apaga next_state <= S0 ; el motor y se enciende la válvula de desagüe END IF; durante tres minutos. WHEN OTHERS => NULL; 5. - Una vez que se ha vaciado la lavadora se END CASE; cierra la válvula de desagüe y el ciclo de lavadoEND PROCESS; comenzará nuevamente cuando se vuelva a-- lógica combinacional de salida presionar el botón de inicio.salidas <= "1000" WHEN (state= S1) ELSE "0110" WHEN (state=S1 AND LIBRARY ieee; entradas="1001") ELSE USE ieee.std_logic_1164.ALL; "1100" WHEN (state=S2) ELSE "0000" WHEN (state= S2 AND ENTITY lavadora IS entradas="0010") ELSE PORT( clk: IN std_logic; "0011" WHEN (state=S3) ELSE inicio: IN std_logic; "0111" WHEN (state=S4) ELSE sensor: IN std_logic; "0101" WHEN (state= S4 AND vaf: OUT std_logic; entradas="0110") ELSE vac OUT std_logic; "1011"; -- asignación en el estado de motor: OUT std_logic; -- reset S0 des: OUT std_logicEND comportamental; ); END lavadora;EJEMPLO ARCHITECTURE state_machine OF lavadora IS Elabore la descripción en VHDL del siguiente TYPE states IS (S0,S1,S2,S3,S4,S5,S6,S7,S8,S9,S10);problema mediante máquina de estados definiendo SIGNAL state, nex_state: states;su diagrama de estados, frecuencia de trabajo y SIGNAL outputs: std_logic_vectordispositivo a utilizar. Se desea diseñar el circuito (3 DOWNTO 0);de control para lavadora de la siguiente figura. CONSTANT vaf_on: std_logic_vector (3 DOWNTO 0):="0001"; CONSTANT vac_on: std_logic_vector (3 DOWNTO 0):="0010"; CONSTANT mot_on: std_logic_vector (3 DOWNTO 0):="1000"; CONSTANT des_on: std_logic_vector (3 DOWNTO 0):="0100"; CONSTANT all_off: std_logic_vector (3 DOWNTO 0):="0000"; BEGIN -- REGISTRO DE ESTADO PROCESS(clk, inicio, next_state) BEJÍN IF inicio = 0 THEN state <= S10; -- todo apagado Figura 4.36 ELSIF clkevent AND clk = 1 THEN state <= next_state; END IF; El ciclo de lavado es de la siguiente manera: END PROCES; -- LÓGICA COMBINACIONAL PARA DEFINIR ELIEC FRANCISCO JAVIER TORRES VALLE 81
  • CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES-- SIGUIENTE ESTADO PROCESS(clk, state, sensor) BEGIN CASE state IS WHEN S0 => IF sensor=0 THEN next_state <= S0; ELSIF sensor=1 THEN next_state <= S1; END IF; WHEN S1 => next_state <= S2; WHEN S2 => next_state <= S3; WHEN S3 => next_state <= S4; WHEN S4 => next_state <= S5; WHEN S5 => next_state <= S6; WHEN S6 => next_state <= S7; WHEN S7 => next_state <= S8; WHEN S8 => next_state <= S9; WHEN S9 => next_state <= S10; WHEN S10 => IF inicio = 0 THEN next_state <= S10; ELSE next_state <= S0; END IF; WHEN OTHERS => NULL; END CASE; END IF; END PROCESS;-- LÓGICA COMBINACIONAL DE SALIDAoutputs <= all_off WHEN (state=S10) ELSE vaf_on WHEN (state=S0 AND sensor=0) ELSE vac_on WHEN (state=S1) ELSE vac_on WHEN (state=S2) ELSE mot_on WHEN (state=S3) ELSE mot_on WHEN (state=S4) ELSE mot_on WHEN (state=S5) ELSE mot_on WHEN (state=S6) ELSE des_on WHEN (state=S7) ELSE des_on WHEN (state=S8) ELSE des_on WHEN (state=S9) ELSE all_off;END state_machine;IEC FRANCISCO JAVIER TORRES VALLE 82