8. programacion de sistemas digitales con vhdl

43
NOTAS DE CLASE DISPOSITIVOS LOGICOS PROGRAMABLES PROGRAMACION DE SISTEMAS DIGITALES CON VHDL PROFESOR: GERMAN MORALES Z. AGOSTO DE 2011 1

Upload: fabian-david-manrique-monsalve

Post on 05-Dec-2014

296 views

Category:

Documents


11 download

TRANSCRIPT

Page 1: 8. Programacion de Sistemas Digitales Con Vhdl

NOTAS DE CLASE

DISPOSITIVOS LOGICOS PROGRAMABLESPROGRAMACION DE SISTEMAS DIGITALES CON VHDL

PROFESOR: GERMAN MORALES Z.

AGOSTO DE 2011

1

Page 2: 8. Programacion de Sistemas Digitales Con Vhdl

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 (primaria)

architecture (secundaria)

configuration (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.

2

Page 3: 8. Programacion de Sistemas Digitales Con Vhdl

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 Descripción a nivel de compuertaso Símbolo funcional de la entidad.o Diagrama de bloques.

3

Page 4: 8. Programacion de Sistemas Digitales Con Vhdl

Sintaxis de una declaración 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 parámetros se concretan en el momento de utilizarlas).

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);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 señales de entrada y salida, el cual equivale a un pin de un símbolo esquemático.

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 dirección que tomara la información. In: La señal es una entrada a la entidad. Out: La señal es una salida de la entidad. Note que el valor de esta señal no puede ser leída dentro de la arquitectura de la entidad, solamente por otras entidades que la utilicen. Inout: La señal se puede emplear como una entrada o una salida. Este modo es típicamente utilizado para terminales de entrada/salida de tres estados en un PLD. Buffer: La señal es una salida de la entidad y su valor puede ser leído dentro de la arquitectura de la entidad. Retroalimentaciones internas declaradas se comporta como una terminal de salida.

signal-type. (Tipo de dato): clase de información que se transmite por el puerto. Se asignan de acuerdo a un diseño en particular. Algunos tipos mas utilizados son:

Bit el cual tiene valores de ‘0’ y ‘1’ lógico.Boolean (booleano) que define los valores de FALSO o VERDADERO en una expresión.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.

4

Page 5: 8. Programacion de Sistemas Digitales Con Vhdl

2.3 DECLARACION DE ENTIDADES

Consiste en la descripción de las entradas y las salidas de un circuito identificado como una entidad (entity)

Cin CoutAB

SUMA

1. – Declaración De la Entidad de un circuito Sumador2. entity sumador is3. port (A,B, Cin: in bit;4. SUMA, Cout: out bit);5. end Sumador;

Las palabras en negrillas son reservadas para el lenguaje de programación VHDL.

-- Texto comentario que es ignorado por el compilador.; Se usa para finalizar una declaración.: 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. o 4suma Suma4

El segundo carácter no puede ser un guión bajo S_4bits.o S_4bits S4_bits

Dos guiones juntos no son permitidos. o Resta__4 Resta_4_

Un identificador no puede utilizar símbolos. 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 CoutA[3:0]B[3:0] SUMA[3:0]

5

EntidadSumador

EntidadSumador

Page 6: 8. Programacion de Sistemas Digitales Con Vhdl

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 agruparían de la siguiente manera:

Vector_A(3) = A3 Vector_B(3) = B3 Vector_SUMA(3) = S3Vector_A(2) = A2 Vector_B(2) = B2 Vector_SUMA(2) = S2Vector_A(1) = A1 Vector_B(2) = B1 Vector_SUMA(1) = S1Vector_A(0) = A0 Vector_B(0) = B0 Vector_SUMA(0) = S0

Una vez se ha establecido el orden en que aparecerán 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 aparición en sentido ascendente.

Luego la declaración será:

