Está en la página 1de 35

CIRCUITOS DIGITALES

VHDL

Henry Alfonso Romero Mestre


Universidad Distrital Francisco José de Cáldas
Facultad Tecnológica – Tecnología en Electrónica
Circuitos Digitales I – 4to Semestre
VHDL
Creado para
El diseño de hardware.
Implementar circuitos lógicos.
 Combinacionales
 Secuenciales
 CPU's (Unidad Central de Procesamiento)
 Manejar ficheros
 Retrasos en el tiempo
VHDL

– ELEMENTOS SINTÁCTICOS
COMENTARIOS
Empiezan por dos guiones “--” hasta el final de la línea
SÍMBOLOS ESPECIALES
 + - * / ( ) . , ; : & ’ ”<> | = #
 ** => := /= >= <= <> --

IDENTIFICADORES
 Se usan para dar nombre a los diferentes objetos del lenguaje.
Pueden ser cualquier nombre compuesto por letras y números,
incluyendo el símbolo de subrayado "_". Nunca puede contener
uno de los símbolos especiales, no puede empezar por un
número ni contener dos subrayados seguidos. Las mayúsculas y
minúsculas se consideran iguales. Tampoco puede coincidir con
una de las palabras reservadas del lenguaje (que tienen un
significado predefinido).
VHDL

– ELEMENTOS SINTÁCTICOS
NÚMEROS: Se considera que están en base 10. Se admite la
notación científica para números en coma flotante. Es
posible escribir números en otras bases utilizando el símbolo
#. Así, 2#11000100# es un número en base 2, 16#c4# en
hexadecimal
CARACTERES: Cualquier letra o número entre comillas
simples: '2', 't'.
CADENAS: Conjunto de caracteres en comillas dobles:
"hola"
VHDL

– ELEMENTOS SINTÁCTICOS
CADENAS DE BITS: los bits son en realidad caracteres, y es
posible formar con ellos cadenas y representar números.
"1110100", O"126", X"FE"; el primero es binario, el segundo
octal, indicado por la O delante de la cadena, el último es
hexadecimal, indicado por la X delante de la cadena.

PALABRAS RESERVADAS. Son aquellas que tienen un


significado especial en VHDL
VHDL

– ELEMENTOS SINTÁCTICOS
OPERADORES.
& concatenación. Concatena cadenas: así "110" & "001"
representa "110001".
** exponencial 4**2 representa 4 al cuadrado
<= := de asignación, el primero para señales, el segundo para
constantes y variables.
ABS() valor absoluto
* multiplicación
/ división
MOD (módulo)
REM (resto)
VHDL

– ELEMENTOS SINTÁCTICOS
OPERADORES.
SLL, SRL Desplaza un vector de bits un número de bits a la
izquierda o a la derecha, rellenando con ceros los huecos
libres
SLA, SRA Como el anterior pero el desplazamiento conserva
el signo, el valor del bit más significativo.
ROL, ROR rotación a izquierda o a derecha. Como un
desplazamiento, pero los huecos que se forman son ocupados
por los bits que van saliendo.
VHDL

– ELEMENTOS SINTÁCTICOS
OPERADORES.
=, /= igualdad o desigualdad
<, <=, >, >= menor, menor o igual, mayor, mayor o igual
Not, and, nand, or, nor, xor, xnor.
TIPOS DE DATOS.
Tipos escalares
 Enteros: Se definen incluyendo el rango.
 type index is range 7 downto 1;
 type integer is range –2147483648 to 2147483647; -- tipo predefinido
VHDL

– ELEMENTOS SINTÁCTICOS
TIPOS DE DATOS.
Reales (coma flotante): Se deben definir también en un rango,
pero con límites reales.
Físicos: Datos que trabajan con magnitudes físicas, es decir,
con valor y unidades. Hay un tipo predefinido en VHDL que es
el tiempo, time.
Enumerados: Pueden tomar cualquier valor en una lista.
type bit is ('0','1'); --Predefinido
type boolean is (FALSE, TRUE); -- Predefinido
VHDL

– ELEMENTOS SINTÁCTICOS
TIPOS DE DATOS.
Enumerados: El estandar IEEE 1164 define un tipo enumerado
adicional, std_logic, y varios subtipos. type std_logic is ('U', --
Sin inicializar
'X', -- Fuerza a desconocido
'0', -- fuerza a 0
'1', -- fuerza a 1
'Z', -- Alta impedancia
'W', -- Desconocido débil
'L', -- 0 débil
'H', -- 1 débil
'-', -- no importa
);
std_logic_1164 de la librería ieee.
VHDL

