Documente Academic
Documente Profesional
Documente Cultură
Electrónico
DIGLENSY SAC
PRESENTA:
TUTORIAL
VHDL
http://www.diglensy.com/
DIGLENSY SAC
TUTORIAL
VHDL
Contenido:
2
DIGLENSY SAC
Desde hace algún tiempo ya se viene usando el lenguaje VHDL como una de las
alternativas de implementación en dispositivos CPLD’s y FPGA’s. Las herramientas
de síntesis han ido mejorando considerablemente. Hoy en día muchos fabricantes de
circuitos integrados utilizan la tecnológica de lógica programable para implementar
sistemas digitales muy complejos y poder validar sus nuevos diseños sin tener que recurrir
a la fabricación del circuito integrado. Gracias a las herramientas de diseño automático
existentes los diseñadores pueden aumentar la productividad, reduciendo los tiempos de
desarrollo y sobre todo abaratando los costos de diseño.
3
DIGLENSY SAC
Escala de Integración
NÚMERO DE
NOMBRE SIGNIFICADO
TRANSISTORES
Pequeña escala de
SSI Menos de 50
integración
MSI Media escala de 50 a 500
integración
Grande escala de
LSI 500 a 50000
integración
Muy grande escala de
VLSI 50000 a 500000
integración
Ultra alta escala de
ULSI Más de 500000
integración
4
DIGLENSY SAC
LÓGICA PROGRAMABLE
Los tiempos del ciclo de diseño de los sistemas digitales se vienen reduciendo
haciendo que los diseñadores utilicen sofisticadas herramientas de diseño automático
que les permita afrontar la creciente complejidad de los circuitos integrados colocando
sus diseños en el mercado en el menor tiempo posible.
5
DIGLENSY SAC
Idea de un PLD
A B
17
18
16
WIRE
WIRE
NOT
NOT
6
AND2
1 Matriz And
AND2
7
Lineas de Producto
AND2
2
12
13
15
14
OR4
OR4
OR4
OR4
AND2
8 Fusible
Matriz Or
Lineas de Entrada
o1 o2 o3 o4
Simbología PLD
AND4
OR4
AND2
OR2
8
10
1
5
CARRY
NOT
12
14
6
DIGLENSY SAC
PAL: Es el dispositivo mas simple, el circuito interno de una PAL consiste de una
matriz de conexiones, una matriz de compuertas AND y un arreglo de compuertas OR.
La matriz de conexiones esta basada en una red de conductores distribuidos en filas y
columnas con un fusible en cada punto de intersección, mediante la cual se seleccionan
cuales entradas del dispositivo serán conectadas al arreglo AND cuyas salidas son
conectadas al arreglo OR y de esta manera obtener una función lógica en forma de
suma de productos.
7
DIGLENSY SAC
1. Programable (bipolar)
• Fusible, se funde por corriente
• Una vez programados no se puede volver a
reprogramar (OTP)
2. Reprogramable (MOS)
• Programable eléctricamente
• Fusible = transistor MOS de puerta flotante
Implementa puerta AND cableada
Consumo estático por pull-up
• EPLD
Borrado por luz UV. Exposición 20min.
Encapsulado con ventana de cuarzo,
en caso contrario OTP
• EEPLD
Borrado eléctrico
- Efectos capacitivos.
- Corrientes de fuga.
-Mala eficiencia de uso del silicio a nivel del área en el chip.
CPLD
8
DIGLENSY SAC
PIM
Permite unir los pines de I/O a las entradas de los bloques lógicos (bloques de
función) o las salidas del bloque lógico a las entradas del otro bloque lógico.
Interconexión mediante arreglo (filas y columnas)
• Interruptor º EECMOS
• Versátil pero lento
• Cualquier X se puede conectar a
cualquier LB (Fully routable)
• Alto consumo ( menor desempeño).
Interconexión mediante multiplexores
• Existe un mux por cada LB
• Cada entrada del mux es programada
• El uso de grandes mux Alto consumo ( menor desempeño ).
LB o FB
Macrocelda:
Implementan una función digital como suma de TP
- Su salida va hacia la PIM y hacia los I/O (excepto MC buried)
9
DIGLENSY SAC
Pines I/O
- Cada pin I/O se pueden configurar como:Entrada/ Salida/ Bidireccional
- El buffer de salida es triestado. El control triestado puede ser controlado:
• Individualmente por una MC
• Globalmente (GTS)
- Control de slew-rate. Se pueden aumentar los tiempos de conmutación
reducir: ringing, ground bounce y ruido.
10
DIGLENSY SAC
Los CLB’s se comunican unos con otros mediante canales de conexión verticales
y horizontales. Los FPGA’s utilizan generadores de funciones que por lo general son
memorias donde se precalcula el resultado correcto de una función y se almacena. Las
entradas del generador (bus de direcciones) seleccionan el resultado correcto. FPGAs
se programan utilizando interruptores programables eléctricamente.
Tipos:
• SRAM. Celdas de memoria RAM estática (5 transistores) que controlan puertas
de paso o multiplexores
• Antifusibles: Dispositivo de dos terminales
11
DIGLENSY SAC
12
DIGLENSY SAC
Spartan 3
13
DIGLENSY SAC
Facilidad de diseño:
Las herramientas de software que dan soporte al diseño con FPGA’s y CPLD’s
facilitan enormemente este proceso. Las hojas de codificación que se utilizaban en
1975 han dejado paso a los ensambladores y compiladores de lenguajes de alto nivel
para lógica programable. Estas nuevas herramientas permiten expresar la lógica de
los circuitos utilizando formas variadas de entrada tales como; ecuaciones, tablas de
verdad, procedimientos para máquinas de estados, esquemas, hasta utilizar
descripciones abstractas. La simulación digital posibilita la depuración de los diseños
antes de la programación de los dispositivos. Todo el equipo de diseño se reduce a un
software que en la mayoría de los casos es de distribución gratuita por INTERNET que
corre en un computador.
Prestaciones:
14
DIGLENSY SAC
Fiabilidad.
15
DIGLENSY SAC
routing
resources FPGA
Bitstream
look-up table configurable
101010010101100101
function block
010110101010110101
010110100101101011
Generate Bitstream 010101001010101010
101010101001101010
110110110101001010
110100101011001011
001011001010101001
010101101001101001
011001100010101010
101010100110010101
16
DIGLENSY SAC
Está basado en sentencias que se ejecutan de manera concurrente: quiere decir que las
sentencias se ejecutan cuando ocurre un evento y pueden ejecutarse una o más al
mismo tiempo (aquellas sentencias que dependan de las señales que están cambiando
serán evaluadas). Aunque también permite definir dominios en los que las acciones se
suceden en orden secuencial (Process).
17
DIGLENSY SAC
Permite simular el diseño y generar formas de onda: Una de las finalidades del VHDL
es modelar un circuito para observar su comportamiento a lo largo del tiempo
(simulación). Esto implica que el VHDL tenga construcciones asociadas para poder
realizar una simulación. Estas construcciones permiten generar distintos eventos que
se sucederán a lo largo del tiempo, afectando a las sentencias que dependan de las
señales que vayan cambiando y obteniendo de esta manera la respuesta del circuito
evaluado.
18
DIGLENSY SAC
19
DIGLENSY SAC
20
DIGLENSY SAC
Unidades de diseño.
Entidad: La entidad, nos sirve para relacionar nuestro diseño con el mundo exterior,
es decir, analizamos lo que tratamos de crear como una "caja negra", de la que sólo
conocemos sus entradas, salidas y la disposición de las mismas.
Sintaxis:
entity identificador is
[genéricos]
[puertos]
end [identificador];
21
DIGLENSY SAC
Sólo para fines de simulación todo puerto puede tener un valor por defecto que
determina el valor inicial de la señal, los puertos de entrada pueden dejarse
desconectados si tienen un valor por defecto.
Sintaxis:
architecture nombre of entidad is
- - Zona de declaración
begin
sentencias concurrentes;
sentencias concurrentes;
sentencias concurrentes;
end nombre;
Para describir una arquitectura podemos utilizar tres estilos, teniendo cada uno su
propio nivel de abstracción:
- Estilo algorítmico (behavioral)
- Estilo flujo de datos (dataflow)
- Estilo estructural (structure)
22
DIGLENSY SAC
- Las señales a ambos lados del operador de asignación (<=) deben ser del mismo
tipo.
- Si hay varias asignaciones a la misma señal en un mismo proceso, prevalece el
valor de la última asignación.
- Las asignaciones a señales pueden aparecer en sentencias concurrentes (estilo
flujo de datos) o sentencias secuenciales (estilo algorítmico).
Indica que el tipo bit sólo puede tomar los valores: '0' y '1'. Este es un tipo básico y con
el ya podemos crear pue rtos y nodos internos para interconectar los circuitos digitales.
Pero hay un inconveniente: este tipo no permite implementar componentes cuya salida
pueda tomar un valor de alta impedancia (Z), no se pueden realizar operaciones
aritméticas (sólo lógicas) ya que no hay implementadas funciones para tal fin con este
tipo y tampoco pueden unirse más de una señal sobre salidas de varios circuitos
porque el tipo bit tampoco tiene asociado una función que permita resolver las
múltiples asignaciones a un mismo objeto. Por esta razón es preferible utilizar el tipo
de dato std_logic que se encuentra en el paquete STD_LOGIC_1164 de la biblioteca
IEEE. El tipo std_logic es un tipo de dato multivaluado como se muestra en parte de la
descripción del paquete:
23
DIGLENSY SAC
El tipo de dato utilizado por lo general std_logic (que es un sub-tipo del tipo std_ulogic)
por las ventajas que hemos mencionado en el párrafo anterior. Para poder utilizar este
tipo de dato en el programa VHDL debemos declarar previamente en que paquete se
encuentra y a que biblioteca pertenece el paquete, para esto utilizamos las siguientes
sentencias:
Con ello tenemos la posibilidad de utilizar todos los elementos que se encuentran
declarados en los paquetes: STD_LOGIC_1164, STD_LOGIC_ARITH y
STD_LOGIC_UNSIGNED. En el paquete STD_LOGIC_1164 encontramos la
declaración de tipos y subtipos de datos, funciones de conversión de un tipo a otro. En
el paquete STD_LOGIC_ARITH encontramos funciones aritméticas, lógicas y de
relación que se puede utilizar entre los objetos declarados con tipos de datos
STD_LOGIC ó STD_LOGIC_VECTOR. El paquete STD_LOGIC_UNSIGNED
complementa al paquete STD_LOGIC_ARITH con operaciones aritméticas sin tener en
cuenta los bits de signo.
24
DIGLENSY SAC
Estas sentencias terminan asignando un valor a una señal después de evaluar toda
una expresión, esta evaluación se realiza cuando ocurre un evento en una de las
señales que se encuentran a la derecha del símbolo de asignación a señal (<=).
En la declaración anterior se nota que hay una prioridad en la asignación a señal, por
ejemplo para que la señal tome el resultado de la expresión3 debe cumplirse que la
condición1 y condición2 sean falsas y la condición3 sea verdadera. La prioridad la
tiene la condición1, si esta no se cumple se pasa a evaluar la condición2, si esta no se
25
DIGLENSY SAC
Hay que aclarar que siempre se termina evaluando una expresión y asignando la
respuesta a la señal así no se cumpla ninguna condición.
26
DIGLENSY SAC
Esta sentencia requiere que se especifique todos los posibles valores que puede tomar
la expresión a evaluar, por lo que generalmente la sentencia se escribe de la siguiente
manera:
Con la palabra others se está cubriendo el resto de valores que no han sido
especificados en la sentencia. Veamos algunos ejemplos:
- compuerta AND:
27
DIGLENSY SAC
• Procesos sin lista de sensibilidad (cuyo cuerpo debe contener sentencias wait).
- Se ejecuta (en tiempo de simulación 0) hasta que se encuentre una sentencia
wait
- El proceso se suspende y se realizan las asignaciones a señales.
- El proceso se vuelve a activar cuando la condición de espera se satisfaga.
- Cuando la ejecución alcanza el final del cuerpo del proceso, se continúa
ejecutando el código por el inicio.
- Un proceso sin lista de sensibilidad que no contenga sentencias wait, bloquea
el simulador.
Sintaxis:
[etiqueta:] process
[declaraciones]
begin
[sentencias secuenciales;]
wait on lista de sensibilidad;
end process [etiqueta];
28
DIGLENSY SAC
En VHDL encontramos tres tipos de objetos: las señales, las variables y las
constante. Las señales y las variables pueden cambiar de valor, la diferencia entre
ellos está en el momento en que toman sus valores respectivos. Mientras que la
variable toma el valor en el momento en que es asignado, con la señal programamos el
valor que va a tomar en un futuro cercano. Por ejemplo:
Process
variable a: std_logic;
signal b: std_logic;
begin
a := ‘0’; -- a toma el valor de ‘0’.
b <= ‘0’; -- programamos para que b tome el valor de ‘0’.
.......
end process;
Las señales como ya hemos analizado tienen asignado un modelo de retardo, que en el
caso de un proceso la señal tomará el valor programado recién cuando el proceso se
suspenda.
Analicemos el siguiente caso, supongamos que se tiene una variable cuenta cuyo
último valor que tomó fue “1001”(9), entonces:
Process (clk)
Variable cuenta: std_logic_vector(3 downto 0);
begin
if clk=’1’ and clk’event then
cuenta := cuenta + 1;
if cuenta = 10 then
cuenta := “0000”;
end if;
end if;
salida <= cuenta;
end process;
Analicemos el segundo caso, supongamos que se tiene una señal cuenta cuyo último
valor que tomó fue “1001” (9), entonces:
29
DIGLENSY SAC
Process(clk)
begin
if clk=’1’ and clk’event then
cuenta <= cuenta + 1;
if cuenta = 10 then
cuenta <= “0000”;
end if;
end if;
end process;
Cuando ocurra un flanco de subida cuenta vale 9 y se programa para que tome
el valor de 10, cuando se pregunta si cuenta llegó a 10 no satisface la condición por lo
que cuenta no se borra pasando a suspenderse el proceso y recién cuenta toma el valor
de 10. Cuando ocurra el siguiente flanco de subida cuenta vale 10 y se programa para
que tome el valor de 11, pero la condición cuenta = 10 ya se cumple por lo que se
realiza otra programación a cuenta para que tome el valor de 0. En un proceso se
puede tener más de una asignación a una misma señal, si esto ocurre la última
asignación es la que quedará finalmente.
If condición then
conjunto de sentencia;
[elsif condición2 then]
conjuntp de sentencia;
[else]
conjunto de sentencia;
end if ;
Process(A,B,SEL)
begin
if SEL = ‘0’ then
Z <= A ;
30
DIGLENSY SAC
else
Z <= B;
end if ;
end process ;
- en el siguiente circuito:
Process(A,B,C,X,Y,Z)
begin
if Z =’1’ then
F <= A;
elsif Y = ‘1’ then
F <= B;
elsif X=’1’ then
F <= C;
end if ;
end process ;
- decodificador de 3 a 8;
31
DIGLENSY SAC
- decodificador de 3 a 8;
ENTRADA <= C & B & A;
Process(ENTRADA,ENA)
begin
If ENA=’1’ then
case ENTRADA is
when “000” => Y <= “11111110”;
when “001” => Y <= “11111101”;
when “010” => Y <= “11111011”;
when “011” => Y <= “11110111”;
when “100” => Y <= “11101111”;
when “101” => Y <= “11011111”;
when “110” => Y <= “10111111”;
when others => Y <= “01111111”;
end case;
else
Y <= “11111111”;
end if ;
end process ;
32
DIGLENSY SAC
La sentencia CASE requiere que todos los posibles valores que pueda tomar la
expresión OP sean especificados, por esta razón la última condición es la palabra
OTHERS.
La presencia de los corchetes indican que su uso es opcional, por lo que se podría
construir un bucle infinito de la siguiente manera:
loop
Conjunto de sentencias;
end loop;
Se recomienda evitar el uso de este tipo de construcciones, ya que esto implicaría que
tengamos que utilizar en el interior del bucle la sentencia wait.
33
DIGLENSY SAC
En el ciclo for se evalúa cada una de las entradas de DATA e incrementa la variable
CUENTA cuando una de las entradas sea ‘1’. Al realizar la asignación a una variable
aseguramos que dicha asignación se realice de manera inmediata.
Library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity mux8a1 is
34
DIGLENSY SAC
En este ejemplo el bucle for está formado por una asignación a señal que sólo será
evaluado una sola vez, con esto aseguramos una correcta implementación del circuito.
Process(A,B)
begin
If A=’1’ then
Q <= B;
else
Q <= ‘0’;
end if;
end process;
Process(A,B)
begin
if A=’1’ then
Q <= B;
End if;
End process;
35
DIGLENSY SAC
Es importante notar que las dos entradas del circuito están presentes en la lista
sensible, esto hará que cualquier cambio en A ó B hará que todo el proceso se dispare.
Process(A)
begin
if A=’1’ then
Q <= B;
End if;
End process;
Library ieee;
Use ieee.std_logic_1164.all;
Use ieee.std_logic_arith.all;
Use ieee.std_logic_unsigned.all;
Entity ff_d is
Port ( D: in std_logic;
Clk: in std_logic;
Q: out std_logic);
End ff_d;
36
DIGLENSY SAC
37
DIGLENSY SAC
Library ieee;
Use ieee.std_logic_1164.all;
Use ieee.std_logic_arith.all;
Use ieee.std_logic_unsigned.all;
Entity contador is
Port ( clk: in std_logic;
q: buffer std_logic_vector (3 downto 0));
End contador;
Architecture of algoritmo of contador is
Begin
Process(clk)
begin
if clk=’1’ and clk’event then
q <= q + 1;
end if;
end process;
end algoritmo;
Library ieee;
Use ieee.std_logic_1164.all;
Use ieee.std_logic_arith.all;
Use ieee.std_logic_unsigned.all;
Entity contador is
Port (clk: in std_logic;
clear: in std_logic;
up: in std_logic;
ena : out std_logic_vector( 0 to 3);
display : out std_logic_vector(0 to 6));
End contador;
Architecture algoritmo of contador is
signal conta: std_logic_vector (0 to 3);
Begin
Process(clk,clear)
variable conta1: integer range 0 to 50000001;
Begin
If clear = '1' then
conta <= "0000";
elsif rising_ edge(clk) then
conta1:= conta1 +1;
if conta1 = 50000000 then
conta1:= 0;
if up='1' then
38
DIGLENSY SAC
Donde:
EP: estado presente.
ES: estado siguiente y se determina con las entradas y el estado presente.
La salida puede depender de la entrada y el estado presente (MEF de Mealy) ó
sólo puede depender del estado presente (MEF de Moore).
39
DIGLENSY SAC
La señal de RESET es importante por que de esta manera forzamos a que la máquina
inicie en un estado conocido.
Hay varias formas de implementar una máquina de estado, la más utilizadas son:
MEF de Mealy: utilizando dos procesos, uno que dependa de la señal de reloj y que se
encargue de actualizar el estado presente.
Process(clk, reset)
Begin
If reset=’1’ then
EP <= S0;
elsif clk=’1’ and ck’event then
EP <= ES;
end if;
end process;
el segundo proceso se encargará de determinar el estado siguiente con los cambios que
se produzcan en las entradas y en el estado presente, también actualizará las salidas
ante las variaciones de la entrada en un determinado estado.
Process(entradas,EP)
begin
ES <= EP;
Case EP is
When S0=> - - operaciones a realizar en el estado S0.
- - actualizar el estado siguiente.
- - actualizar las salidas.
Process(clk, reset)
Begin
If reset=’1’ then
EP <= S0;
elsif clk=’1’ and ck’event then
case EP is
when S0 => - - operaciones a realizar en el estado
S0.
- - definir el nuevo estado actual
40
DIGLENSY SAC
- - actualizar la salida.
when S1 => - - operaciones a realizar en el estado
S1.
- - definir el nuevo estado actual
- - actualizar la salida.
Aunque también podemos utilizar dos procesos para implementar una máquina de
estado de Moore, veamos el siguiente ejemplo:
library ieee;
41
DIGLENSY SAC
use ieee.std_logic_1164.all;
entity detector is
port(Data : in std_logic;
clk : in std_logic;
z : out std_logic);
end detector;
combi: process(ep,Data)
begin
es <= ep;
case ep is
when S0 => z <='0'; if Data='0' then es<=S1; end if;
when S1 => z <='0'; if Data='1' then es<=S2; end if;
when S2 => z <='0'; if Data='0' then es <= S1;
else es <= S3;
end if;
when S3 => z <='0'; if Data='0' then es <= S4;
else es <= S0;
end if;
when S4 => z <='0'; if Data='0' then es <= S1;
else es <= S5;
end if;
when S5 => z <='1'; if Data='0' then es <= S1;
else es <= S3;
end if;
end case;
end process combi;
end moore;
42
DIGLENSY SAC
Motor B
El diagrama de estado utilizando la ME de Moore es:
Y=0
1
conta
Y=
=con
s0 s1 s2
0
ta =
ta+1
con
Y=0
Library Ieee;
Use ieee.std_logic_1164.all; conta=30
Use ieee.std_Logic_arith.all;
Use ieee.std_logic_unsigned.all;
Entity puerta Is
Port( y,clk :in std_logic;
motor,ena: out std_logic);
end puerta;
begin
ena<='1';
Process(Clk)
variable conta1: integer range 0 to 50000001;
begin
if rising_edge(clk) then
43
DIGLENSY SAC
EP<=ES;
conta1:= conta1 +1;
if conta1 = 50000000 then
conta1:= 0;
If EP=S2 then
conta<= conta+1;
elsif EP=S1 then
conta<=0;
end if;
end If;
end If;
end Process;
Process(y,EP)
begin
ES<=EP;
CASE EP IS
when S0=> motor<='0';
if y='0' then
ES<=S1;
Else
ES<=S0;
end If;
when S1=> motor<='1';
ES<=S2;
when S2=> motor<='1';
if y='0' then
ES<=S1;
elsif conta=29 then
ES<=S0;
Else ES<=S2;
end if;
end Case;
end process;
end maquina;
44
DIGLENSY SAC
6. ESTILO ESTRUCTURAL
Entity MUX2A1 Is
Port( A,B,SELEC:in STD_LOGIC;
Z:out STD_LOGIC);
end MUX2A1;
Architecture flujo of MUX2A1 Is
Begin
with selec select Z<= A when '0',
B when others;
end flujo;
45
DIGLENSY SAC
Entity esmux4a1 is
port(E:IN STD_LOGIC_VECTOR(3 DOWNTO 0 );
SELEC:IN STD_LOGIC_VECTOR(1 DOWNTO 0);
Z,ena:OUT STD_LOGIC);
END esmux4a1;
COMPONENT MUX2a1
port( a,b,selec:in STD_LOGIC;
z: out STD_LOGIC);
END COMPONENT;
BEGIN
ena<='1';
U0:MUX2a1 PORT MAP( E(0),E(1),SELEC(0),N1 );
U1:MUX2a1 PORT MAP( E(2),E(3),SELEC(0),N2 );
U2:MUX2a1 PORT MAP( N1,N2,SELEC(1),Z );
END ESTRUCTURAL;
Fin de Tutorial
46