1. -- Declaración de la entidad circuito sumador2. entity sumador is3. port (A,B: in bit_vector (3 downto 0);4. Cin: in bit;5. Cout: in bit;6. SUMA: out bit_vector (3 downto 0);7. end sumador;

2.4.1 Declaracion De Entidades Mediante Librerias y Paquetes.

Las librerías o paquetes permiten declarar y almacenar estructuras lógicas seccionadas o complejas que facilitan el diseño.

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.

En VHDL se encuentran definidas dos librerías llamadas ieee y work así:

- ieee o std_logic_1164

- work

o numeric_stdo std_aritho gatesspkgo otra

Para un diseño VHDL el compilador crea automáticamente y utiliza una librería “work”

6

Page 7: 8. Programacion de Sistemas Digitales Con Vhdl

Una librería permite también almacenar resultados de la compilación de un diseño, con el fin de utilizar en uno o varios programas.

La librería work es el lugar establecido donde se almacenan los programas que el usuario va generando.

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.

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. La clase de objetos que pueden ser puestos en un paquete incluye declaraciones de señal, tipo, constantes, función, procedimiento y componentes.

Es una unidad de diseño 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 diseño se utiliza un paquete es necesario llamar a la librería que lo contiene, para esto se utiliza la siguiente declaración 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 diseño y no necesita declaración library.

El acceso a la información 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, además 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 aritméticas, como igual (=), mayor que (>), menor que (<) entre otros.

7

Page 8: 8. Programacion de Sistemas Digitales Con Vhdl

Ejemplo: Circuito multiplicador de dos números de dos bits.

1. -- Declaración de entidad circuito multiplicador2. library ieee;3. use ieee.std_logic_1164.all;4. entity multiplica is5. port (X0 X1 ,Y0 ,Y1: in std_logic;6. Z0 Z1 Z2 Z3: out std-logic);7. 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 programación describir los diseños desde el nivel de compuertas hasta sistemas complejos.

Sintaxis de una definición de arquitectura VHDL.

Architecture architecture-name of entity-name is type declarationssignal declarationsconstant declarationsfunction definitionsprocedure definitionscomponent declarations

beginconcurrent-statement……….concurrent-statement

end architecture-name

Ejemplo: signal signal-name: signal-type;constans Z: character<= ‘Z’;

Estilos de programación utilizados en el diseño:

1. Estilo funcional.2. Estilo por flujo de datos.3. Estilo estructural.

2.5.1 Descripción Estilo Funcional.

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

8

Page 9: 8. Programacion de Sistemas Digitales Con Vhdl

principalmente en el uso de procesos y declaraciones secuénciales, las cuales permiten modelar la función con rapidez.

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] C

Su Arquitectura funcional será:

1. -- Declaración de entidad circuito comparador2. library ieee;3. use ieee.std_logic_1164.all;4. entity comp is5. port (A,B: in bit_vector(1 downto 0);6. C: out bit);7. end comp;8.9. architecture functional of comp is10. begin11. compara: process (A,B)12. begin13. if A = B then 14. C = ‘1’;15. else 16. C = ‘0’;17. end if;18. end process compara;19. 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. -- Declaración de funcional compuerta OR2. library ieee;3. use ieee.std_logic_1164.all;4. entity com_or is5. port (A,B: in std_logic;6. C: out std_logic);7. end com_or;8. architecture functional of com_or is9. begin10. process (A,B) begin11. if (A = ‘0’ and B = ‘0’) then 12. C <= ‘0’;13. else 14. C <= ‘1’;15. end if;

9

EntidadSumador

Page 10: 8. Programacion de Sistemas Digitales Con Vhdl

16. end process;17. end functional;

Donde:

begin: Señala el inicio de la sección donde se comienza a declarar el proceso que rige el comportamiento del sistema.

La declaración del proceso se utiliza para la definición del algoritmo etiqueta opcional: process y une la lista sensitiva (A,B) que hace referencia a las señales 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 renglón.

2.5.2 Descripción 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 señal a otra sin necesidad de declaraciones secuenciales if~then~else. Este tipo de descripción 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 señales de entrada y las señales 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. -- Declaración de entidad circuito comparador2. library ieee;3. use ieee.std_logic_1164.all;4. entity comp is5. port (A,B: in bit_vector (1 downto 0);6. C: out bit);7. end comp;8.9. architecture f_datos of comp is10. begin11. C = ‘1’ when (A = B) else ‘0’;12. end f_datos;

Para el caso de la compuerta OR será:

1. -- Declaración de funcional compuerta OR2. library ieee;

10

Page 11: 8. Programacion de Sistemas Digitales Con Vhdl

3. use ieee.std_logic_1164.all;4. entity com_or is5. port (A,B: in std_logic;6. C: out std_logic);7. end com_or;8.9. architecture compuerta of com_or is10. begin11. f <= ‘0’ when (A = ‘0’ and B = ‘0’) else 12. ‘1’; 13. end compuerta;

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. En este caso se tiene una declaración 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 organización interna.