– ELEMENTOS SINTÁCTICOS
TIPOS DE DATOS.
TIPOS COMPUESTOS.
Están compuestos por tipos escalares.
Matrices: Colección de elementos a los que se accede mediante
un índice.
type word is array(31 downto 0) of bit;
signal b: word;
A los elementos de una matriz se accede mediante los índices.
Si dato es una señal de tipo word, dato(3) es el elemento 3 de
dato, dato(29 downto 25) es una parte del array.
VHDL – ELEMENTOS SINTÁCTICOS
TIPOS DE DATOS.
TIPOS COMPUESTOS.
Existen algunos tipos predefinidos.
type bit_vector is array (natural range <>) of bit;
type std_logic_vector is array (natural range <>) of std_logic;
que nos permiten definir señales como:
signal a: std_logic_vector(3 downto 0);
VHDL

– ELEMENTOS SINTÁCTICOS
REGISTROS – Subtipos:
Es posible la definición de subtipos como subconjuntos de
tipos existentes.
subtype raro is integer range 4 to 7;
subtype id is string(1 to 20);
ATRIBUTOS: Los elementos en VHDL pueden tener
información adicional basada en atributos. Estos atributos
están asociados a ciertos elementos del lenguaje y se manejan
mediante la comilla simple '.
VHDL – ELEMENTOS SINTÁCTICOS
ATRIBUTOS
Por ejemplo, si t es una señal de un tipo enumerado,
entero, flotante o físico, se tienen los
siguientes atributos:
t'left límite izquierdo del tipo left
t'right
t'low menor de los valores en t
t'high
t'length da el número de elementos de t.
VHDL – ELEMENTOS SINTÁCTICOS
ATRIBUTOS
Un atributo importante es 'event. Da un valor
booleano verdadero si acaba de ocurrir un cambio
en la señal. Se usa especialmente con señales que
sean de reloj:
clk'event
Otro atributo que aparece con frecuencia es
'range. Da el rango de un objeto limitado. Por
ejemplo, si definimos
signal word: std_logic_vector(15 downto 0);
entonces word'range es 15 downto 0
VHDL – ELEMENTOS SINTÁCTICOS
SEÑALES, CONSTANTES Y VARIABLES.
CONSTANTES.
Una constante es un elemento que se inicializa a un
determinado valor que no puede ser cambiado:
constant indice: integer:=5;
constant max_size: integer;
En el segundo caso max_size no tiene ningún valor asociado.
Esto se permite siempre y cuando el valor sea declarado en
algún otro sitio.
VHDL – ELEMENTOS SINTÁCTICOS
SEÑALES, CONSTANTES Y VARIABLES.
VARIABLES.
Su valor puede ser alterado en cualquier instante. Es posible
asignarle un valor inicial:
variable contador: natural:=0;
variable aux: bit_vector(31 downto 0);
Las variables sólo tiene sentido en bloques donde la
ejecución es en serie: subprogramas y procesos (process).
VHDL – ELEMENTOS SINTÁCTICOS
SEÑALES.
La señal no es un objeto del lenguaje que guarda un valor,
sino que lo que hace es guardar un valor y hacerlo visible en
el momento adecuado. Esto es, se puede decir que la señal
tiene dos partes, una donde ese escribe y que almacena el
valor, y otra que se lee y que no tiene por qué coincidir con lo
que se acaba de escribir.
Las asignaciones de señales se realizan con el operador "<=",
mientras que las de constantes y variables utilizan el
operador ":=".
Estructura básica
Un sistema digital en VHDL consiste en el diseño de una
entidad
 entity declaration: define las
entradas y salidas de la
entidad.
 architectural body: contiene
