You are on page 1of 35

NOTAS DE CLASE

DISPOSITIVOS LOGICOS PROGRAMABLES


PROGRAMACION DE SISTEMAS DIGITALES CON VHDL

PROFESOR: GERMAN MORALES Z. AGOSTO DE 2011

PROGRAMACION DE SISTEMAS DIGITALES CON VHDL


Lenguaje de programacin - 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 electrnicos con el fin de minimizar el tamao de la aplicacin. Ya sea en un solo CI y si el problema es complejo, a travs de una serie sucesiva de circuitos programables como CPLD (Dispositivo Lgico Programable complejo o FPGA (Arreglo de Compuertas Programables en campo). CARACTERISTICAS Lenguaje estructurado por lo que permite descripciones jerrquicas (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 jerarqua interconectados (subcomponentes) y as sucesivamente. Describe, analiza y evala el comportamiento de un sistema electrnico digital. Permite la integracin de Sistemas Digitales en un Dispositivo Lgico programable (Gal baja capacidad o CPLD Y FPGA mayor capacidad. Lenguaje orientado a la descripcin 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 seales de salida a partir de las seales de entrada. (Register Transfer Level, RTL)

2.1 UNIDADES BASICAS DE DISEO


El lenguaje VHDL permite describir cualquier sistema digital mediante definicin de un modelo que proporciona la descripcion externa y una o ms 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.

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 extensin .vhdl cuya estructura genrica 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 diseo en VHDL donde se identifica con claridad sus entradas y salidas generales que permiten al sistema interactuar con el exterior. Entidades: de elementos electrnicos 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 Descripcin a nivel de compuertas Smbolo funcional de la entidad. Diagrama de bloques.

Sintaxis de una declaracin VHDL.


entity entity-name is generic (declaracion de las constantes); port (signal-names: mode signal-type; signal-names: mode signal-type; .. signal-names: mode signal-type); end entity-name ; (generic: entidades en que los valores de algunos parmetros se concretan en el momento de utilizarlas). Ejemplo: Si el tiempo de propagacin de las seales de entrada hasta la salida es de 5 ns se puede incluir esta informacin en la entidad utilizando : entity mux21 is generic (t_delay: TIME:= 5 ns); port (S: in bit:= 0; A: in bit: = 0; B: in bit: = 0; C: out bit ); end mux21;

Puertos De Entrada Salida Port


Puerto. Se refiere a cada una de las seales de entrada y salida, el cual equivale a un pin de un smbolo esquemtico. Un puerto debe tener: port (signal-names: mode, signal-type); (Nombre, Modo, Tipo de Dato). signal-name. (Nombre, identificador): se utiliza como una forma de llamar un puerto. Mode. (Modo): permite definir la direccin que tomara la informacin. In: La seal es una entrada a la entidad. Out: La seal es una salida de la entidad. Note que el valor de esta seal no puede ser leda dentro de la arquitectura de la entidad, solamente por otras entidades que la utilicen. Inout: La seal se puede emplear como una entrada o una salida. Este modo es tpicamente utilizado para terminales de entrada/salida de tres estados en un PLD. Buffer: La seal es una salida de la entidad y su valor puede ser ledo dentro de la arquitectura de la entidad. Retroalimentaciones internas declaradas se comporta como una terminal de salida. signal-type. (Tipo de dato): clase de informacin que se transmite por el puerto. Se asignan de acuerdo a un diseo en particular. Algunos tipos mas utilizados son: Bit el cual tiene valores de 0 y 1 lgico. Boolean (booleano) que define los valores de FALSO o VERDADERO en una expresin. Bit_vector (vectores de bits) conjunto de bits para cada variable de entrada o salida. Integer (numero entero) que representa un numero entero. std_logic para definir puertos escalares asociados a lineas individuales. std_logic_vector para los puertos vectoriales, asociados a buses de varias lineas.

2.3 DECLARACION DE ENTIDADES


Consiste en la descripcin de las entradas y las salidas de un circuito identificado como una entidad (entity) Cin A B 1. 2. 3. 4. 5. Cout

Entidad Sumador

SUMA

Declaracin De la Entidad de un circuito Sumador entity sumador is port (A,B, Cin: in bit; SUMA, Cout: out bit); end Sumador;

Las palabras en negrillas son reservadas para el lenguaje de programacin VHDL. -- Texto comentario que es ignorado por el compilador. ; Se usa para finalizar una declaracin. : Se usa para asignar nombres a las entradas salidas Especificaciones o reglas para identificadores (nombre) El primer carcter es una letra mayscula o minscula. o 4suma Suma4 El segundo carcter no puede ser un guin bajo S _4bits. o S_4bits S4_bits Dos guiones juntos no son permitidos. o Resta__4 Resta_4_ Un identificador no puede utilizar smbolos. o Clear#8 Clear_8_

2.4 Declaracion De Entidades Mediante Vectores


Las palabras binarias se conocen como vectores de bits, los cuales se consideran un grupo y no como bits individuales. Ejemplo: . Cin A[3:0] B[3:0]

Entidad Sumador

Cout SUMA[3:0]

Los tres vectores A, B, SUMA se definen con cuatro componentes distribuidos en orden descendente por medio del comando: 3 downto 0 (3 hacia 0) Los cuales se agruparan 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 aparecern los bits enunciados en cada vector, no se puede modificar a menos que se utilice el comando to. 0 to 3 (0 hasta 3) Indica el orden de aparicin en sentido ascendente. Luego la declaracin ser: 1. 2. 3. 4. 5. 6. 7. -- Declaracin de la entidad circuito sumador entity sumador is port (A,B: in bit_vector (3 downto 0); Cin: in bit; Cout: in bit; SUMA: out bit_vector (3 downto 0); end sumador;

2.4.1 Declaracion De Entidades Mediante Librerias y Paquetes.


Las libreras o paquetes permiten declarar y almacenar estructuras lgicas seccionadas o complejas que facilitan el diseo. LIBRERA Una librera o biblioteca es un lugar al que se tiene acceso para utilizar unidades de diseo predeterminadas por el fabricante de la herramienta. En VHDL se encuentran definidas dos libreras llamadas ieee y work as: - ieee o std_logic_1164 - work o o o o numeric_std std_arith gatesspkg otra

Para un diseo VHDL el compilador crea automticamente y utiliza una librera work

Una librera permite tambin almacenar resultados de la compilacin de un diseo, con el fin de utilizar en uno o varios programas. La librera work es el lugar establecido donde se almacenan los programas que el usuario va generando. Esta librera (work) se encuentra siempre presente en la compilacin de un diseo o diseos que guardan en ella mientras no se especifique otra cosa.

Cuando se utiliza algn paquete es necesario llamar a la librera que lo contiene

PAQUETE
Un paquete VHDL es un archivo que contiene definiciones de objetos que pueden ser utilizados en otros programas. La clase de objetos que pueden ser puestos en un paquete incluye declaraciones de seal, tipo, constantes, funcin, procedimiento y componentes. Es una unidad de diseo que permite desarrollar un programa en VHDL de una forma gil, debido a que contiene algoritmos preestablecidos (sumadores, restadores, contadores, etc.) que ya tienen optimizado su comportamiento. Cuando en el diseo se utiliza un paquete es necesario llamar a la librera que lo contiene, para esto se utiliza la siguiente declaracin library ieee; El paquete std_logic_1164 contiene todos los tipos de datos que suelen emplearse en VHDL (std_logic_vector, std_logic), entre otros. Work. Siempre esta presente al desarrollar un diseo y no necesita declaracin library. El acceso a la informacin contenida en un paquete se hace por medio de la sentencia use as:

use nombre_libreria.nombre_paquete.all;
Ejemplo: use ieee.std_logic_1164.all;

La palabra all indica que puede usar todas las definiciones almacenados en el paquete, en este archivo. Paquete numeric_std define funciones para realizar operaciones entre diferentes tipos de datos, adems los datos pueden representarse con signo o sin este. Paquete numeric_bit define tipos de datos binarios c0n signo o sin este. Paquete std_arith define funciones y operaciones aritmticas, como igual (=), mayor que (>), menor que (<) entre otros.

Ejemplo: Circuito multiplicador de dos nmeros de dos bits. 1. 2. 3. 4. 5. 6. 7. -- Declaracin de entidad circuito multiplicador library ieee; use ieee.std_logic_1164.all; entity multiplica is port (X0 X1 ,Y0 ,Y1: in std_logic; Z0 Z1 Z2 Z3: out std-logic); end multiplica;

2.5 ARQUITECTURA (architecture)


Se define como la estructura que describe el funcionamiento de una Entidad. El VHDL permite mediante un algoritmo de programacin describir los diseos desde el nivel de compuertas hasta sistemas complejos. Sintaxis de una definicin de arquitectura VHDL. Architecture architecture-name of entity-name is type declarations signal declarations constant declarations function definitions procedure definitions component declarations begin concurrent-statement . concurrent-statement end architecture-name Ejemplo: signal signal-name: signal-type; constans Z: character<= Z; Estilos de programacin utilizados en el diseo: 1. Estilo funcional. 2. Estilo por flujo de datos. 3. Estilo estructural.

2.5.1 Descripcin Estilo Funcional.


Expone la forma en que trabaja el sistema, es decir, las descripciones consideran la relacin entre las entradas y las salidas del circuito, sin importar como esta organizado en su interior. Se basa

principalmente en el uso de procesos y declaraciones secunciales, las cuales permiten modelar la funcin con rapidez. Ejemplo1: Comparador de dos nmeros de dos bits: Si A = B entonces C = 1 Si A B entonces C = 0 A [1:0] B [1:0]

Entidad Sumador

Su Arquitectura funcional ser: 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. -- Declaracin de entidad circuito comparador library ieee; use ieee.std_logic_1164.all; entity comp is port (A,B: in bit_vector(1 downto 0); C: out bit); end comp; architecture functional of comp is begin compara: process (A,B) begin if A = B then C = 1; else C = 0; end if; end process compara; end functional;

Ejemplo 2: Describa mediante declaraciones del tipo if~then~else el funcionamiento de una compuerta OR con base a la tabla de verdad. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. -- Declaracin de funcional compuerta OR library ieee; use ieee.std_logic_1164.all; entity com_or is port (A,B: in std_logic; C: out std_logic); end com_or; architecture functional of com_or is begin process (A,B) begin if (A = 0 and B = 0) then C <= 0; else C <= 1; end if;

16. end process; 17. end functional; Donde: begin: Seala el inicio de la seccin donde se comienza a declarar el proceso que rige el comportamiento del sistema. La declaracin del proceso se utiliza para la definicin del algoritmo etiqueta opcional: process y une la lista sensitiva (A,B) que hace referencia a las seales que determinan el funcionamiento del proceso. El proceso se ejecuta mediante declaraciones secuenciales del tipo if~then~else. Una vez se ha definido el proceso se termina con la palabra end process. Luego se termina la arquitectura con end (nombre) en el siguiente rengln.

2.5.2 Descripcin Estilo flujo de datos.


Varias instrucciones concurrentes adicionales permiten a VHDL, describir un circuito en terminos de flujo de datos y operaciones activadas dentro del circuito. Indica la forma en que los datos se pueden transferir de una seal a otra sin necesidad de declaraciones secuenciales if~then~else. Este tipo de descripcin puede utilizar dos formatos: a. Mediante instrucciones when~else. 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 seales de entrada y las seales de salida.

a). Mediante instrucciones when~else.


En este caso se elimina el proceso y las declaraciones secuenciales if~then~else. Tomando el ejemplo del comparador, la arquitectura por flujo de datos ser: 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. -- Declaracin de entidad circuito comparador library ieee; use ieee.std_logic_1164.all; entity comp is port (A,B: in bit_vector (1 downto 0); C: out bit); end comp; architecture f_datos of comp is begin C = 1 when (A = B) else 0; end f_datos;

Para el caso de la compuerta OR ser: 1. -- Declaracin de funcional compuerta OR 2. library ieee;

10

3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.

use ieee.std_logic_1164.all; entity com_or is port (A,B: in std_logic; C: out std_logic); end com_or; architecture compuerta of com_or is begin f <= 0 when (A = 0 and B = 0) else 1; end compuerta;

NOTA: En el caso anterior se tiene una declaracin secuencial donde su ejecucin debe seguir un orden para evitar la prdida de la lgica descrita. En este caso se tiene una declaracin concurrente donde no importa el orden que se ejecuta.

b). Mediante ecuaciones booleanas.


Este estilo considera las ecuaciones booleanas del circuito digital de acuerdo a su organizacin interna. Si tomamos el comparador de dos bits, se puede representar por medio de compuertas lgicas bsicas y su ecuacin booleana ser: F = ( A0 B 0) ( A1 B1) 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. -- Declaracin de entidad circuito comparador library ieee; use ieee.std_logic_1164.all; entity comp is port (A,B: in bit_vector(1 downto 0); C: out bit); end comp; architecture booleana of comp is begin C <= (A(1) xnor B(1) and A(0) xnor B(1); end booleana;

Para la compuerta OR 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. -- Declaracin de funcional compuerta OR library ieee; use ieee.std_logic_1164.all; entity com_or is port (A,B: in std_logic; C: out std_logic); end com_or; architecture compuerta of com_or is begin f <= ( A or B); end compuerta;

11

2.5.3 Descripcin Estilo estructural.


Basa su comportamiento en modelos establecidos (compuertas, sumadores, comparadores, contadores, etc.) Para iniciar la programacin de una entidad de manera estructural es necesario la descomposicin lgica del diseo en pequeos submodulos (jerarquizada), los cuales permiten analizar de manera practica el circuito ya que la funcin de entrada / salida es conocida. En VHDL es importante aclarar que una jerarqua se refiere al procedimiento de dividir en bloques y no a que un bloque tenga mayor jerarqua que otro. La salida de cada uno de los bloques se maneja como una seal, las cuales se declaran dentro de la arquitectura y no en la entidad, debido a que no representan a una terminal (pin) y solo se utilizan para conectar bloques de manera interna a la entidad. En el caso del comparador cada compuerta se encuentra dentro de un paquete gatesspkg,6 del cual se toman la estructura del diseo. Este tipo de arquitecturas estndares se conoce como componentes. En VHDL conectividad se conoce como netlist7 o listado de componentes. El cuerpo de una arquitectura es una serie de instrucciones concurrentes. En VHDL, cada instruccin concurrente se ejecuta de manera simultnea con otras instrucciones concurrentes en el mismo cuerpo de arquitectura. Las instrucciones concurrentes son necesarias para simular el comportamiento del Hardware, donde los elementos conectados se afectan entre si de manera continua, no precisamente en segmentos de tiempo particulares, con un orden. De este modo, en un cuerpo de arquitectura VHDL, si la ltima instruccin actualiza una seal que es utilizada por la primera instruccin, entonces el simulador regresara a esa primera instruccin y actualizara sus resultados de acuerdo con la seal que acaba de cambiar. Instruccin component es la mas fundamental de las instrucciones concurrentes y tiene la siguiente sintaxis: label: component-name port map (signal1, signal2,..,signaln); label: component-name port map (port1=>signal1, port1=>signal2,.., port1=>signaln); component component-name port (signal-name : mode signal-type ; signal-name : mode signal-type ; signal-name : mode signal-type) ; end component ; Las palabras clave port map introducen una lista que asocial os puertos de la entidad nombrada con seales en la arquitectura actual. La lista puede escribirse en dos estilos diferentes: Primero. Es un estilo Posicional; las seales en la lista se encuentran asociadas con los puertos de la entidad en el mismo orden en que aparecen en la definicin de la entidad. Segundo. Es un estilo explicito; cada uno de los puertos de la entidad se conectan a una seal utilizando el operador => y estas asociaciones pueden enumerarse en cualquier orden.

12

Los componentes usados en una arquitectura pueden ser los que fueron previamente definidos como parte de un diseo o pueden ser partes de una librera. Una arquitectura VHDL que utiliza componentes se denomina a menudo una descripcin estructural o diseo estructural, porque define la estructura de interconexin precisa de senales y entidades que realiza la entidad. El siguiente listado muestra la descripcin estructural del comparador. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. -- Declaracin de entidad circuito comparador library ieee; use ieee.std_logic_1164.all; entity comp is port (A,B: in bit_vector(0 to 1); C: out bit); end comp; use work.compuerta.all; architecture estructural of comp is signal X: bit_vector (0 to 1); begin U0: xnor2 port map (A(0), B(0), X(0); U1: xnor2 port map (A(1), B(1), X(1); U2: and2 port map (X(0), X(1), C); end estructural;

Los componentes xnor y and no se declaran debido a que se encuentran en el paquete de compuertas gatesspkg, el cual se encuentra dentro de la librera de trabajo work. Las seales X0 y X1 se declaran en la arquitectura y no en la entidad, debido a que no representan un terminal (pin) y solo se utilizan para conectar bloques de manera interna en la entidad. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. -- Declaracin de entidad circuito combinatorio library ieee; use ieee_std_logic_1164.all; entity combina is port (A,B,C: in std_logic; F: out std_logic); end combina; use work.compuerta.all; architecture estructural of combina is signal X: bit_vector (0 to 2); begin U0: and2 port map (B, C, X(0); U1: and2 port map (C, A, X(1); U2: and2 port map (A, B, X(2)); U3: or3 port map (X(0), X(1), X(2), F); end estructural;

13

3. DISEO LOGICO COMBINATORIO 3.1 Programacin de estructuras bsicas mediante declaraciones concurrentes.
Las declaraciones concurrentes se encuentran fuera de la declaracin de un proceso y suelen usarse en las descripciones de flujo de datos y estructural. En la declaracin concurrente no importa el orden en que se escriban las seales, ya que el resultado para determinada funcin seria el mismo. Tipos de declaraciones concurrentes: 1. Declaraciones condicionales asignadas a una seal (when - else). 2. Declaraciones concurrentes asignadas a seales. 3. Seleccin de una seal (with-select-when).

3.1.1 Declaraciones condicionales asignadas a una seal (when - else).


La declaracin (when - else) se utiliza para asignar valores a una seal determinando as la ejecucin de una condicin propia del diseo. Ejemplo 1. Consideremos la funcin definida en la siguiente tabla de verdad.

a b c

Entidad Prueba

f(a,b,c)

a 0

B 0

C 0

F 1

14

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. Descripcin de la entidad mostrada en la tabla de la figura. Descripcin de la entidad: 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. -- Ejemplo combinacional bsico library ieee; use ieee.std_logic_1164.all; entity tabla is port ( a,b,c: in std_logic; f: out std_logic; end tabla; 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'; end ejemplo;

c ='0') else c ='1') else c ='0') else c ='1') else

Operadores Lgicos.
Los operadores lgicos ms utilizados son: AND, OR, NAND, NOR, XOR, XNOR y NOT. Las operaciones que se efecten entre ellos (excepto not ) deben realizarse con datos que tengan la misma longitud o palabras de bits. En el momento de ser compilados los operadores lgicos presentan el siguiente orden y prioridad: 1. 2. 3. 4. 5. Expresiones entre parntesis Complementos Funcin AND Funcin OR

Ejemplo 2. Una funcin F depende de cuatro variables D,C,B,A donde A es la variable menos significativa. La funcin adopta el valor de uno si el numero formado por las cuatro variables es inferior o igual a 7 y superior a 3. Encuentre la tabla de verdad de la funcion y realice el programa correspondiente en VHDL (utilice la estructura del tipo when-else y operadores lgicos. D C B A F

15

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. Descripcin de la entidad mostrada en la tabla, 1 library ieee; 2 use ieee.std-logic-1164.all; 3 entity funcion is port ( 4 D,C,B,A: in std-1ogic; 5 F: out std-1ogic) ; 6 end funcion; 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' ; 14 end a-func;

3.1.2 Declaraciones concurrentes asignadas a seales.


En este tipo de declaracion se encuentran las funciones de salida mediante ecuaciones booleanas que describen el comportamiento de cada una de las compuertas.

16

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.

-- Ejemplo circuito lgico realizado con compuertas library ieee; use ieee.std_logic_1164.all; entity logic is port ( a,b,c,d,e,f: in std_logic; x1,x2,x3: out std_logic; end logic; architecture booleana of logic is begin x1 <= a xnor b; x2 <= (((c and d) or a xnor b)) nand ((e xor f) and (c and d))); x3 <= (e xor f) and (c and d); end booleana;

3.1.2 Seleccin de una seal (with-select-when).


La declaracin with-select-when se utiliza para asignar un valor a una seal con base en el valor de otra seal previamente seleccionada. Ejemplo 3. a(0) 0 0 1 1 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. a(1) 0 1 0 1 F 1 0 1 0

library ieee; use ieee.std_logic_1164.all; entity circuito is port ( a: in std_logic_vector (1 downto 0); c: out std_logic); end circuito architecture arq_cir of circuito is begin with a select c <= '1' when "00", '0' when "01", '1' when "10", '0' when others, end arq_cir;

Ejemplo 4 Se requiere disear un circuito combinacional que detecte nmeros primos de 4 bits. Realice la tabla de verdad y elabore un programa que describa su funcin. Utilice instrucciones del tipo with -select -when. 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 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 funcin de salida, el programa en VHDL quedara de la siguiente manera, I library ieee; 2 use ieee.std-logic-1164.all; 3 entity seleccion is port ( 4 X: in std-logic-vector(O to 3); S F: out std-logic); 6 end seleccion; 7 architecture a-selec of seleccion is B begin 9 with X select 10 F <= '1' when "0001", 11 '1' when "0010", 12 '1' when "0011", 13 '1' when "0101", 14 '1' when "0111", 15 '1' when "1011", 16 '1' when "1101", 17 '0' when others; 18 end a-selec;

18

4. DISEO LOGICO SECUENCIAL con VHDL

El elemento de memoria utilizado indistintamente en el diseo de los sistemas mas sncronos o asncronos se conoce como flip-flop o celda binaria, La caracterstica principal de un flp-flop es mantener o almacenar un bit, de manera indefinida hasta que a travs de un pulso o una seal cambie de estado. Los flp-flops ms conocidos son los tipos SR, ]K, T y D. La figura presenta cada uno de estos elementos y la tabla de verdad que describe su comportamiento.

Es importante recordar el significado de la notacin Q y Q(t+1): Q= estado presente o actual Q t+1 = estado futuro o siguiente Por ejemplo, consideremos la tabla de verdad que describe el funcionamiento del flip-flop tipoD, mostrado en la figura4.2 c) que se muestra de nuevo en la figura 4.3a). Cuando el valor de la entrada D es igual a 1,figura 4.3 b),la salida Qt+l adopta el valor de 1: Qt+1 = 1 siempre y cuando se genere un pulso de reloj.

19

Es importante resaltar que el valor actual en la entradaD es transferido a la salida Qt+1 sin importarcul sea el valor previo que hay a tenido lasalida Q en el estado presente. En el diseo secueucal con VHDL las declaraciones If-then-else son las ms utilizadas; por ejemplo, el programa del listado4.1usa estas declaraciones. La ejecucin del proceso es sensible a los cambios en clk(pulso de reloj); esto es, cuando clk cambia de valor de una transicin de O a 1(clk = 1),el valor de D se asigna a Q y se conserva hasta que se genera un nuevo pulso. Simulacin de un circuito flip-flop tipo D

5. INTEGRACIN DE ENTIDADES BSICAS


La integracin de entidades puede realizarse mediante el diseo individual de bloques lgicos a travs de procesos internos que posteriormente pueden unirse mediante un programa comn 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..

20

Otra posibilidad es observar y analizar de manera global todo el sistema evaluando su comportamiento solo a travs de sus entradas y salidas. Aqu las terminales de entrada salida disminuyen, pero se debe desarrollar un trabajo para disear un algoritmo interno capaz de interpretar el funcionamiento de cada bloque adems de conectar cada uno de ellos.

5.2.1 Programacin de tres entidades individuales


La figura muestra un circuito lgico formado por los siguientes mdulos: Teclado, Codificador, registro, decodificador y display de 7 SEG.

TECLADO

CODIFICADOR

REGISTRO A

DECODIFICADOR

DISPLAY 7 SEG B

Su objetivo es observar en el display el nmero correspondiente a la tecla presionada, para ello el codificador generara (C0,C1,C2,C3) el equivalente del nmero en BCD, el cual es almacenado en el registro, cuyo contenido (Q0,Q1,Q2,Q3) proporciona la informacin (D0,D1,D2,D3) al decodificador de siete segmentos para ser observado en el display. La programacin de cada modulo se muestra en el siguiente listado, donde se han asignado terminales para cada uno de ellos. Listado de programacin de estos mdulos. 1 library ieee; 2 use ieee.std_logic_1164.all; 3 entity display1 is port ( 4 clk: in std_logic;-- pulso de reloj 5 tecla: in std_logic_vector (0 to 8);-- botn de teclado 6 C: inout std_logic_vector (3 downto 0); -- salida codificador 7 A: inout std_logic_vector (3 downto 0); -- entrada registro

21

8 Q: inout std_logic_vector (3 downto 0); -- salida registro 9 D: inout std_logic_vector (3 downto 0); -- entrada decodificador 10 seg: out std_logic_vector (0 to 6); -- salidas decodificador 11 end display1; 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; 23 A<= C; 24 process (clk, A, D) begin 25 if (clkevent and clk= 1) then 26 Q <= A; 27 D <= Q; 28 end if; 29 case D is 30 when 0000 => seg <= 0000001; 31 when 0001 => seg <= 1001111; 32 when 0010 => seg <= 0010010; 33 when 0011 => seg <= 0000110; 34 when 0100 => seg <= 1001100; 35 when 0101 => seg <= 0100100; 36 when 0110 => seg <= 0100000; 37 when 0111 => seg <= 0001110; 38 when 1000 => seg <= 0000000; 39 when others => seg <= 0001100; 40 end case; 41 end process; 42 end a_disp1;

5.2.2 Programacin de entidades individuales mediante asignacin de seales


En este caso el circuito recibe las lneas de entradas provenientes del teclado y como salidas los siete terminales del decodificador. Las salidas de una entidad funcionan como entradas de la otra entidad. Esta forma de programacin solo es posible siempre y cuando los bloques individuales se relacionan mediante seales internas. Ver figura 5.5

22

1 library ieee; 2 use ieee.std_logic_1164.all; 3 entity display is port ( 4 clk: in std_logic; -- pulso de reloj 5 tecla : in std_logic_vector (0 to 8); -- declaracin de entradas 6 seg: out std_logic_vector(0 to 6); -- declaracin salidas 7 end display; 8 architecture a_disp of display is 9 signal C: std_logic_vector ( 3 downto 0); 10 signal Q: std_logic_vector ( 3 downto 0); 11 begin 12 process (clk, tecla, C, Q) begin 13 if (clk event and clk = 1) then 14 Q <= C 15 end if 16 if (tecla = 100000000) then 17 C<= 0001; 18 elsif (tecla = 010000000) then 19 C<= 0010; 20 elsif (tecla = 001000000) then 21 C<= 0011; 22 elsif (tecla = 000100000) then 23 C<= 0100; 24 elsif (tecla = 000010000) then 25 C<= 0101; 26 elsif (tecla = 000001000) then 27 C<= 0110; 28 elsif (tecla = 000000100) then 29 C<= 0111; 30 elsif (tecla = 000000010) then 31 C<= 1000; 32 else 33 C<= 1001; 34 end if; 35 case Q is 36 when 0000 => seg <= 0000001; 37 when 0001 => seg <= 1001111;

23

38 when 0010 => seg <= 0010010; 39 when 0011 => seg <= 0000110; 40 when 0100 => seg <= 1001100; 41 when 0101 => seg <= 0100100; 42 when 0110 => seg <= 0100000; 43 when 0111 => seg <= 0001110; 44 when 1000 => seg <= 0000000; 45 when others => seg <= 0001100; 46 end case; 47 end process; 48 end a_disp; Ejemplo 5.1 Se necesita disear un circuito de control para una maquina empacadora de muecas, en forma individual o con un mximo de 9 muecas por caja. Descripcin: Por medio de un teclado decimal, se ingresa la cantidad de muecas a empacar por caja, luego el codificador (C0,C1,C2,C3) convierte el nmero decimal en cdigo BCD, el cual es almacenado en un registro A (R0,R1,R2,R30, cuyo contenido es mostrado por el decodificador de siete segmentos a travs de un display. Esta informacin se debe mantener hasta completar la cantidad de muecas deseadas. Para conocer la cantidad de muecas empacadas se recurre a un sensor y un contador B (Q0,Q1,Q2,Q3), el cual se incrementa cada vez que pasa una mueca por el sensor. El contenido del contador B es comparado con el numero de muecas a empacar almacenado en el registro A, cuando el nmero almacenado en el registro A sea igual al que lleva el contador B el circuito desactiva la banda transportadora y da reset el contador.

Sistema de integracin
DISPLAY (7)

DECODIFICADOR

TECLADO

CODIFICADOR

REGISTRO A

COMPARADOR

CONTADOR B

SENSO R

CLK
CONTROLADOR

Reset

Procedimiento: Despus de seleccionar la cantidad de muecas por empacar, el operador presiona el botn de inicio en el modulo Controlador, el cual genera una seal de reset que coloca el contador en estado cero; enseguida enva una seal de arranque (Encendido) al motor que controla el avance de la banda transportadora, hasta que el numero de muecas sensadas en el contador B sea igual al numero programado en el registro A. Cumplido lo anterior, el comparador enva una seal al controlador, el cual detiene la banda transportadora (Apagado) finalizando el proceso.

24

DISPLAY (7)

TECLADO

SISTEMA DE INTEGRACION

Sensor A=B Encendido/Apagado Banda transportadora

Reset Vcc Inicio

CONTROLADOR

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40.

Library ieee; use ieee.std_logic_1164.all; use std_arith.all; entity control is port( clk, reset: in std_logic; boton: in std_logic_vector(0 to 8); sensor: in std_logic; deco: out std_logic_vector(0 to 6); compara: out std_logic); end control; Architecture a_control of control is signal Q,C,R: std_logic_vector (3 down to 0); begin Proceso1: process (sensor, reset, Q) begin If (sensor event and sensor= 1) then Q <= 0000; Q <= Q+1; If (reset = 1 or Q =1001) then Q <= 0000; end if; end if; end process; Proceso2: process (clk, boton, R) begin if (clk event and clk=1 ) then R<=C; If (boton = "1000000000") then C<="0001"; elsif (boton = "0100000000") then C<="0010"; elsif (boton = "0010000000") then C<="0011"; elsif (boton = "0001000000") then C<="0100"; elsif (boton = "0000100000") then C<="0101"; elsif (boton = "0000010000") then C<="0110"; elsif (boton = "0000001000") then C<="0111"; elsif (boton = "0000000100") then

25

41. C<="1000"; 42. else 43. C<=1001; 44. end if; 45. 46. case R is 47. when 0000 => deco <= 0000001; 48. when 0001 => deco <= 1001111; 49. when 0010 => deco <= 0010010; 50. when 0011 => deco <= 0000110; 51. when 0100 => deco <= 1001100; 52. when 0101 => deco <= 0100100; 53. when 0110 => deco <= 0100000; 54. when 0111 => deco <= 0001111; 55. when 1000 => deco <= 0000000; 56. when others => deco <= 0001100; 57. end case; 58. end process; 59. 60. compara <=1; when Q = R else 0; 61. 62. end architecture; Observe que la integracin de las entidades que forman el sistema solo preciso de dos procesoa: el primero (lnea14),para describir el conteo de las muecas mediante la variable de entrada sensor; el segundo (lnea 23) para integrar el codificador, registro y decodificador de siete segmentos. Vea tambin que en la lnea 60 se asigna a la variable compara el valor de uno cuando el valor binario de los vectores Q y R son iguales. Esto con el objeto de detener la banda transportadora. Ejercicio 5.2: La siguiente figura muestra el circuito electrnico de una Unidad Lgica Aritmtica ALU. Su tabla caracterstica indica la funcin que se ejecuta de acuerdo a sus controles de seleccin. Programe dicho circuito utilizando la integracin de entidades mediante la relacin de seales de entrada salida.

26

Selector de Funcin

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

Seleccin de Funcin 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

Funcin aritmtica 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

Funcin lgica 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. Library ieee; use ieee.std_logic_1164.all; use works.math;

27

entity alu is port ( A, B, S: in std_logic_vector (0 to 3); Cn1, M: in std_logic; C: out std_logic_vector (0 to 3) Comp, Cn2, Pn, Gn: out std_logic); end alu; architecture arq_alu of alu is begin Operaciones: process (S, A, B, C, M, Cn1) begin If (M =0 and Cn = `0`) then case S is when 0000 => C<= A; when 0001 => C<= A + B; when 0010 => C<= A + not B; when 0011 => C<= A + 1; when 0100 => C<= A*(A - not B); when 0101 => C<= (A+B)*(A*not B); when 0110 => C<= A B - 1; when 0111 => C<= A*(not B -1); when 1000 => C<= A*(A - B); when 1001 => C<= A - B; when 1010 => C<= (A + not B)*A*B; when 1011 => C<= (A * B)-1; when 1100 => C<= A + A; when 1101 => C<= (A + B) * A; when 1110 => C<= (A + not B)*A; when 1111 => C<= A - 1; end case; Elseif (M =1) case S is when 0000 => C<= not A; when 0001 => C<= not (A or B); when 0010 => C<= not A and B ; when 0011 => C<= 0000; when 0100 => C<= not (A and B); when 0101 => C<= not B; when 0110 => C<= A or B; when 0111 => C<= A and (not B); when 1000 => C<= not A or B; when 1001 => C<= not(A and B ); when 1010 => C<= B; when 1011 => C<= A and B; when 1100 => C<= 1111; when 1101 => C<= A or (not B) ; when 1110 => C<= A or B; when 1111 => C<= A; end case; else C<=0000; end if;

28

end process; operacion2: process (A , B, Comp, Cn2) begin if (A = B) then Comp = 1; else Comp = 0; end if; If ((A + B) = 10000 ) then Cn2 = 1; else Cn2 = 0; end if; end process; end architecture;

7. DISEO JERARQUICO EN VHDL


El diseo jerrquico permite la programacin de extensos diseos mediante la unin de varios mdulos o entidades electrnicas, las cuales se pueden analizar y simular de manera individual, para luego relacionarlas a travs de un algoritmo de integracin, llamado Top Level.

29

Esto permite, en diseos grandes trabajar al mismo tiempo con otros diseadores al mismo tiempo (paralelismo).

Entidad 1

Entidad 2

Top Level

Entidad 1

Entidad 2

7.1 Metodologa de diseo de estructuras jerrquicas.


Pasos a seguir: 1. 2. 3. 4. Analizar con detalle el problema y descomponer en bloques individuales la estructura global. Disear y programar mdulos individuales (componentes). Crear un paquete de componentes. Disear el programa de alto nivel.

Nota. Un componente es la parte de un programa que define un elemento fisico, el cual se puede usar en otros diseos o entidades.

DISENO DE UN DETECTOR DE SECUENCIAS a) Como aplicacin de un circuito secuencial de Mealy se pretende disear un detector de la siguiente secuencia de entrada 101 para que produzca una salid Z = 1 cuando se detecte el ultimo 1.

30

Se designan los estados como S0, S1, etc. Si el estado S0 es el estado inicial, 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 , 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.

Si tomamos Flip Flop Tipo D y aplicamos el mtodo de mapa de Karnaugh se obtienen los siguientes:

31

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, c1k: in bit; z: out bit); end sm1; architecture table of sm1 is signal State, Nextstate: integer range 0 to 2 : = 0; begin process (State, x) begin case State is when 0=> if x = '0' then Nextstate < = 0; else Nextstate < = 1; end if; z <= '0'; when 1 => if x = '0' then Nextstate < = 2; else Nextstate < = 1; end if; z <= '0'; when 2 => if x = '0' then Nextstate <= O; z <= '0'; else Nextstate <= 1; z <= '1'; end if; end case; end process;

32

process (c1k) begin jf clk' event and clk = '0' then State < = Nextstate; end if; end process; end table; b) Como aplicacin de un circuito secuencial de Moore se pretende disear un detector de la siguiente secuencia de entrada 101 para que produzca una salid Z = 1 cuando se detecte el ultimo 1. El diseo es similar a la mquina de Mealy hasta que se produce una secuencia de entrada 10, salvo porque se asocia una salida 0 con S0 , S1 y S2

Cuando aparezca una entrada de valor 1 para completar la secuencia 101, la salida debe valer 1; entonces el diagrama genera un estado adicional S3 como muestra la figura.

Si estando en el estado S2 la entrada es 0 la secuencia se inicializa, regresando al estado S0. 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.

33

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 mtodo de mapa de Karnaugh se obtienen los siguientes: Tabla de excitacin.
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 = BAX + BAX + BAX Luego el circuito secuencial ser:

DB = BA + BA + BX

Z = BA

34

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, c1k: in bit; z: out bit); end sm1; architecture table of sm1 is signal State, Nextstate: integer range 0 to 3 : = 0; begin process (State, x) begin case State is when 0=> if x = '0' then Nextstate < = 0; else Nextstate < = 1; end if; when 1 => if x = '0' then Nextstate < = 2; else Nextstate < = 1; end if; when 2 => if x = '0' then Nextstate <= 0; else Nextstate <= 3; end if; end case; end process; z <= '1'; when Nextstate <= 3; else '0' -- salida Moore process (c1k) begin jf clk' event and clk = '0' then State < = Nextstate; end if; end process; end table; bibliografa:
(Libro VHDL El arte de programar sistemas digitales) (Por: Maxinez y Alcala)

35