Si tomamos el comparador de dos bits, se puede representar por medio de compuertas lógicas básicas y su ecuación booleana será:

F =

1. -- Declaración de entidad circuito comparador2. library ieee;3. use ieee.std_logic_1164.all;4. entity comp is5. port (A,B: in bit_vector(1 downto 0);6. C: out bit);7. end comp;8.9. architecture booleana of comp is10. begin11. C <= (A(1) xnor B(1)12. and A(0) xnor B(1);13. end booleana;

Para la compuerta OR

1. -- Declaración de funcional compuerta OR2. library ieee;3. use ieee.std_logic_1164.all;4. entity com_or is5. port (A,B: in std_logic;6. C: out std_logic);7. end com_or;8.9. architecture compuerta of com_or is10. begin11. f <= ( A or B); 12. end compuerta;

11

Page 12: 8. Programacion de Sistemas Digitales Con Vhdl

2.5.3 Descripción Estilo estructural.

Basa su comportamiento en modelos establecidos (compuertas, sumadores, comparadores, contadores, etc.)’

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), los cuales permiten analizar de manera practica el circuito ya que la función de entrada / salida es conocida.

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.

La salida de cada uno de los bloques se maneja como una señal, 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 diseño. Este tipo de arquitecturas estándares 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 instrucción concurrente se ejecuta de manera simultánea 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 instrucción actualiza una señal que es utilizada por la primera instrucción, entonces el simulador regresara a esa primera instrucción y actualizara sus resultados de acuerdo con la señal que acaba de cambiar.

Instrucción 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 señales en la arquitectura actual. La lista puede escribirse en dos estilos diferentes:

Primero. 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. Es un estilo explicito; 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.

12

Page 13: 8. Programacion de Sistemas Digitales Con Vhdl

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.

Una arquitectura VHDL que utiliza componentes se denomina a menudo una descripción estructural o diseño estructural, porque define la estructura de interconexión precisa de senales y entidades que realiza la entidad.

El siguiente listado muestra la descripción estructural del comparador.