la descripción de la entidad
(lo que hace o contiene),
interconección de
componentes y otras
entidades, procesos, etc.
Entity declaration
entity NAME_OF_ENTITY is
[ generic generic_declarations);]
port (signal_names: mode type;
signal_names: mode type;
:
signal_names: mode type);
end [NAME_OF_ENTITY] ;
Architecture body
architecture architecture_name of NAME_OF_ENTITY is
-- Declarations
-- components declarations
-- signal declarations
-- constant declarations
-- function declarations
-- procedure declarations
-- type declarations
:
begin
-- Declaraciones
:
end architecture_name;
EJEMPLO
library ieee;
use ieee.std_logic_1164.all;
entity MUX2to1_a is port(
A, B: in std_logic;
Sel: in std_logic;
Y: out std_logic);
end MUX2to1_a;
architecture behavior of MUX2to1_a is
begin
Y<= ( B and Sel ) or
( A and not(Sel) );
end behavior;
PUERTOS - MODOS
Los puertos de las entidades se definen con un modo.
Los modos pueden ser de 4 clases: in, out, buffer,
inout:
- in. Entrada a la entidad.
- out. Salidas de la entidad. Este tipo de puertos no se
considera legible dentro de la entidad (por ejemplo, no
puede aparecer a la derecha en una asignación)
- buffer. Es como el modo out, pero es legible dentro de
la entidad. Dicho de otro modo, permite la
realimentación de la señal en la arquitectura.
- inout. Para señales bidireccionales, se tiene que
declarar el puerto como inout, que permite que se pueda
escribir o leer desde el exterior.
PUERTOS - TIPOS
Conviene también fijarse es la definición de un vector de tipo
std_logic. Por ejemplo, A se define como un
std_logic_vector(3 downto 0). Hay que tener en cuenta que
en este caso, el bit más a la izquierda corresponde al de índice
3, mientras que si se hubiese definido como
std_logic_vector(0 to 3), sería el de índice 0. Esto es
importante, puesto que en operaciones aritméticas con
cadenas de bits, el bit más a la izquierda es el más
significativo.
FORMAS DE DESCRIPCIÓN
DESCRIPCIÓN DE FLUJO DE DATOS O RTL.

DESCRIPCIÓN COMPORTAMENTAL O
ALGORÍTMICA.

DESCRIPCIÓN ESTRUCTURAL.
Descripción mediante flujos de
datos architecture archBCD_9 of BCD_9 is
when ... else begin
Se trata de una estructura Y<="0000000001" when A="0000" else
"0000000010" when A="0001" else
concurrente. Veamos el ejemplo
"0000000100" when A="0010" else
de un decodificador BCD a 10 "0000001000" when A="0011" else
líneas: "0000010000" when A="0100" else
"0000100000" when A="0101" else
library ieee; "0001000000" when A="0110" else
use ieee.std_logic_1164.all; "0010000000" when A="0111" else
entity BCD_9 is port( "0100000000" when A="1000" else
A: in std_logic_vector(3 downto 0); "1000000000" when A="1001" else
Y: out std_logic_vector(9 downto 0)); "0000000000";
end BCD_9; end archBCD_9;
Descripción mediante flujos de
datos
-- Incorrecto
library ieee;
use ieee.std_logic_1164.all; Y<="1111111110" when A="0000" else
"1111111101" when A="0001" else
entity BCD_9 is port( "1111111011" when A="0010" else
A: in std_logic_vector(3 downto 0); "1111110111" when A="0011" else
Y: out std_logic_vector(9 downto 0)); "1111101111" when A="0100" else
end BCD_9; "1111011111" when A="0101" else
architecture archBCD_9 of BCD_9 is "1110111111" when A="0110" else
begin "1101111111" when A="0111" else
Y<="0000000001" when A="0000" else "1011111111" when A="1000" else
"0000000010" when A="0001" else "0111111111" when A="1001" else
"0000000100" when A="0010" else "1111111111";
"0000001000" when A="0011" else end archBCD_9;
"0000010000" when A="0100" else
"0000100000" when A="0101" else qué ocurre cuando los dos
"0001000000" when A="0110" else decodificadores
"0010000000" when A="0111" else
"0100000000" when A="1000" else manden señales distintas a las
"1000000000" when A="1001" else salidas? Esta incompatibilidad
"0000000000"; impide la compilación
Descripción mediante flujos de datos
with ... select ... When architecture archBCD_9 of BCD_9 is
begin
library ieee; with A select
use ieee.std_logic_1164.all; Y<="0000000001" when "0000",
entity BCD_9 is port( "0000000010" when "0001",
A: in std_logic_vector(3 downto 0); "0000000100" when "0010",
Y: out std_logic_vector(9 downto 0)); "0000001000" when "0011",
end BCD_9; "0000010000" when "0100",
"0000100000" when "0101",
"0001000000" when "0110",
"0010000000" when "0111",
"0100000000" when "1000",
"1000000000" when "1001",
"0000000000" when others;
end archBCD_9;
Descripción comportamental algorítmica
Se trata de partes del process: if ... then
library ieee;
programa con una
use ieee.std_logic_1164.all;
ejecución en serie, entity and3 is port(
definidos dentro de a,b,c: in std_logic;
unidades que y: out std_logic);
comienzan con la end and3; Identificador
architecture archand3 of and3 is
palabra clave process.
begin
En un mismo programa p1: process (a,b,c)
puede haber múltiples begin
bloques process. Cada if (a='1' and b='1' and c='1') then y<='1';
else y<='0';
uno de ellos equivale a
end if; Lista Sensible
una instrucción end process;
concurrente end archand3;
Descripción comportamental algorítmica
Ejemplo: library ieee;
use ieee.std_logic_1164.all;
 Error de concurrencia entity and3 is port(
a,b,c: in std_logic;
y: out std_logic);
end and3;
architecture archand3 of and3 is
begin
p1: process (a,b,c)
begin
if (a='1' and b='1' and c='1') then
y<='1';
else y<='0';
end if;
end process;
y<= a or b or c;
end archand3;
Descripción comportamental algorítmica
Diferencias entre variables y señales.
Las señales no cambian su valor hasta que no acaba el proceso.
Las variables sólo se definen dentro del proceso.
cambian su valor en el momento en el que tienen una
asignación.

