8. Programacion de Sistemas Digitales Con Vhdl

March 29, 2018 | Author: Fabian David Manrique Monsalve | Category: Vhdl, Logic Gate, Field Programmable Gate Array, Computer Programming, Electronic Design


Comments



Description

NOTAS DE CLASEDISPOSITIVOS LOGICOS PROGRAMABLES PROGRAMACION DE SISTEMAS DIGITALES CON VHDL PROFESOR: GERMAN MORALES Z. AGOSTO DE 2011 1 PROGRAMACION DE SISTEMAS DIGITALES CON VHDL Lenguaje de programación - Hardware Description Lenguaje (VHDL) Very High Speed Integrated Circuit (VHSIC) (Norma IEEE Std 1076-1993) Permite integrar “Sistemas Digitales” que contienen una gran cantidad de subsistemas electrónicos con el fin de minimizar el tamaño de la aplicación. Ya sea en un solo CI y si el problema es complejo, a través de una serie sucesiva de circuitos programables como CPLD (Dispositivo Lógico Programable complejo o FPGA (Arreglo de Compuertas Programables en campo). CARACTERISTICAS • Lenguaje estructurado por lo que permite descripciones jerárquicas (multinivel) en las que un sistema digital se puede modelar como un conjunto de componentes interconectados y cada componente, a su vez, como un conjunto de menor jerarquía interconectados (subcomponentes) y así sucesivamente. Describe, analiza y evalúa el comportamiento de un sistema electrónico digital. Permite la integración de Sistemas Digitales en un Dispositivo Lógico programable (Gal baja capacidad o CPLD Y FPGA mayor capacidad. Lenguaje orientado a la descripción de Sistemas Digitales. • • • Tipo de descripcion o modelado de sistemas digitales. 1. Descripcion estructural: se especifican los componentes que Forman el sistema y sus interconexiones. (“structural modeling”) 2. Descripcion funcional: o de comportamiento en la que se especifica el funcionamiento del sistema. (“behavioral modeling”) 3. Descripcion a nivel de transferencia entre registros o flujos de datos en la que se especifica el comportamiento de las señales de salida a partir de las señales de entrada. (Register Transfer Level, RTL”) 2.1 UNIDADES BASICAS DE DISEÑO El lenguaje VHDL permite describir cualquier sistema digital mediante definición de un modelo que proporciona la descripcion externa y una o más descripciones internas del mismo. El modulo de un circuito contiene un conjunto de sentencias organizadas en las siguientes unidades: • • • • • entity declaration architecture configuration (primaria) (secundaria) (primaria) package declaration (primaria) package body (secundaria) Una unidad es secundaria porque depende de una unidad primaria. 2 Las dos primeras unidades Entity declaration y architecture son indispensables en la estructura de un programa. La descripcion en VHDL de un sistema digital se almacena en un fichero fuente de extensión .vhdl cuya estructura genérica se representa así: library nombre_de_biblioteca; use nombre_de_biblioteca. Nombre_de _paquete.componentes; entity nombre_de_entidad is ….(zona de declaraciones); end nombre_de_entidad; architecture nombre_de_arquitectura of nombre_de_entidad is …(zona de declaraciones); begin …(cuerpo de la arquitectura) end nombre_de_arquitectura 2.2 ENTIDAD – “Entity” • • Es el bloque elemental de diseño en VHDL donde se identifica con claridad sus entradas y salidas generales que permiten al sistema interactuar con el exterior. Entidades: de elementos electrónicos que conforman un sistema digital (sumadores, contadores, compuertas, flip flops, memorias, Multiplexores, circuitos combinatorios, circuitos secuenciales, maquinas de estado, etc.). Una entidad se puede representar por: o o o Descripción a nivel de compuertas Símbolo funcional de la entidad. Diagrama de bloques. • 3 signal-type).Sintaxis de una declaración VHDL. Buffer: La señal es una salida de la entidad y su valor puede ser leído dentro de la arquitectura de la entidad. …. Bit_vector (vectores de bits) conjunto de bits para cada variable de entrada o salida. A: in bit: = ‘0’.. Integer (numero entero) que representa un numero entero. Modo. signal-name. Inout: La señal se puede emplear como una entrada o una salida. (generic: entidades en que los valores de algunos parámetros se concretan en el momento de utilizarlas). In: La señal es una entrada a la entidad. solamente por otras entidades que la utilicen. B: in bit: = ‘0’. end mux21. signal-names: mode signal-type). Ejemplo: Si el tiempo de propagación de las señales de entrada hasta la salida es de 5 ns se puede incluir esta información en la entidad utilizando : entity mux21 is generic (t_delay: TIME:= 5 ns). (Nombre. Mode. (Modo): permite definir la dirección que tomara la información. Se asignan de acuerdo a un diseño en particular. Un puerto debe tener: port (signal-names: mode. Out: La señal es una salida de la entidad. el cual equivale a un pin de un símbolo esquemático. signal-type. port (signal-names: mode signal-type. Retroalimentaciones internas declaradas se comporta como una terminal de salida. 4 . Puertos De Entrada – Salida “Port” Puerto. Se refiere a cada una de las señales de entrada y salida. Este modo es típicamente utilizado para terminales de entrada/salida de tres estados en un PLD. std_logic_vector para los puertos vectoriales. Boolean (booleano) que define los valores de FALSO o VERDADERO en una expresión. identificador): se utiliza como una forma de llamar un puerto. port (S: in bit:= ‘0’. end entity-name . asociados a buses de varias lineas. (Tipo de dato): clase de información que se transmite por el puerto. C: out bit ). Algunos tipos mas utilizados son: Bit el cual tiene valores de ‘0’ y ‘1’ lógico. Note que el valor de esta señal no puede ser leída dentro de la arquitectura de la entidad. std_logic para definir puertos escalares asociados a lineas individuales. Tipo de Dato). signal-names: mode signal-type. entity entity-name is generic (declaracion de las constantes). (Nombre. -. Cin: in bit.3 DECLARACION DE ENTIDADES Consiste en la descripción de las entradas y las salidas de un circuito identificado como una entidad (entity) Cin A B 1. o S_4bits S4_bits Dos guiones juntos no son permitidos. 2. Se usa para finalizar una declaración. o Clear#8 Clear_8_ 2. 4. Cin A[3:0] B[3:0] Entidad Sumador Cout SUMA[3:0] 5 . 5. 3. . : Se usa para asignar nombres a las entradas salidas Especificaciones o reglas para identificadores (nombre) • • • • El primer carácter es una letra mayúscula o minúscula.4 Declaracion De Entidades Mediante Vectores Las palabras binarias se conocen como vectores de bits.B.Texto comentario que es ignorado por el compilador. Cout: out bit). end Sumador. Las palabras en negrillas son reservadas para el lenguaje de programación VHDL. o 4suma Suma4 El segundo carácter no puede ser un guión bajo S _4bits. Ejemplo: . o Resta__4 Resta_4_ Un identificador no puede utilizar símbolos. los cuales se consideran un grupo y no como bits individuales.2. SUMA. Cout Entidad Sumador SUMA – Declaración De la Entidad de un circuito Sumador entity sumador is port (A. ieee o std_logic_1164 . no se puede modificar a menos que se utilice el comando to. LIBRERÍA Una librería o biblioteca es un lugar al que se tiene acceso para utilizar unidades de diseño predeterminadas por el fabricante de la herramienta.B: in bit_vector (3 downto 0). end sumador. 0 to 3 (0 hasta 3) Indica el orden de aparición en sentido ascendente. 5. 3. 2.work o o o o  numeric_std std_arith gatesspkg otra  Para un diseño VHDL el compilador crea automáticamente y utiliza una librería “work” 6 . 6. SUMA se definen con cuatro componentes distribuidos en orden descendente por medio del comando: 3 downto 0 (3 hacia 0) Los cuales se agruparían de la siguiente manera: Vector_A(3) = A3 Vector_A(2) = A2 Vector_A(1) = A1 Vector_A(0) = A0 Vector_B(3) = B3 Vector_B(2) = B2 Vector_B(2) = B1 Vector_B(0) = B0 Vector_SUMA(3) = S3 Vector_SUMA(2) = S2 Vector_SUMA(1) = S1 Vector_SUMA(0) = S0 Una vez se ha establecido el orden en que aparecerán los bits enunciados en cada vector. Las librerías o paquetes permiten declarar y almacenar estructuras lógicas seccionadas o complejas que facilitan el diseño. 2. SUMA: out bit_vector (3 downto 0). Cout: in bit. -.4. En VHDL se encuentran definidas dos librerías llamadas ieee y work así:  .1 Declaracion De Entidades Mediante Librerias y Paquetes. Luego la declaración será: 1. Cin: in bit. 4. 7.Los tres vectores A. B.Declaración de la entidad circuito sumador entity sumador is port (A. constantes. Es una unidad de diseño que permite desarrollar un programa en VHDL de una forma ágil. Esta librería (work) se encuentra siempre presente en la compilación de un diseño o diseños que guardan en ella mientras no se especifique otra cosa. debido a que contiene algoritmos preestablecidos (sumadores. Work. Siempre esta presente al desarrollar un diseño y no necesita declaración library. procedimiento y componentes.   Cuando se utiliza algún paquete es necesario llamar a la librería que lo contiene PAQUETE Un paquete VHDL es un archivo que contiene definiciones de objetos que pueden ser utilizados en otros programas.nombre_paquete. mayor que (>). El acceso a la información contenida en un paquete se hace por medio de la sentencia use así: use nombre_libreria. menor que (<) entre otros. El paquete std_logic_1164 contiene todos los tipos de datos que suelen emplearse en VHDL (std_logic_vector. Paquete std_arith define funciones y operaciones aritméticas.std_logic_1164. tipo. etc.) que ya tienen optimizado su comportamiento. como igual (=). Cuando en el diseño se utiliza un paquete es necesario llamar a la librería que lo contiene. con el fin de utilizar en uno o varios programas. Paquete numeric_bit define tipos de datos binarios c0n signo o sin este. 7 .all. en este archivo.all. La clase de objetos que pueden ser puestos en un paquete incluye declaraciones de señal. Paquete numeric_std define funciones para realizar operaciones entre diferentes tipos de datos. función. contadores. Ejemplo: use ieee. además los datos pueden representarse con signo o sin este. La librería work es el lugar establecido donde se almacenan los programas que el usuario va generando. La palabra all indica que puede usar todas las definiciones almacenados en el paquete. Una librería permite también almacenar resultados de la compilación de un diseño. para esto se utiliza la siguiente declaración library ieee. restadores. entre otros. std_logic). -. sin importar como esta organizado en su interior. Se basa 8 . Z0 Z1 Z2 Z3: out std-logic). 3. es decir. Estilo por flujo de datos.Y1: in std_logic. 2. las descripciones consideran la relación entre las entradas y las salidas del circuito. 2. 5. Sintaxis de una definición de arquitectura VHDL.5 ARQUITECTURA (architecture) Se define como la estructura que describe el funcionamiento de una Entidad. constans Z: character<= ‘Z’. 1. end multiplica. Estilos de programación utilizados en el diseño: 1. 2. Expone la forma en que trabaja el sistema. entity multiplica is port (X0 X1 . use ieee. 3. 2.Declaración de entidad circuito multiplicador library ieee. Estilo estructural.Ejemplo: Circuito multiplicador de dos números de dos bits.5. concurrent-statement end architecture-name Ejemplo: signal signal-name: signal-type. 4. El VHDL permite mediante un algoritmo de programación describir los diseños desde el nivel de compuertas hasta sistemas complejos.Y0 . 7. Estilo funcional.1 Descripción Estilo Funcional. Architecture architecture-name of entity-name is type declarations signal declarations constant declarations function definitions procedure definitions component declarations begin concurrent-statement ……….all.std_logic_1164. 6. entity comp is port (A.B) begin if A = B then C = ‘1’. -. 13. 2. architecture functional of comp is begin compara: process (A. 10.B: in bit_vector(1 downto 0).B) begin if (A = ‘0’ and B = ‘0’) then C <= ‘0’. end process compara. 5. 8. 19. 5. 9. 9 .std_logic_1164. else C = ‘0’. 4. end if. 15. 7. entity com_or is port (A. 3. 6. 8. 10.Declaración de funcional compuerta OR library ieee.principalmente en el uso de procesos y declaraciones secuénciales. 17. 14. 18. 6.all. -. architecture functional of com_or is begin process (A. C: out bit). use ieee. 7. 2. C: out std_logic).B: in std_logic. las cuales permiten modelar la función con rapidez. end if. 13. end comp. 11.all. end com_or. end functional. 12. 16. 9. 14. 3. 4. 15. 12. 11.std_logic_1164. Ejemplo 2: Describa mediante declaraciones del tipo if~then~else el funcionamiento de una compuerta OR con base a la tabla de verdad. use ieee. else C <= ‘1’.Declaración de entidad circuito comparador library ieee. 1. Ejemplo1: Comparador de dos números de dos bits: Si A = B entonces C = 1 Si A ≠ B entonces C = 0 A [1:0] B [1:0] Entidad Sumador C Su Arquitectura funcional será: 1. Luego se termina la arquitectura con end (nombre) en el siguiente renglón. library ieee.B) que hace referencia a las señales que determinan el funcionamiento del proceso. 11. -.16. 2. C: out bit). a).5. Este tipo de descripción puede utilizar dos formatos: a.2 Descripción Estilo flujo de datos. Mediante instrucciones when~else. Para el caso de la compuerta OR será: 1. end f_datos. El proceso se ejecuta mediante declaraciones secuenciales del tipo if~then~else.all. 12. Una vez se ha definido el proceso se termina con la palabra end process.Declaración de funcional compuerta OR 2. architecture f_datos of comp is begin C = ‘1’ when (A = B) else ‘0’. Indica la forma en que los datos se pueden transferir de una señal a otra sin necesidad de declaraciones secuenciales if~then~else. describir un circuito en terminos de flujo de datos y operaciones activadas dentro del circuito.B: in bit_vector (1 downto 0). end process. 10. 3. b. Mediante ecuaciones booleanas La forma de flujo de datos en cualquiera de sus representaciones describe el camino que los datos siguen al ser transferidos de las operaciones efectuadas entre las señales de entrada y las señales de salida. use ieee. la arquitectura por flujo de datos será: 1. Tomando el ejemplo del comparador. 9. 5. Varias instrucciones concurrentes adicionales permiten a VHDL. 17. -. 7. end functional. Mediante instrucciones when~else. entity comp is port (A. 10 . 6. En este caso se elimina el proceso y las declaraciones secuenciales if~then~else. 4. 8.Declaración de entidad circuito comparador library ieee. end comp. La declaración del proceso se utiliza para la definición del algoritmo etiqueta opcional: process y une la lista sensitiva (A. 2. Donde: begin: Señala el inicio de la sección donde se comienza a declarar el proceso que rige el comportamiento del sistema.std_logic_1164. 13. architecture compuerta of com_or is begin f <= ‘0’ when (A = ‘0’ and B = ‘0’) else ‘1’. se puede representar por medio de compuertas lógicas básicas y su ecuación booleana será: F = ( A0 ⊗B 0) •( A1 ⊗B1) 1. 11. entity com_or is port (A.3. 4. 4. 10. En este caso se tiene una declaración concurrente donde no importa el orden que se ejecuta. 6.std_logic_1164. 9. C: out std_logic). 11. 11. 8. 11 . end com_or. NOTA: En el caso anterior se tiene una declaración secuencial donde su ejecución debe seguir un orden para evitar la pérdida de la lógica descrita. 10. b). 5.B: in std_logic.all. 8. 5.B: in bit_vector(1 downto 0). 12. end compuerta. end com_or. architecture booleana of comp is begin C <= (A(1) xnor B(1) and A(0) xnor B(1).all. 10. 9. Mediante ecuaciones booleanas. 4.all. end compuerta.std_logic_1164. C: out bit). use ieee. 6.B: in std_logic. 6.Declaración de entidad circuito comparador library ieee. 7. entity com_or is port (A. 9. entity comp is port (A. architecture compuerta of com_or is begin f <= ( A or B). use ieee. 2.std_logic_1164. 8. 3. 7. 3. 5. 12. use ieee. end booleana. -. C: out std_logic).Declaración de funcional compuerta OR library ieee. Si tomamos el comparador de dos bits. Este estilo considera las ecuaciones booleanas del circuito digital de acuerdo a su organización interna. end comp. 13. 2. 12. Para la compuerta OR 1. -. 7. ………… signal-name : mode signal-type) . cada instrucción concurrente se ejecuta de manera simultánea con otras instrucciones concurrentes en el mismo cuerpo de arquitectura. Instrucción component es la mas fundamental de las instrucciones concurrentes y tiene la siguiente sintaxis: label: component-name port map (signal1. las cuales se declaran dentro de la arquitectura y no en la entidad. comparadores. Es un estilo Posicional. las señales en la lista se encuentran asociadas con los puertos de la entidad en el mismo orden en que aparecen en la definición de la entidad. Segundo. label: component-name port map (port1=>signal1. sumadores. debido a que no representan a una terminal (pin) y solo se utilizan para conectar bloques de manera interna a la entidad. si la última instrucción actualiza una señal que es utilizada por la primera instrucción. port1=>signal2. Este tipo de arquitecturas estándares se conoce como componentes.…. Es un estilo explicito. En VHDL es importante aclarar que una jerarquía se refiere al procedimiento de dividir en bloques y no a que un bloque tenga mayor jerarquía que otro. Las instrucciones concurrentes son necesarias para simular el comportamiento del Hardware.. El cuerpo de una arquitectura es una serie de instrucciones concurrentes. Las palabras clave port map introducen una lista que asocial os puertos de la entidad nombrada con señales en la arquitectura actual. donde los elementos conectados se afectan entre si de manera continua. etc. cada uno de los puertos de la entidad se conectan a una señal utilizando el operador “=>” y estas asociaciones pueden enumerarse en cualquier orden.2. con un orden. en un cuerpo de arquitectura VHDL.3 Descripción Estilo estructural. La lista puede escribirse en dos estilos diferentes: Primero.5. no precisamente en segmentos de tiempo particulares... En VHDL conectividad se conoce como netlist7 o listado de componentes.…. La salida de cada uno de los bloques se maneja como una señal.)’ Para iniciar la programación de una entidad de manera estructural es necesario la descomposición lógica del diseño en pequeños submodulos (jerarquizada). En el caso del comparador cada compuerta se encuentra dentro de un paquete gatesspkg. 12 .. component component-name port (signal-name : mode signal-type . signal-name : mode signal-type .6 del cual se toman la estructura del diseño. Basa su comportamiento en modelos establecidos (compuertas.signaln). entonces el simulador regresara a esa primera instrucción y actualizara sus resultados de acuerdo con la señal que acaba de cambiar. De este modo. En VHDL. port1=>signaln). contadores. end component . los cuales permiten analizar de manera practica el circuito ya que la función de entrada / salida es conocida. signal2. Declaración de entidad circuito comparador library ieee. X(0). use work. X(0). end estructural. 5. Las señales X0 y X1 se declaran en la arquitectura y no en la entidad. F: out std_logic).compuerta. Los componentes xnor y and no se declaran debido a que se encuentran en el paquete de compuertas gatesspkg. architecture estructural of comp is signal X: bit_vector (0 to 1). U3: or3 port map (X(0). C).Declaración de entidad circuito combinatorio library ieee.all. 3. 12. el cual se encuentra dentro de la librería de trabajo work. X(2)). Una arquitectura VHDL que utiliza componentes se denomina a menudo una descripción estructural o diseño estructural. A. 13 . X(1). 8. X(1). 15. El siguiente listado muestra la descripción estructural del comparador. 7. end combina. X(2).all. X(1). 8. 1.Los componentes usados en una arquitectura pueden ser los que fueron previamente definidos como parte de un diseño o pueden ser partes de una librería. 2. 12. -.C: in std_logic. 1. B(0). 6.all. 10. 16. 14. end comp. 9. U1: xnor2 port map (A(1). porque define la estructura de interconexión precisa de senales y entidades que realiza la entidad. 2. F). U2: and2 port map (X(0). 4. 9. 4. begin U0: xnor2 port map (A(0). 16. use ieee_std_logic_1164. C. U2: and2 port map (A. U1: and2 port map (C. B.B. C: out bit). entity combina is port (A.std_logic_1164. debido a que no representan un terminal (pin) y solo se utilizan para conectar bloques de manera interna en la entidad. 17. use ieee. B(1).B: in bit_vector(0 to 1). 11. 10. 13. architecture estructural of combina is signal X: bit_vector (0 to 2). 6. 3. entity comp is port (A. 13. end estructural. 11. 15.compuerta. X(1). 5. 14. -. 7. use work. begin U0: and2 port map (B.all. 3.1 Programación de estructuras básicas mediante declaraciones concurrentes.else) se utiliza para asignar valores a una señal determinando así la ejecución de una condición propia del diseño.3.else). En la declaración concurrente no importa el orden en que se escriban las señales. a b c Entidad Prueba f(a. Ejemplo 1. Tipos de declaraciones concurrentes: 1.1 Declaraciones condicionales asignadas a una señal (when . DISEÑO LOGICO COMBINATORIO 3. Las declaraciones concurrentes se encuentran fuera de la declaración de un proceso y suelen usarse en las descripciones de flujo de datos y estructural. Selección de una señal (with-select-when). Declaraciones concurrentes asignadas a señales. La declaración (when . Consideremos la función definida en la siguiente tabla de verdad.c) a 0 B 0 C 0 F 1 14 .else). Declaraciones condicionales asignadas a una señal (when .b. ya que el resultado para determinada función seria el mismo. 3. 2.1. 15. Una función F depende de cuatro variables D.b. D C B A F 15 . 14. 8. 2. Los operadores lógicos más utilizados son: AND. Las operaciones que se efectúen entre ellos (excepto not ) deben realizarse con datos que tengan la misma longitud o palabras de bits. Encuentre la tabla de verdad de la funcion y realice el programa correspondiente en VHDL (utilice la estructura del tipo when-else y operadores lógicos. 13. 9. 3. Descripción de la entidad mostrada en la tabla de la figura.all. 4. Expresiones entre paréntesis Complementos Función AND Función OR Ejemplo 2. -. La función adopta el valor de uno si el numero formado por las cuatro variables es inferior o igual a 7 y superior a 3. 10.Ejemplo combinacional básico library ieee. 3. 5. XNOR y NOT. f: out std_logic. 5. XOR. end tabla. use ieee. Descripción de la entidad: 1. NOR.A donde A es la variable menos significativa. architecture ejemplo of tabla is begin f <= '1' when (a='0' and b ='0' and '1' when (a='0' and b ='1' and '1' when (a='1' and b ='1' and '1' when (a='1' and b ='1' and '0'. 11. OR.0 0 0 1 1 1 1 0 1 1 0 0 1 1 1 0 1 0 1 0 1 0 0 1 0 0 1 1 Listado. end ejemplo.B. 2. c ='0') else c ='1') else c ='0') else c ='1') else Operadores Lógicos. En el momento de ser compilados los operadores lógicos presentan el siguiente orden y prioridad: 1. entity tabla is port ( a. 4.C.c: in std_logic. NAND.std_logic_1164. 7. 6. 12. 7 architecture a-func of funcion is 8 begin 9 F <= '1' when (A = 'O' and B = '0' and C = '1' and D = '0') else 10 '1' when (A = '1' and B = '0' and C = '1' and D = '0') else 11 '1' when (A = '0' and B = '1' and C = '1' and D = '0') else 12 '1' when (A = '1' and B = '1' and C = '1' and D = '0') else 13 '0' .B. En este tipo de declaracion se encuentran las funciones de salida mediante ecuaciones booleanas que describen el comportamiento de cada una de las compuertas.all.A: in std-1ogic.std-logic-1164.C.0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 Listado. Descripción de la entidad mostrada en la tabla.2 Declaraciones concurrentes asignadas a señales. 5 F: out std-1ogic) . 3. 1 library ieee. 2 use ieee. 16 . 6 end funcion.1. 14 end a-func. 3 entity funcion is port ( 4 D. 8. 12. 5. end circuito architecture arq_cir of circuito is begin with a select c <= '1' when "00". 11. X0 0 0 0 0 0 X1 0 0 0 0 1 X2 0 0 1 1 0 X3 0 1 0 1 0 F 0 1 1 1 0 17 . '0' when "01". 10. 4. 4.all.b. 14. 9. 10.std_logic_1164. '1' when "10". 13. 14.c.x3: out std_logic.f: in std_logic. entity logic is port ( a. x1.all. x2 <= (((c and d) or a xnor b)) nand ((e xor f) and (c and d))). end logic. 13. x3 <= (e xor f) and (c and d). -. Ejemplo 3. architecture booleana of logic is begin x1 <= a xnor b. Realice la tabla de verdad y elabore un programa que describa su función. 3. entity circuito is port ( a: in std_logic_vector (1 downto 0). 3. use ieee. '0' when others.1.x2. 6. 12.d. Ejemplo 4 Se requiere diseñar un circuito combinacional que detecte números primos de 4 bits. 7. 6.std_logic_1164.1. 2. Utilice instrucciones del tipo with -select -when.Ejemplo circuito lógico realizado con compuertas library ieee. 11. 3. use ieee. a(0) 0 0 1 1 1.2 Selección de una señal (with-select-when). end arq_cir. 2. 7. a(1) 0 1 0 1 F 1 0 1 0 library ieee. end booleana. c: out std_logic). 8.e. La declaración with-select-when se utiliza para asignar un valor a una señal con base en el valor de otra señal previamente seleccionada. 9. 5. el programa en VHDL quedaría de la siguiente manera. 3 entity seleccion is port ( 4 X: in std-logic-vector(O to 3).all.0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 1 1 1 1 0 1 1 0 0 1 1 0 0 1 1 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 0 0 1 0 1 0 0 Si se considera que la entrada X es un vector de 4 bits y que F es la función de salida. 2 use ieee. 15 '1' when "1011". 14 '1' when "0111". 6 end seleccion. 18 . 13 '1' when "0101". 7 architecture a-selec of seleccion is B begin 9 with X select 10 F <= '1' when "0001". 16 '1' when "1101". 18 end a-selec. I library ieee.std-logic-1164. S F: out std-logic). 12 '1' when "0011". 17 '0' when others. 11 '1' when "0010". la salida Qt+l adopta el valor de ‘1’: Qt+1 = 1 siempre y cuando se genere un pulso de reloj. 19 .figura 4. La característica principal de un flíp-flop es mantener o almacenar un bit.4. de manera indefinida hasta que a través de un pulso o una señal cambie de estado. T y D. mostrado en la figura4.3 b).3a). Cuando el valor de la entrada D es igual a ‘1’. Los flíp-flops más conocidos son los tipos SR. consideremos la tabla de verdad que describe el funcionamiento del flip-flop tipoD. ]K. DISEÑO LOGICO SECUENCIAL con VHDL El elemento de memoria utilizado indistintamente en el diseño de los sistemas mas síncronos o asíncronos se conoce como flip-flop o celda binaria. Es importante recordar el significado de la notación Q y Q(t+1): Q= estado presente o actual Q t+1 = estado futuro o siguiente Por ejemplo.2 c) que se muestra de nuevo en la figura 4. La figura presenta cada uno de estos elementos y la tabla de verdad que describe su comportamiento. Simulación de un circuito flip-flop tipo D 5.Es importante resaltar que el valor actual en la entradaD es transferido a la salida Qt+1 sin importarcuál sea el valor previo que hay a tenido lasalida Q en el estado presente. el programa del listado4. En el diseño secueucíal con VHDL las declaraciones If-then-else son las más utilizadas.1usa estas declaraciones. cuando clk cambia de valor de una transición de O a 1(clk = 1).el valor de D se asigna a Q y se conserva hasta que se genera un nuevo pulso.. La ejecución del proceso es sensible a los cambios en clk(pulso de reloj). esto es. por ejemplo. 20 . INTEGRACIÓN DE ENTIDADES BÁSICAS La integración de entidades puede realizarse mediante el diseño individual de bloques lógicos a través de procesos internos que posteriormente pueden unirse mediante un programa común En este caso se presenta el inconveniente de un numero excesivo de terminales pues se debe declarar las terminales de entrada y salida de cada entidad. std_logic_1164. 2 use ieee. registro. La programación de cada modulo se muestra en el siguiente listado. -.Q2.Q1. cuyo contenido (Q0. el cual es almacenado en el registro. 5.1 Programación de tres entidades individuales La figura muestra un circuito lógico formado por los siguientes módulos: Teclado. Codificador.pulso de reloj 5 tecla: in std_logic_vector (0 to 8).-.Otra posibilidad es observar y analizar de manera global todo el sistema evaluando su comportamiento solo a través de sus entradas y salidas.-. Listado de programación de estos módulos.all.Q3) proporciona la información (D0.D2.2.botón de teclado 6 C: inout std_logic_vector (3 downto 0).C2. para ello el codificador generara (C0. 1 library ieee. Aquí las terminales de entrada salida disminuyen.entrada registro 21 .C1.D1.D3) al decodificador de siete segmentos para ser observado en el display. 3 entity display1 is port ( 4 clk: in std_logic.salida codificador 7 A: inout std_logic_vector (3 downto 0). pero se debe desarrollar un trabajo para diseñar un algoritmo interno capaz de interpretar el funcionamiento de cada bloque además de conectar cada uno de ellos. TECLADO CODIFICADOR REGISTRO A DECODIFICADOR DISPLAY 7 SEG B Su objetivo es observar en el display el número correspondiente a la tecla presionada.C3) el equivalente del número en BCD. donde se han asignado terminales para cada uno de ellos. decodificador y display de 7 SEG. -. 8 Q: inout std_logic_vector (3 downto 0). 40 end case. 39 when others => seg <= “0001100”. -.salidas decodificador 11 end display1. D) begin 25 if (clk’event and clk= ‘1’) then 26 Q <= A. 36 when “0110” => seg <= “0100000”. 42 end a_disp1. -. 29 case D is 30 when “0000” => seg <= “0000001”. 33 when “0011” => seg <= “0000110”. 27 D <= Q. 41 end process. 32 when “0010” => seg <= “0010010”. Ver figura 5.entrada decodificador 10 seg: out std_logic_vector (0 to 6). 35 when “0101” => seg <= “0100100”. 12 architecture a_disp1 of display1 is 13 begin 14 C<= “0001” when tecla = “100000000” else 15 “0010” when tecla = “010000000” else 16 “0011” when tecla = “001000000” else 17 “0100” when tecla = “000100000” else 18 “0101” when tecla = “000010000” else 19 “0110” when tecla = “000001000” else 20 “0111” when tecla = “000000100” else 21 “1000” when tecla = “000000010” else 22 “1001”. 38 when “1000” => seg <= “0000000”. Las salidas de una entidad funcionan como entradas de la otra entidad.salida registro 9 D: inout std_logic_vector (3 downto 0). 24 process (clk. 37 when “0111” => seg <= “0001110”. 23 A<= C. 31 when “0001” => seg <= “1001111”. Esta forma de programación solo es posible siempre y cuando los bloques individuales se relacionan mediante señales internas.2 Programación de entidades individuales mediante asignación de señales En este caso el circuito recibe las líneas de entradas provenientes del teclado y como salidas los siete terminales del decodificador.5 22 . A. 5. 28 end if.2. 34 when “0100” => seg <= “1001100”. -. -.1 library ieee.declaración de entradas 6 seg: out std_logic_vector(0 to 6). 32 else 33 C<= “1001”.all. 2 use ieee. 3 entity display is port ( 4 clk: in std_logic. 10 signal Q: std_logic_vector ( 3 downto 0). C. 11 begin 12 process (clk.pulso de reloj 5 tecla : in std_logic_vector (0 to 8). 26 elsif (tecla = “000001000”) then 27 C<= “0110”. 8 architecture a_disp of display is 9 signal C: std_logic_vector ( 3 downto 0). 30 elsif (tecla = “000000010”) then 31 C<= “1000”. 35 case Q is 36 when “0000” => seg <= “0000001”.declaración salidas 7 end display. Q) begin 13 if (clk’ event and clk = ‘1’) then 14 Q <= C 15 end if 16 if (tecla = “100000000”) then 17 C<= “0001”. tecla. 34 end if. -. 23 . 28 elsif (tecla = “000000100”) then 29 C<= “0111”.std_logic_1164. -. 20 elsif (tecla = “001000000”) then 21 C<= “0011”. 22 elsif (tecla = “000100000”) then 23 C<= “0100”. 18 elsif (tecla = “010000000”) then 19 C<= “0010”. 24 elsif (tecla = “000010000”) then 25 C<= “0101”. 37 when “0001” => seg <= “1001111”. el cual se incrementa cada vez que pasa una muñeca por el sensor. cuando el número almacenado en el registro A sea igual al que lleva el contador B el circuito desactiva la banda transportadora y da reset el contador. 48 end a_disp. el cual genera una señal de reset que coloca el contador en estado cero. Cumplido lo anterior. Esta información se debe mantener hasta completar la cantidad de muñecas deseadas.R1. 39 when “0011” => seg <= “0000110”.R30. 45 when others => seg <= “0001100”. 47 end process. 40 when “0100” => seg <= “1001100”.Q2. el cual detiene la banda transportadora (Apagado) finalizando el proceso.C2.1 Se necesita diseñar un circuito de control para una maquina empacadora de muñecas. 46 end case. 43 when “0111” => seg <= “0001110”. El contenido del contador B es comparado con el numero de muñecas a empacar almacenado en el registro A.Q1. el operador presiona el botón de inicio en el modulo Controlador. se ingresa la cantidad de muñecas a empacar por caja.C3) convierte el número decimal en código BCD. Ejemplo 5. el comparador envía una señal al controlador.Q3).38 when “0010” => seg <= “0010010”. luego el codificador (C0. enseguida envía una señal de arranque (Encendido) al motor que controla el avance de la banda transportadora. 24 . 41 when “0101” => seg <= “0100100”.R2. en forma individual o con un máximo de 9 muñecas por caja. Descripción: Por medio de un teclado decimal.C1. 42 when “0110” => seg <= “0100000”. 44 when “1000” => seg <= “0000000”. el cual es almacenado en un registro A (R0. hasta que el numero de muñecas sensadas en el contador B sea igual al numero programado en el registro A. Para conocer la cantidad de muñecas empacadas se recurre a un sensor y un contador B (Q0. cuyo contenido es mostrado por el decodificador de siete segmentos a través de un display. Sistema de integración DISPLAY (7) DECODIFICADOR TECLADO CODIFICADOR REGISTRO A COMPARADOR CONTADOR B SENSO R CLK CONTROLADOR Reset Procedimiento: Después de seleccionar la cantidad de muñecas por empacar. elsif (boton = "0000010000") then C<="0110". elsif (boton = "0000100000") then C<="0101". 5. 32.all.DISPLAY (7) TECLADO SISTEMA DE INTEGRACION Sensor A=B Encendido/Apagado Banda transportadora Reset Vcc Inicio CONTROLADOR 1. 16. use std_arith. 28.R: std_logic_vector (3 down to 0). deco: out std_logic_vector(0 to 6). Q) begin If (sensor event and sensor= ‘1’) then Q <= “0000”. reset. 8. 19. 23. 18. Proceso2: process (clk. 13. compara: out std_logic). 40. elsif (boton = "0001000000") then C<="0100". boton. 26. 35. 24. R) begin if (clk event and clk=‘1’ ) then R<=C. elsif (boton = "0000001000") then C<="0111". 29.all. 37. 9. Library ieee. sensor: in std_logic. end if. 11. 3. elsif (boton = "0100000000") then C<="0010". end if. 10. 4. 27. use ieee. 25. Architecture a_control of control is signal Q. 17. 33. 30. 34. boton: in std_logic_vector(0 to 8). 39. 31. 2. begin Proceso1: process (sensor. 12. 20.C. 14. elsif (boton = "0000000100") then 25 . 22. elsif (boton = "0010000000") then C<="0011". 21. entity control is port( clk. end control. 15. Q <= Q+1. 6. 36. If (boton = "1000000000") then C<="0001". end process.std_logic_1164. 7. reset: in std_logic. If (reset = ‘1’ or Q =“1001”) then Q <= “0000”. 38. 59. end architecture. C<=“1001”.41. 50. when “0010” => deco <= “0010010”. when “0001” => deco <= “1001111”. when “0101” => deco <= “0100100”. 52. when Q = R else ‘0’.2: La siguiente figura muestra el circuito electrónico de una Unidad Lógica Aritmética – ALU. 53. 56. end if. when “0110” => deco <= “0100000”. else 43. compara <=‘1’. 45. 49. registro y decodificador de siete segmentos. 55. 46. end process. C<="1000". Vea también que en la línea 60 se asigna a la variable compara el valor de uno cuando el valor binario de los vectores Q y R son iguales. 62. el segundo (línea 23) para integrar el codificador. case R is 47. when “0100” => deco <= “1001100”. 48. 54. 61. Ejercicio 5.para describir el conteo de las muñecas mediante la variable de entrada sensor. when “0000” => deco <= “0000001”. 44. when “0111” => deco <= “0001111”. Programe dicho circuito utilizando la integración de entidades mediante la relación de señales de entrada salida. 58. 42. when “1000” => deco <= “0000000”. 60. end case. Esto con el objeto de detener la banda transportadora. 51. 26 . when “0011” => deco <= “0000110”. 57. Observe que la integración de las entidades que forman el sistema solo preciso de dos procesoa: el primero (línea14). when others => deco <= “0001100”. Su tabla característica indica la función que se ejecuta de acuerdo a sus controles de selección. Library ieee.std_logic_1164. use works.all.math.Selector de Función S0 S1 S2 S3 C0 C1 C2 C3 Salida de 4 bits ALU Entrada de 4 bits B0 B1 B2 B3 A=B Entrada de 4 bits A0 A1 A2 A3 Cn M Cn + 4 Acarreo de baja velocidad Acarreo de entrada Modo de Control P’ G’ Acarreo de alta velocidad Selección de Función S3 S2 S1 S0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 1 0 1 0 0 0 1 0 1 0 1 1 0 0 1 1 1 1 0 0 0 1 0 0 1 1 0 1 0 1 0 1 1 1 1 0 0 1 1 0 1 1 1 1 0 1 1 1 1 Función aritmética de salida M = Cn =0 F=A F = A plus B F = A plus B’ F = A plus 1 F = A * (A minus B’) F = (A plus B) * (A * B’) F = A minus B minus 1 F = A * (B’ minus 1) F = A * (A minus B) F = A minus B F = (A plus B’)*A*B F = A* B minus 1 F = A plus A F = (A plus B) *A F = (A plus B’) *A F = A minus 1 Función lógica de salida M=1 F = A’ F = (A + B)’ F = A’ B F = 0000 F = (A B)’ F = B’ F=A+B F = A B’ F = A’ + B F = (A’ B)’ F=B F=AB F = 1111 F = A + B’ F=A+B F=A Listado del programa. use ieee. 27 . 28 . when “1100” => C<= A + A. when “1010” => C<= (A + not B)*A*B.B. when “1011” => C<= A and B. when “0011” => C<= A + 1. when “1011” => C<= (A * B)-1. end if. when “0001” => C<= not (A or B).1. B. when “0110” => C<= A – B . when “1010” => C<= B. Cn1) begin If (M =’0’ and Cn = `0`) then case S is when “0000” => C<= A. when “0010” => C<= not A and B . when “1111” => C<= A. when “1101” => C<= (A + B) * A. when “1001” => C<= A . when “0011” => C<= “0000”. when “1100” => C<= 1111. when “1110” => C<= A or B. when “0001” => C<= A + B.not B). else C<=”0000”. when “0111” => C<= A*(not B -1). when “1110” => C<= (A + not B)*A. when “1000” => C<= A*(A . M: in std_logic. M. when “0111” => C<= A and (not B). when “0101” => C<= (A+B)*(A*not B). when “1001” => C<= not(A and B ).B). when “1000” => C<= not A or B. when “0010” => C<= A + not B. Elseif (M =’1’) case S is when “0000” => C<= not A. Pn. Gn: out std_logic). architecture arq_alu of alu is begin Operaciones: process (S. end alu. A. Cn1. when “0100” => C<= not (A and B). B.1. when “1111” => C<= A .entity alu is port ( A. end case. C: out std_logic_vector (0 to 3) Comp. when “0100” => C<= A*(A . S: in std_logic_vector (0 to 3). C. when “0110” => C<= A or B. when “0101” => C<= not B. end case. Cn2. when “1101” => C<= A or (not B) . end if. end process. DISEÑO JERARQUICO EN VHDL El diseño jerárquico permite la programación de extensos diseños mediante la unión de varios módulos o entidades electrónicas. end architecture. If ((A + B) = “10000” ) then Cn2 = ”1”. end if. 7. Comp.end process. Cn2) begin if (A = B) then Comp = ”1”. para luego relacionarlas a través de un algoritmo de integración. B. llamado Top Level. else Cn2 = ”0”. 29 . operacion2: process (A . else Comp = ”0”. las cuales se pueden analizar y simular de manera individual. Nota. Un componente es la parte de un programa que define un elemento fisico. Diseñar el programa de alto nivel. Crear un paquete de componentes. Analizar con detalle el problema y descomponer en bloques individuales la estructura global. el cual se puede usar en otros diseños o entidades. 2. 30 .1 Metodología de diseño de estructuras jerárquicas. DISENO DE UN DETECTOR DE SECUENCIAS a) Como aplicación de un circuito secuencial de Mealy se pretende diseñar un detector de la siguiente secuencia de entrada 101 para que produzca una salid Z = 1 cuando se detecte el ultimo 1. Pasos a seguir: 1. Entidad 1 Entidad 2 Top Level Entidad 1 Entidad 2 7. 4. en diseños grandes trabajar al mismo tiempo con otros diseñadores al mismo tiempo (paralelismo).Esto permite. Diseñar y programar módulos individuales (componentes). 3. Si el estado S0 es el estado inicial. Si tomamos Flip Flop Tipo D y aplicamos el método de mapa de Karnaugh se obtienen los siguientes: 31 . etc. cuando x=0 no se inicia la secuencia y el circuito debe permanecer en el estado S0 si x=1 el circuito debe pasar a el estado S1 para iniciar la secuencia y la transferencia se indicara como X/Z .Se designan los estados como S0. S1. cuando esta en el estado S1 y x=0 se debe pasar al estado S2 como lo indican las siguientes figuras Por lo tanto para tres estado se requieren solo dos Flip Flop A y B y el diagrama puede ser representado en las tablas de estado mostradas. when 1 => if x = '0' then Nextstate < = 2. end process. end if. Nextstate: integer range 0 to 2 : = 0. z <= '0'. z: out bit). begin process (State. else Nextstate <= 1. end if. 32 . c1k: in bit. z <= '1'. z <= '0'. z <= '0'. when 2 => if x = '0' then Nextstate <= O. end sm1. else Nextstate < = 1. end if. end case.Y el circuito secuencial será el siguiente: Si se quiere obtener el circuito implementado en un PLD el programa VHDL que representa el diagrama de estado anterior será: entity sm1 is Port (x. architecture table of sm1 is signal State. x) begin case State is when 0=> if x = '0' then Nextstate < = 0. else Nextstate < = 1. S1 y S2 Cuando aparezca una entrada de valor 1 para completar la secuencia 101. end process. b) Como aplicación de un circuito secuencial de Moore se pretende diseñar un detector de la siguiente secuencia de entrada 101 para que produzca una salid Z = 1 cuando se detecte el ultimo 1. Una entrada 1010 hace que el circuito vuelva a S2 puesto que otra entrada de valor 1 hace que Z = 1 tal como se muestra en la siguiente figura. entonces el diagrama genera un estado adicional S3 como muestra la figura. 33 .process (c1k) begin jf clk' event and clk = '0' then State < = Nextstate. end if. salvo porque se asocia una salida 0 con S0 . regresando al estado S0. la salida debe valer 1. Si estando en el estado S2 la entrada es 0 la secuencia se inicializa. end table. El diseño es similar a la máquina de Mealy hasta que se produce una secuencia de entrada 10. 0 1 2 3 4 5 6 7 B 0 0 0 0 1 1 1 1 A 0 0 1 1 0 0 1 1 X 0 1 0 1 0 1 0 1 B 0 0 1 0 1 0 0 1 A 0 1 1 1 1 1 0 0 DA 0 0 1 0 1 0 0 1 DB 0 1 1 1 1 1 0 0 Z 0 0 0 0 1 1 0 0 Mapas de Karnaugh BA\X 00 01 11 10 0 0 1 0 1 1 0 0 1 0 BA\X 00 01 11 10 0 0 1 0 1 1 1 1 0 1 BA\X 00 01 11 10 0 0 0 0 1 1 0 0 0 1 DA = B’AX’ + BA’X’ + BAX Luego el circuito secuencial será: DB = BA’ + B’A + B’X Z = BA’ 34 .Del anterior diagrama se puede obtener que se requieren los mismos dos Flip Flop Tipo D como en la maquina de Mealy. Si tomamos Flip Flop Tipo D y aplicamos el método de mapa de Karnaugh se obtienen los siguientes: Tabla de excitación. else Nextstate < = 1. else '0' -. end process. when Nextstate <= 3. end table. z: out bit). else Nextstate < = 1. end if. end if. c1k: in bit. end case. z <= '1'. end process.Si se quiere obtener el circuito implementado en un PLD el programa VHDL que representa el diagrama de estado anterior será: entity sm1 is Port (x. end if. end if. else Nextstate <= 3. end sm1. architecture table of sm1 is signal State. begin process (State.salida Moore process (c1k) begin jf clk' event and clk = '0' then State < = Nextstate. when 1 => if x = '0' then Nextstate < = 2. Nextstate: integer range 0 to 3 : = 0. bibliografía: (Libro VHDL El arte de programar sistemas digitales) (Por: Maxinez y Alcala) 35 . x) begin case State is when 0=> if x = '0' then Nextstate < = 0. when 2 => if x = '0' then Nextstate <= 0.
Copyright © 2024 DOKUMEN.SITE Inc.