1. -- Declaración de entidad circuito comparador2. library ieee;3. use ieee.std_logic_1164.all;4. entity comp is5. port (A,B: in bit_vector(0 to 1);6. C: out bit);7. end comp;8. use work.compuerta.all;9.10. architecture estructural of comp is11. signal X: bit_vector (0 to 1);12. begin13. U0: xnor2 port map (A(0), B(0), X(0);14. U1: xnor2 port map (A(1), B(1), X(1);15. U2: and2 port map (X(0), X(1), C);16. 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 librería de trabajo work.

Las señales 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. -- Declaración de entidad circuito combinatorio2. library ieee;3. use ieee_std_logic_1164.all;4. entity combina is5. port (A,B,C: in std_logic;6. F: out std_logic);7. end combina;8. use work.compuerta.all;9.10. architecture estructural of combina is11. signal X: bit_vector (0 to 2);12. begin13. U0: and2 port map (B, C, X(0);14. U1: and2 port map (C, A, X(1);15. U2: and2 port map (A, B, X(2));16. U3: or3 port map (X(0), X(1), X(2), F);17. end estructural;

13

Page 14: 8. Programacion de Sistemas Digitales Con Vhdl

3. DISEÑO LOGICO COMBINATORIO

3.1 Programación de estructuras básicas mediante declaraciones concurrentes.

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.

En la declaración concurrente no importa el orden en que se escriban las señales, ya que el resultado para determinada función seria el mismo.

Tipos de declaraciones concurrentes:

1. Declaraciones condicionales asignadas a una señal (when - else).2. Declaraciones concurrentes asignadas a señales.3. Selección de una señal (with-select-when).

3.1.1 Declaraciones condicionales asignadas a una señal (when - else).

La declaración (when - else) se utiliza para asignar valores a una señal determinando así la ejecución de una condición propia del diseño.

Ejemplo 1. Consideremos la función definida en la siguiente tabla de verdad.

ab f(a,b,c)c

a B C F0 0 0 1

14

EntidadPrueba

Page 15: 8. Programacion de Sistemas Digitales Con Vhdl

0 0 1 00 1 0 00 1 1 11 0 0 01 0 1 01 1 0 11 1 1 1

Listado. Descripción de la entidad mostrada en la tabla de la figura.

Descripción de la entidad:

1. -- Ejemplo combinacional básico2. library ieee;3. use ieee.std_logic_1164.all;4. entity tabla is port (5. a,b,c: in std_logic;6. f: out std_logic;7. end tabla;8. architecture ejemplo of tabla is9. begin10. f <= '1' when (a='0' and b ='0' and c ='0') else 11. '1' when (a='0' and b ='1' and c ='1') else12. '1' when (a='1' and b ='1' and c ='0') else13. '1' when (a='1' and b ='1' and c ='1') else14. '0';15. end ejemplo;

Operadores Lógicos.

Los operadores lógicos más utilizados son: AND, OR, NAND, NOR, XOR, XNOR y NOT.

Las operaciones que se efectúen 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 lógicos presentan el siguiente orden y prioridad:

1. Expresiones entre paréntesis2. Complementos3. Función AND4. Función OR5.

Ejemplo 2. Una función F depende de cuatro variables D,C,B,A donde A es la variable menos significativa. 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.

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.

D C B A F

15

Page 16: 8. Programacion de Sistemas Digitales Con Vhdl

0 0 0 0 00 0 0 1 00 0 1 0 00 0 1 1 00 1 0 0 10 1 0 1 10 1 1 0 10 1 1 1 11 0 0 0 01 0 0 1 01 0 1 0 01 0 1 1 01 1 0 0 01 1 0 1 01 1 1 0 01 1 1 1 0

Listado. Descripción 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 is8 begin9 F <= '1' when (A = 'O' and B = '0' and C = '1' and D = '0') else10 '1' when (A = '1' and B = '0' and C = '1' and D = '0') else11 '1' when (A = '0' and B = '1' and C = '1' and D = '0') else12 '1' when (A = '1' and B = '1' and C = '1' and D = '0') else13 '0' ;14 end a-func;

3.1.2 Declaraciones concurrentes asignadas a señales.

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

Page 17: 8. Programacion de Sistemas Digitales Con Vhdl

1. -- Ejemplo circuito lógico realizado con compuertas2. library ieee;3. use ieee.std_logic_1164.all;4. entity logic is port (5. a,b,c,d,e,f: in std_logic;6. x1,x2,x3: out std_logic;7. end logic;8. architecture booleana of logic is9. begin10. x1 <= a xnor b;11. x2 <= (((c and d) or a xnor b)) nand12. ((e xor f) and (c and d)));13. x3 <= (e xor f) and (c and d);14. end booleana;

3.1.2 Selección de una señal (with-select-when).

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.

Ejemplo 3.

a(0) a(1) F0 0 10 1 01 0 11 1 0

1. library ieee;2. use ieee.std_logic_1164.all;3. entity circuito is port (4. a: in std_logic_vector (1 downto 0);5. c: out std_logic);6. end circuito7. architecture arq_cir of circuito is 8. begin 9. with a select 10. c <= '1' when "00",11. '0' when "01",12. '1' when "10",13. '0' when others,14. end arq_cir;

Ejemplo 4 Se requiere diseñar un circuito combinacional que detecte números primos de 4 bits. Realice la tabla de verdad y elabore un programa que describa su función. Utilice instrucciones del tipo with -select -when.

X0 X1 X2 X3 F0 0 0 0 00 0 0 1 10 0 1 0 10 0 1 1 10 1 0 0 0

17

Page 18: 8. Programacion de Sistemas Digitales Con Vhdl

0 1 0 1 10 1 1 0 00 1 1 1 11 0 0 0 01 0 0 1 01 0 1 0 01 0 1 1 11 1 0 0 01 1 0 1 11 1 1 0 01 1 1 1 0

Si se considera que la entrada X es un vector de 4 bits y que F es la función de salida, el programa en VHDL quedaría 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 isB begin9 with X select10 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

Page 19: 8. Programacion de Sistemas Digitales Con Vhdl

4. 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,

La característica principal de un flíp-flop es mantener o almacenar un bit, de manera indefinida hasta que a través de un pulso o una señal cambie de estado. Los flíp-flops más 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 notación Q y Q(t+1):Q= estado presente o actualQ 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

Page 20: 8. Programacion de Sistemas Digitales Con Vhdl

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.

En el diseño secueucíal con VHDL las declaraciones If-then-else son las más utilizadas; por ejemplo, el programa del listado4.1usa estas declaraciones.

La ejecución del proceso es sensible a los cambios en clk(pulso de reloj); esto es, 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.

Simulación de un circuito flip-flop tipo D

5. 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..

20

Page 21: 8. Programacion de Sistemas Digitales Con Vhdl

Otra posibilidad es observar y analizar de manera global todo el sistema evaluando su comportamiento solo a través de sus entradas y salidas. Aquí las terminales de entrada salida disminuyen, 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.

5.2.1 Programación de tres entidades individuales

La figura muestra un circuito lógico formado por los siguientes módulos: Teclado, Codificador, registro, decodificador y display de 7 SEG.

Su objetivo es observar en el display el número correspondiente a la tecla presionada, para ello el codificador generara (C0,C1,C2,C3) el equivalente del número en BCD, el cual es almacenado en el registro, cuyo contenido (Q0,Q1,Q2,Q3) proporciona la información (D0,D1,D2,D3) al decodificador de siete segmentos para ser observado en el display.

La programación de cada modulo se muestra en el siguiente listado, donde se han asignado terminales para cada uno de ellos.

Listado de programación de estos módulos.

1 library ieee;2 use ieee.std_logic_1164.all;3 entity display1 is port (4 clk: in std_logic;-- pulso de reloj5 tecla: in std_logic_vector (0 to 8);-- botón de teclado6 C: inout std_logic_vector (3 downto 0); -- salida codificador 7 A: inout std_logic_vector (3 downto 0); -- entrada registro

21

TECLADOTECLADO CODIFICADORCODIFICADOR REGISTROREGISTRO A A DECODIFICADORDECODIFICADOR DISPLAY DISPLAY 7 SEG7 SEG B B

Page 22: 8. Programacion de Sistemas Digitales Con Vhdl

8 Q: inout std_logic_vector (3 downto 0); -- salida registro9 D: inout std_logic_vector (3 downto 0); -- entrada decodificador10 seg: out std_logic_vector (0 to 6); -- salidas decodificador11 end display1;12 architecture a_disp1 of display1 is13 begin14 C<= “0001” when tecla = “100000000” else15 “0010” when tecla = “010000000” else16 “0011” when tecla = “001000000” else17 “0100” when tecla = “000100000” else18 “0101” when tecla = “000010000” else19 “0110” when tecla = “000001000” else20 “0111” when tecla = “000000100” else21 “1000” when tecla = “000000010” else22 “1001”;23 A<= C; 24 process (clk, A, D) begin25 if (clk’event and clk= ‘1’) then26 Q <= A; 27 D <= Q;28 end if;29 case D is30 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 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. Las salidas de una entidad funcionan como entradas de la otra entidad. Esta forma de programación solo es posible siempre y cuando los bloques individuales se relacionan mediante señales internas. Ver figura 5.5

22

Page 23: 8. Programacion de Sistemas Digitales Con Vhdl

1 library ieee;2 use ieee.std_logic_1164.all;3 entity display is port (4 clk: in std_logic; -- pulso de reloj5 tecla : in std_logic_vector (0 to 8); -- declaración de entradas6 seg: out std_logic_vector(0 to 6); -- declaración salidas7 end display;8 architecture a_disp of display is9 signal C: std_logic_vector ( 3 downto 0);10 signal Q: std_logic_vector ( 3 downto 0);11 begin12 process (clk, tecla, C, Q) begin13 if (clk’ event and clk = ‘1’) then 14 Q <= C15 end if 16 if (tecla = “100000000”) then17 C<= “0001”;18 elsif (tecla = “010000000”) then19 C<= “0010”;20 elsif (tecla = “001000000”) then21 C<= “0011”;22 elsif (tecla = “000100000”) then23 C<= “0100”;24 elsif (tecla = “000010000”) then25 C<= “0101”;26 elsif (tecla = “000001000”) then27 C<= “0110”;28 elsif (tecla = “000000100”) then29 C<= “0111”;30 elsif (tecla = “000000010”) then31 C<= “1000”;32 else33 C<= “1001”;34 end if;35 case Q is36 when “0000” => seg <= “0000001”;37 when “0001” => seg <= “1001111”;

23

Page 24: 8. Programacion de Sistemas Digitales Con Vhdl

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 diseñar un circuito de control para una maquina empacadora de muñecas, en forma individual o con un máximo de 9 muñecas por caja.

Descripción: Por medio de un teclado decimal, se ingresa la cantidad de muñecas a empacar por caja, luego el codificador (C0,C1,C2,C3) convierte el número decimal en código BCD, el cual es almacenado en un registro A (R0,R1,R2,R30, cuyo contenido es mostrado por el decodificador de siete segmentos a través de un display. Esta información se debe mantener hasta completar la cantidad de muñecas deseadas.

Para conocer la cantidad de muñecas empacadas se recurre a un sensor y un contador B (Q0,Q1,Q2,Q3), el cual se incrementa cada vez que pasa una muñeca por el sensor. El contenido del contador B es comparado con el numero de muñecas a empacar almacenado en el registro A, 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.

Procedimiento: Después de seleccionar la cantidad de muñecas por empacar, el operador presiona el botón de inicio en el modulo Controlador, el cual genera una señal de reset que coloca el contador en estado cero; enseguida envía una señal de arranque (Encendido) al motor que controla el avance de la banda transportadora, hasta que el numero de muñecas sensadas en el contador B sea igual al numero programado en el registro A. Cumplido lo anterior, el comparador envía una señal al controlador, el cual detiene la banda transportadora (Apagado) finalizando el proceso.

24

CLK Reset

Sistema de integración

TECLADOTECLADO CODIFICADORCODIFICADOR REGISTROREGISTRO A A COMPARADORCOMPARADOR

DISPLAY (7)DISPLAY (7)

CONTADORCONTADOR B B SENSOSENSORR

DECODIFICADORDECODIFICADOR

CONTROLADORCONTROLADOR

Page 25: 8. Programacion de Sistemas Digitales Con Vhdl

1. Library ieee;2. use ieee.std_logic_1164.all;3. use std_arith.all;4. entity control is port(5. clk, reset: in std_logic;6. boton: in std_logic_vector(0 to 8);7. sensor: in std_logic;8. deco: out std_logic_vector(0 to 6);9. compara: out std_logic);10. end control;11. Architecture a_control of control is12. signal Q,C,R: std_logic_vector (3 down to 0);13. begin14. Proceso1: process (sensor, reset, Q) begin15. If (sensor event and sensor= ‘1’) then 16. Q <= “0000”;17. Q <= Q+1;18. If (reset = ‘1’ or Q =“1001”) then19. Q <= “0000”;20. end if;21. end if;22. end process;23. Proceso2: process (clk, boton, R) begin24. if (clk event and clk=‘1’ ) then25. R<=C;26. If (boton = "1000000000") then27. C<="0001";28. elsif (boton = "0100000000") then29. C<="0010";30. elsif (boton = "0010000000") then31. C<="0011";32. elsif (boton = "0001000000") then33. C<="0100";34. elsif (boton = "0000100000") then35. C<="0101";36. elsif (boton = "0000010000") then37. C<="0110";38. elsif (boton = "0000001000") then39. C<="0111";40. elsif (boton = "0000000100") then

25

TECLADOTECLADO

SISTEMASISTEMADEDE

INTEGRACIONINTEGRACION

DISPLAY (7)DISPLAY (7)

CONTROLADORCONTROLADOR

Encendido/ApagadoBanda transportadora

Sensor

Reset A = B

InicioVcc

Page 26: 8. Programacion de Sistemas Digitales Con Vhdl

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 integración de las entidades que forman el sistema solo preciso de dos procesoa: el primero (línea14),para describir el conteo de las muñecas mediante la variable de entrada sensor; el segundo (línea 23) para integrar el codificador, registro y decodificador de siete segmentos. 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. Esto con el objeto de detener la banda transportadora.

Ejercicio 5.2: La siguiente figura muestra el circuito electrónico de una Unidad Lógica Aritmética – ALU. Su tabla característica indica la función que se ejecuta de acuerdo a sus controles de selección. Programe dicho circuito utilizando la integración de entidades mediante la relación de señales de entrada salida.

26

Page 27: 8. Programacion de Sistemas Digitales Con Vhdl

Selección de FunciónS3 S2 S1 S0

Función aritmética de salidaM = Cn =0

Función lógica de salidaM = 1

0 0 0 0 F = A F = A’0 0 0 1 F = A plus B F = (A + B)’0 0 1 0 F = A plus B’ F = A’ B0 0 1 1 F = A plus 1 F = 00000 1 0 0 F = A * (A minus B’) F = (A B)’0 1 0 1 F = (A plus B) * (A * B’) F = B’0 1 1 0 F = A minus B minus 1 F = A + B0 1 1 1 F = A * (B’ minus 1) F = A B’1 0 0 0 F = A * (A minus B) F = A’ + B1 0 0 1 F = A minus B F = (A’ B)’1 0 1 0 F = (A plus B’)*A*B F = B1 0 1 1 F = A* B minus 1 F = A B1 1 0 0 F = A plus A F = 11111 1 0 1 F = (A plus B) *A F = A + B’1 1 1 0 F = (A plus B’) *A F = A + B1 1 1 1 F = A minus 1 F = A

Listado del programa.

Library ieee;use ieee.std_logic_1164.all;use works.math;

S0 C0S1 C1S2 C2S3 C3

A L UB0 B1 B2 A=BB3

A0 A1 A2 Cn + 4A3

Cn P’

M G’

Salida de4 bits

Entrada de 4 bits

Entrada de 4 bits

Selector de Función

Acarreo de entrada Modo de Control

Acarreo de baja velocidad

Acarreo de alta velocidad

27

Page 28: 8. Programacion de Sistemas Digitales Con Vhdl

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 isbegin

Operaciones: process (S, A, B, C, M, Cn1) beginIf (M =’0’ and Cn = `0`) then

case S iswhen “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 iswhen “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

Page 29: 8. Programacion de Sistemas Digitales Con Vhdl

end process;

operacion2: process (A , B, Comp, Cn2) beginif (A = B) thenComp = ”1”;elseComp = ”0”;end if;If ((A + B) = “10000” ) thenCn2 = ”1”;elseCn2 = ”0”;end if;

end process;end architecture;

7. 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, las cuales se pueden analizar y simular de manera individual, para luego relacionarlas a través de un algoritmo de integración, llamado Top Level.

29

Page 30: 8. Programacion de Sistemas Digitales Con Vhdl

Esto permite, en diseños grandes trabajar al mismo tiempo con otros diseñadores al mismo tiempo (paralelismo).

7.1 Metodología de diseño de estructuras jerárquicas.

Pasos a seguir:

1. Analizar con detalle el problema y descomponer en bloques individuales la estructura global.2. Diseñar y programar módulos individuales (componentes).3. Crear un paquete de componentes.4. Diseñar 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 diseños o entidades.

DISENO DE UN DETECTOR DE SECUENCIASa) 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.

30

Top Level

Entidad 1 Entidad 2

Entidad 1 Entidad 2

Page 31: 8. Programacion de Sistemas Digitales Con Vhdl

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 método de mapa de Karnaugh se obtienen los siguientes:

31

Page 32: 8. Programacion de Sistemas Digitales Con Vhdl

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

Page 33: 8. Programacion de Sistemas Digitales Con Vhdl

process (c1k) begin jf clk' event and clk = '0' then

State < = Nextstate; end if; end process; end table;

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.El diseño es similar a la máquina 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

Page 34: 8. Programacion de Sistemas Digitales Con Vhdl

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.

B A X B A  DA DB Z0 0 0 0 0 0 0 0 01 0 0 1 0 1 0 1 02 0 1 0 1 1 1 1 03 0 1 1 0 1 0 1 04 1 0 0 1 1 1 1 15 1 0 1 0 1 0 1 16 1 1 0 0 0 0 0 07 1 1 1 1 0 1 0 0

Mapas de Karnaugh

BA\X 0 1   BA\X 0 1   BA\X 0 1  

00 0 0   00 0 1 00 0 0  

01 1 0   01 1 1 01 0 0  

11 0 1   11 0 0 11 0 0  

10 1 0   10 1 1 10 1 1  

DA = B’AX’ + BA’X’ + BAX DB = BA’ + B’A + B’X Z = BA’Luego el circuito secuencial será:

34

Page 35: 8. Programacion de Sistemas Digitales Con Vhdl

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 Mooreprocess (c1k) begin jf clk' event and clk = '0' then

State < = Nextstate; end if; end process; end table;

bibliografía:

(Libro VHDL El arte de programar sistemas digitales)(Por: Maxinez y Alcala)

35