Anda di halaman 1dari 25

NOTAS DE CLASE

DISPOSITIVOS LOGICOS PROGRAMABLES

PROGRAMACION DE SISTEMAS DIGITALES CON VHDL

(Libro VHDL El arte de programar sistemas digitales)


(Por: Maxinez y Alcala)

PROFESOR: GERMAN MORALES Z.

AGOSTO DE 2003

1
PROGRAMACION DE SISTEMAS DIGITALES CON VHDL
Lenguaje de programación - Hardware Description Lenguaje (VHDL) Very High Speed Integrated Circuit
(VHSIC)

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 orientado a la descripción de Sistemas Digitales.


 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 (Galbana
capacidad o CPLD Y FPGA mayor capacidad.

2.1 UNIDADES BASICAS DE DISEÑO


 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.2 ENTIDAD – “Entity”

 Es el bloque elemental de diseño en VHDL donde se identifica con claridad sus entradas y salidas
generales.

 Entidades: elementos electrónicos que conforman un sistema digital (sumadores, contadores,


compuertas, flip flops, memorias, Multiplexores etc.).

 Una entidad se puede representar por:

o Descripción a nivel de compuertas


o Símbolo funcional de la entidad.
o Diagrama de bloques.

2
Sintaxis de una declaración VHDL.
entity entity-name is
port (signal-names: mode signal-type;
signal-names: mode signal-type;
…..
signal-names: mode signal-type);
end entity-name ;

2.2.1 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:

Nombre (identificador): se utiliza como una forma de llamar un puerto.

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.

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’

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 Entidad Cout


A Sumador
B
SUMA

1. – Declaración De la Entidad de un circuito Sumador


2. entity sumador is
3. 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.

3
-- 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 Entidad Cout
A[3:0]
B[3:0]
Sumador 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 agruparían de la siguiente manera:

Vector_A(3) = A3 Vector_B(3) = B3 Vector_SUMA(3) = S3


Vector_A(2) = A2 Vector_B(2) = B2 Vector_SUMA(2) = S2
Vector_A(1) = A1 Vector_B(2) = B1 Vector_SUMA(1) = S1
Vector_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 sumador


2. entity sumador is

4
3. 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_std
o std_arith
o gatesspkg
o otra

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

 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

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

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

1. -- Declaración de entidad circuito multiplicador


2. library ieee;
3. use ieee.std_logic_1164.all;
4. entity multiplica is
5. port (X0 X1 ,Y0 ,Y1: in std_logic;
6. Z0 Z1 Z2 Z3: out std-logic);
7. end multiplica;

6
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 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 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 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] Entidad
B [1:0]
Sumador C

Su Arquitectura funcional será:

1. -- Declaración de entidad circuito comparador


2. library ieee;
3. use ieee.std_logic_1164.all;
4. entity comp is

7
5. port (A,B: in bit_vector(1 downto 0);
6. C: out bit);
7. end comp;
8.
9. architecture functional of comp is
10. begin
11. compara: process (A,B)
12. begin
13. 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 OR


2. library ieee;
3. use ieee.std_logic_1164.all;
4. entity com_or is
5. port (A,B: in std_logic;
6. C: out std_logic);
7. end com_or;
8. architecture functional of com_or is
9. begin
10. process (A,B) begin
11. if (A = ‘0’ and B = ‘0’) then
12. C <= ‘0’;
13. else
14. C <= ‘1’;
15. end if;
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:

8
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 comparador


2. library ieee;
3. use ieee.std_logic_1164.all;
4. entity comp is
5. port (A,B: in bit_vector (1 downto 0);
6. C: out bit);
7. end comp;
8.
9. architecture f_datos of comp is
10. begin
11. 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 OR


2. library ieee;
3. use ieee.std_logic_1164.all;
4. entity com_or is
5. port (A,B: in std_logic;
6. C: out std_logic);
7. end com_or;
8.
9. architecture compuerta of com_or is
10. begin
11. 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 = ( A0  B 0)  ( A1  B1)

1. -- Declaración de entidad circuito comparador


2. library ieee;
3. use ieee.std_logic_1164.all;

9
4. entity comp is
5. port (A,B: in bit_vector(1 downto 0);
6. C: out bit);
7. end comp;
8.
9. architecture booleana of comp is
10. begin
11. 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 OR


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

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 más fundamental de las instrucciones concurrentes y tiene la siguiente sintaxis:

10
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 asocia los 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.

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 comparador


2. library ieee;
3. use ieee.std_logic_1164.all;
4. entity comp is
5. 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 is
11. signal X: bit_vector (0 to 1);
12. begin
13. 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 combinatorio


2. library ieee;
3. use ieee_std_logic_1164.all;
4. entity combina is
5. port (A,B,C: in std_logic;
6. F: out std_logic);

11
7. end combina;
8. use work.compuerta.all;
9.
10. architecture estructural of combina is
11. signal X: bit_vector (0 to 2);
12. begin
13. 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;

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

a Entidad
b Prueba f(a,b,c)
c

a B C F
0 0 0 1
0 0 1 0
0 1 0 0
0 1 1 1
1 0 0 0
1 0 1 0
1 1 0 1
1 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ásico


