Introduccion VHDL
Introduccion VHDL
Introduccion VHDL
INTRODUCCIÓN A LA
PROGRAMACIÓN EN VHDL
1. Introducción:
VHDL es un lenguaje y como tal, posee sus tipos de datos y operadores. Los datos se
almacenan en objetos que contienen valores de un tipo dado.
2.1 Identificadores
- Constant. Los objetos de esta clase tienen un valor inicial que es asignado de
forma previa a la simulación y que no puede ser modificado durante ésta.
- Variable. Los objetos de esta clase contienen un único valor que puede ser
cambiado durante la simulación con una sentencia de asignación. Las variables
generalmente se utilizan como índices, principalmente en instrucciones de bucle, o
para tomar valores que permitan modelar componentes. Las variables NO
representan conexiones o estados de memoria.
- Signal. Los objetos de esta clase contienen una lista de valores que incluye el
valor actual y un conjunto de valores futuros. Las señales representan elementos de
memoria o conexiones y si pueden ser sintetizadas. Los puertos de una entidad son
implícitamente declarados como señales en el momento de la declaración, ya que
estos representan conexiones. También pueden ser declaradas en la arquitectura
antes del BEGIN, lo cual nos permite realizar conexiones entre diferentes módulos.
Laboratorio de Estructura de Computadores
VHDL permite utilizar datos predefinidos, así como otros definidos por el usuario.
BIT 0, 1
BIT_VECTOR (range)
BOOLEAN TRUE, FALSE
CHARACTER {ascii}
STRING {ascii}
SEVERITY_LEVEL {WARNING, ERROR, FALURE}
INTEGER range
NATURAL range
POSITIVE range
REAL range
TIME
( range: n_min TO n_max; n_max DOWNTO n_min)
STD_LOGIC Tipo predefinido en el estándar IEEE 1164. Este tipo representa una
lógica multivaluada de 9 valores. Además del ‘0’ lógico y el ‘1’ lógico, posee alta
impedancia ‘Z’, desconocido ‘X’ ó sin inicializar ‘U’ entre otros. (std_logic_vector, vector
de tipo std_logic).
2.2 Operadores
abs
*, /, mod, rem
+ (sig.), - (sig)
+, -, &
and, or, nand, nor, xor
:= asignación de valores a constantes y variables.
<= asignación de valores a señales.
3.1 Entidades
ENTITY
- Define externamente al circuito o subcircuito.
- Nombre y número de puertos, tipos de datos de entrada y salida.
- Tienes toda la información necesaria para conectar tu circuito a otros circuitos.
A
F Y
B
entity F is
port (A, B: in bit; Y out bit);
end F;
Los puertos pueden ser de entrada in, salida out, entrada-salida inout o un buffer;
se utilizará el modo inout cuando
Además, la entidad puede definir un valor genérico (GENERIC) que se utilizará
para declarar las propiedades y constantes del circuito, independientemente de cual sea la
arquitectura.
entity nombre is
generic (cte1: tipo := valor1; cte2: tipo:= valor 2; …);
port (entrada1, entrada2, … : in tipo;
salida1, salida2, …: out tipo;
puertoi : modo tipo);
end nombre;
Laboratorio de Estructura de Computadores
3.2 Arquitecturas
ARCHITECTURE
- Define internamente el circuito.
- Señales internas, funciones, procedimientos, constantes …
- La descripción de la arquitectura puede ser estructural o por comportamiento.
begin
-- código de descripción
-- instrucciones concurrentes
-- ecuaciones booleanes
process
begin
-- código de descripción
end process;
end arch_name;
- Descripción estructural:
Esta descripción utiliza entidades descritas y compiladas previamente. Se declaran los
componentes que se utilizan y después, mediante los nombres de los nodos, se realizan las
conexiones entre las compuertas. Las descripciones estructurales son útiles cuando se trata
de diseños jerárquicos.
Una descripción estructural:
• Describe las interconexiones entre distintos módulos.
• Estos módulos pueden a su vez tener un modelo estructural o de
comportamiento.
• Normalmente esta es una descripción a más alto nivel.
Laboratorio de Estructura de Computadores
entity entity_name is
port(…);
end entity_name;
---------------------------------
component comp
port( x: in bit; y: out bit);
end component comp
…
signal a, b: bit_vector(0 to 7)
…
gen: for i in 0 to 7 generate
u: comp port map(a(i),b(i));
end generate gen;
entity entity_name is
port(…);
end entity_name;
wait on signal_list;
wait for time_expression;
wait until condition;
Eventos sobre las señales (‘EVENT) nos indican cuando ocurre un cambio en la señal
signal'event
signal'last_event
signal'last_value
Laboratorio de Estructura de Computadores
if condición then
... --sequential statements
elsif otra_condición then
... --sequential statements
else
... --sequential statements
end if;
case expresión is
when alternativa_l => ... --seq. statements
…
when alternativa_n => ... --seq. statements
when others => ... --seq. statements
end case;
WHEN – ELSE
3.4 Ejemplos
MULTIPLEXOR 2x1:
Un multiplexor 2x1 se correspondería con el siguiente módulo visto desde fuera:
entity mux2 is
port (D0, D1, S0: in std_logic; O out std_logic);
end mux2;
S0 O
0 D0
1 D1
Ó a esta otra:
Ambos casos representan una lógica secuencial que cambia con el flanco de subida.
Así pues si se quiere representar un biestable deberíamos añadir el siguiente
process:
process (clock)
begin
if (clock = '1') then out1 <= in1;
end if;
end process
Biestable tipo D con reset asíncrono. El proceso se activa cuando hay eventos en las
señales de reset o clock como indica su lista de sensibilidad. La primera sentencia del
proceso comprueba si la señal de reset está a 1. Si esta señal se ha activado el biestable se
pone a cero. Si no se ha activado, el proceso funciona como el proceso descrito
anteriormente.
registro
E SIG_ESTADO ESTADO O
F G
CLK
E=1
E=0
S1 E=0 S2 E=0 S3 S4
O=0 O=0 O=0 E=1 O=1
E=1
E=1
E=0
Laboratorio de Estructura de Computadores
library IEEE;
use IEEE.std_logic_1164.all;
entity FSM is
port(reset, E, clk: in bit; O: out bit);
end FSM;
SINCRONO: process(clk,reset)
begin
if reset ='1' then
ESTADO<=S1;
elsif clk'event and clk='1' then
ESTADO<= SIG_ESTADO;
end if;
end process SINCRONO;
CONTROL: process(ESTADO,E)
begin
case ESTADO is
when S1 =>
O <= '0';
if (E='0') then
Laboratorio de Estructura de Computadores
SIG_ESTADO<=S2;
else
SIG_ESTADO<=S1;
end if;
when S2 =>
O <= '0';
if (E='0') then
SIG_ESTADO<=S3;
F
else
SIG_ESTADO<=S1;
end if;
when S3 =>
O <= '0'; G
if (E='0') then
SIG_ESTADO<=S3;
else
SIG_ESTADO<=S4;
end if;
when S4 =>
O <= '1';
if (E='0') then
SIG_ESTADO<=S2;
else
SIG_ESTADO<=S1;
end if;
end case;
end process control;
end ARCH;
Laboratorio de Estructura de Computadores
Este manual fue inicialmente creado para la asignatura de Diseño y Test de Circuitos Integrados II de la titulación de I. Electrónica