architecture ejemp1 of entidad is


architecture ejemp1 of entidad is
signal a,b,x,y: integer;
signal a,b,c,x,y: integer;
begin
begin
p1: process (a,b)
p1: process(a,b,c)
variable c: integer;
begin
begin
c<=a; -- se ignora
c:=a; -- Inmediata
x<=c+2;
x<=c+2;
c<=b;
c:=b; -- Inmediata
y<=c+2;
y<=c+2;
end process p1;
end process p1;
end ejemp1;
end ejemp1;
Descripción comportamental algorítmica
process: case .. when
 Se trata de una estructura de ejecución en serie. Es parecido al with ...
select, pero más general, puesto que en cada caso no sólo se puede hacer
una asignación, sino que después de cada "=>" puede escribirse una
sentencia o un conjunto de ellas.
architecture archmux4to1 of mux4to1 is
library ieee; begin
use ieee.std_logic_1164.all; p1: process (a,sel)
entity mux4to1 is port( begin
case sel is
a: in std_logic_vector(3 downto 0);
when "00" => y<=a(0);
sel: in std_logic_vector(1 downto when "01" => y<=a(1);
0); when "10" => y<=a(2);
y: out std_logic); when "11" => y<=a(3);
end mux4to1; when others => y<=a(0);
end case;
end process;
end archmux4to1;
Descripción comportamental algorítmica
bucles: process: for y while loop
Permiten realizar bucles dentro de procesos. También se ejecutan
en serie. architecture archcuatromux2to1 of
cuatromux2to1 is
type lineas is array (1 to 4) of std_logic_vector(1
-- cuatro multiplexores 2 a 1 downto 0);
-- controlados por la misma entrada signal dum: lineas;
begin
-- de seleccion p1: process (dum,sel)
library ieee; variable i: integer range 1 to 4;-- Al ser un indice
de un loop
use ieee.std_logic_1164.all; -- esta definicion es optativa
entity cuatromux2to1 is begin
for i in dum'range loop
port( y(i)<= (sel and dum(i)(1)) or (not(sel) and dum(i)
a: in std_logic_vector(7 downto 0); (0));
end loop;
sel: in std_logic; end process;
y: out std_logic_vector(1 to 4)); dum(1)<=a(1 downto 0);
dum(2)<=a(3 downto 2);
end cuatromux2to1; dum(3)<=a(5 downto 4);
dum(4)<=a(7 downto 6);
end archcuatromux2to1;
Descripción

estructural
Este tipo de descripción es cercano a una net-list de otras herramientas CAD. La
descripción estructural es especialmente interesante para la incorporación de
elementos de biblioteca al diseño y la realización de diseños jerárquicos a partir
de componentes. Consideremos dos entidades, and_de_3 y or_de_n:
library ieee;
use ieee.std_logic_1164.all;
library ieee; entity or_de_n is
generic(n: integer:=2);
use ieee.std_logic_1164.all; port(
entity and_de_3 is port( a: in std_logic_vector(n-1 downto 0);
a,b,c: in std_logic; y: out std_logic);
y: out std_logic); end or_de_n;
architecture archor_de_n of or_de_n is
end and_de_3;
begin
architecture archand_de_3 of and_de_3 is p1: process(a)
begin variable i: integer range 0 to n-1;
y<='1' when a='1' and b='1' and c='1' else variable res_parcial: std_logic;
begin
'0';
res_parcial:='0';
end archand_de_3; bucle:for i in 0 to n-1 loop
res_parcial:=res_parcial or a(i);
end loop bucle;
y<=res_parcial;
end process;
end archor_de_n;
Descripción estructural

También podría gustarte