2. 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;

13
8. architecture ejemplo of tabla is
9. begin
10. f <= '1' when (a='0' and b ='0' and c ='0') else
11. '1' when (a='0' and b ='1' and c ='1') else
12. '1' when (a='1' and b ='1' and c ='0') else
13. '1' when (a='1' and b ='1' and c ='1') else
14. '0';
15. end ejemplo;

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
0 0 0 0 0
0 0 0 1 0
0 0 1 0 0
0 0 1 1 0
0 1 0 0 1
0 1 0 1 1
0 1 1 0 1
0 1 1 1 1
1 0 0 0 0
1 0 0 1 0
1 0 1 0 0
1 0 1 1 0
1 1 0 0 0
1 1 0 1 0
1 1 1 0 0
1 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 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 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.

14
1. -- Ejemplo circuito logico realizado con compuertas
2. 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 is
9. begin
10. x1 <= a xnor b;
11. x2 <= (((c and d) or a xnor b)) nand
12. ((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) F
0 0 1
0 1 0
1 0 1
1 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 circuito
7. 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 F
0 0 0 0 0
0 0 0 1 1
0 0 1 0 1
0 0 1 1 1

15
0 1 0 0 0
0 1 0 1 1
0 1 1 0 0
0 1 1 1 1
1 0 0 0 0
1 0 0 1 0
1 0 1 0 0
1 0 1 1 1
1 1 0 0 0
1 1 0 1 1
1 1 1 0 0
1 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 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;

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

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.

DISPLAY
TECLADO CODIFICADOR REGISTRO A DECODIFICADOR
7 SEG B

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 reloj
5 tecla: in std_logic_vector (0 to 8);-- botón de teclado
6 C: inout std_logic_vector (3 downto 0); -- salida codificador
7 A: inout std_logic_vector (3 downto 0); -- entrada registro
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”;

17
23 A<= C;
24 process (clk, A, D) begin
25 if (clk’event 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 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

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); -- declaración de entradas
6 seg: out std_logic_vector(0 to 6); -- declaración 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”;

18
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”;
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.

DISPLAY (7) Sistema de


integración

DECODIFICADOR

TECLADO CODIFICADOR REGISTRO A COMPARADOR CONTADOR B SENSOR

CLK CONTROLADOR Reset

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

DISPLAY (7)

SISTEMA
TECLADO
DE Sensor
INTEGRACION

Reset A=B
Encendido/Apagado
Vcc
CONTROLADOR Banda transportadora
Inicio

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 is
12. signal Q,C,R: std_logic_vector (3 down to 0);
13. begin
14. Proceso1: process (sensor, reset, Q) begin
15. If (sensor event and sensor= ‘1’) then
16. Q <= “0000”;
17. Q <= Q+1;
18. If (reset = ‘1’ or Q =“1001”) then
19. Q <= “0000”;
20. end if;
21. end if;
22. end process;
23. Proceso2: process (clk, boton, R) begin
24. if (clk event and clk=‘1’ ) then
25. R<=C;
26. If (boton = "1000000000") then
27. C<="0001";
28. elsif (boton = "0100000000") then
29. C<="0010";
30. elsif (boton = "0010000000") then
31. C<="0011";
32. elsif (boton = "0001000000") then
33. C<="0100";

20
34. elsif (boton = "0000100000") then
35. C<="0101";
36. elsif (boton = "0000010000") then
37. C<="0110";
38. elsif (boton = "0000001000") then
39. C<="0111";
40. elsif (boton = "0000000100") then
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;

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.

21
Selector de S0 C0
Función S1 C1 Salida de
S2 C2 4 bits
S3 C3

ALU
B0
Entrada de B1
4 bits B2 A=B
B3

A0
A1
Entrada de A2 Cn + 4
4 bits A3 Acarreo de baja velocidad

Cn P’

Acarreo de M G’ Acarreo de alta velocidad


entrada
Modo de
Control

Selección de Función Función aritmética de salida Función lógica de salida


S3 S2 S1 S0 M = Cn =0 M=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’ B
0 0 1 1 F = A plus 1 F = 0000
0 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+B
0 1 1 1 F = A * (B’ minus 1) F = A B’
1 0 0 0 F = A * (A minus B) F = A’ + B
1 0 0 1 F = A minus B F = (A’ B)’
1 0 1 0 F = (A plus B’)*A*B F=B
1 0 1 1 F = A* B minus 1 F=AB
1 1 0 0 F = A plus A F = 1111
1 1 0 1 F = (A plus B) *A F = A + B’
1 1 1 0 F = (A plus B’) *A F=A+B
1 1 1 1 F = A minus 1 F=A

Listado del programa.

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

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;

22
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;

end process;

operacion2: process (A , B, Comp, Cn2) begin


if (A = B) then
Comp = ”1”;
else
Comp = ”0”;
end if;

23
If ((A + B) = “10000” ) then
Cn2 = ”1”;
else
Cn2 = ”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.

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

Entidad 1 Entidad 2

Top Level

Entidad 1 Entidad 2

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.

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

25

Anda mungkin juga menyukai