Lenguaje de Descripción de
Hardware (HDL)
Curso de Diseño Digital
MSc Boris Medina
Universidad de Sucre – 2023
Lenguaje de descripción de hardware
• Lenguaje diseñado para describir sistemas electrónicos digitales.
• Surgió del programa VHSIC (Very High Speed Integrated Circuits) impulsado
por Departamento de Defensa
• De USA.
• VHDL (VHSIC HDL) fue estandarizado en 1987 por IEEE 1076-1987.
• Dicho estándar se conoce como IEEE Std
• Actualización en IEEE Std 1076-1993.
• HDL Permite describir la estructura del diseño y declarar las entidades que
lo conforman.
• Permite simular el diseño y sintetizarlo en un encapsulado como un
microcircuito.
Ventajas HDL
▪ Puede ser utilizado en cualquier tipo de dispositivo programable o
tecnologia que soporte la densidad del diseño, sin necesidad de ser
reprogramado.
▪ Puede utilizar partes de un diseño (modulos) en otros, lo que permite
la reutilizacion de codigo.
▪ Puede verificarse el funcionamiento del sistema sin necesidad de
implementar el circuito.
▪ En sistemas complejos, una descripción realizada en HDL puede ser
más fácil de leer y comprender que los circuitos esquemáticos.
▪ Al estar basado en un estándar, toda la industria de diseño pueden
usar este lenguaje para minimizar errores de comunicación y
problemas de compatibilidad.
Algunos lenguajes HDL
•VHDL: Se usa para describir todo tipo de hardware, desde un ASIC, hasta un
FPGA o CPLD. Actualmente está definido como estándar por la IEEE.
Actualmente es uno de los más empleados para el desarrollo de chips.
•Verilog: Lenguaje introducido por Phil Moorby en 1985, que emplea una
sintaxis inspirada en C. Usa la mayoría de palabras reservadas de C. Al igual que
VHDL, se puede usar para desarrollar, sintetizar y simular todo tipo de
hardware. No es de código abierto, aunque su fabricante (Cadence) decidió
convertirlo en estándar abierto más tarde, debido al éxito de VHDL.
•Chisel: (Constructing Hardware in a Scala Embedded Language). Lenguaje de
código abierto, creado por la Universidad de Berkeley, y está orientado a
objetos. Los descripciones de hardware se pueden convertir a Verilog para su
síntesis y simulación. Su programación es mucho mas rápida y necesita hasta 5
veces menos código que otros HDL.
Unidades de descripción Entidad
Librerias
lista de ficheros cuyos
elementos require el sistema
Modos declaracion puertos:
In: entrada
Entidad Out: salida
define la vista externa Inout: bidireccional
del modelo Bufer: realimentado
El tipo de datos es el
Arquitectura posible valor que pueden
define la funcionalidad tener los datos y los
del modelo objetos.
Tipos de datos
Objeto
Senales Constantes Variables
Dato
Escalar Compuesto
Tipos de datos
Objeto
Senales Constantes Variables
Tipos de datos
Dato
Escalar Compuesto
TYPE <identificador> is <definición_tipo>
TYPE identificador is range literal to/downto literal
Ejemplo:
TYPE integer IS RANGE 5.0 DOWNTO 0.0;
TYPE real IS RANGE -1.0E38 TO 1.0E38;
Tipos de datos
Dato
TYPE identificador is array (rango {, ...}) of tipo_objetos; Escalar Compuesto
Ejemplo:
TYPE Byte is array (7 downto 0) of bit;
TYPE Memoria is array (0 to 7, 0 to 63) of bit;
Operadores
Aritméticos Relacionales Lógicos
Tipos de datos
Objeto Dato
Senales Constantes Variables Ficheros Escalar Compuesto
Entero Array
Real
Tipos de datos
Objeto Dato
Senales Constantes Variables Ficheros Escalar Compuesto
Entero Array
Real
Arquitectura de la entidad
Forma general:
Architecture Descripcion_Entidad of nombre_archivo is
Modelo comportamental
begin
C<= A and B;
end nombre_archivo;
La arquitectura define el funcionamiento de la entidad e indica Modelo estructural
cómo están funcionando de manera interna en el circuito, los
procedimientos, las funciones o las señales.
A cada ENTIDAD le corresponde al menos una descripción
(comportamental, estructural o de flujo de datos)
Modelo Flujo de datos
Arquitectura de la entidad
Comportamental:
Ejemplo:
ENTITY c_and IS
PORT (e1, e2: IN BIT; sal: OUT BIT);
END c_and; a
sal
ARCHITECTURE funcionAnd OF c_and IS b
BEGIN
PROCESS (e1, e2)
BEGIN sal <= e1 AND e2;
END PROCESS;
END funcionAnd;
Arquitectura de la entidad a s1
s2
b
F
c
Comportamental: a
d
b
F
c ARCHITECTURE funcionAnd OF c_and IS
d
--declaración de señales
SIGNAL s1, s2: BIT;
BEGIN
ENTITY c_and IS PROCESS (a,b)
PORT (a, b,c, d: IN BIT; z: OUT BIT); BEGIN
END c_and; s1<=a AND b;
END PROCESS;
ARCHITECTURE funcionAnd OF c_and IS PROCESS (s1,c)
BEGIN BEGIN
s2<=s1 AND c;
PROCESS (a, b, c, d)
END PROCESS;
BEGIN PROCESS (s2,d)
z <= a AND b AND c AND; BEGIN
END PROCESS; z<=s2 AND d;
END funcionAnd; END PROCESS;
END funcionAnd;
Arquitectura de la entidad
Estructural:
Se declaran los bloques componentes del circuito y se realizan las
interconexiones. Los componentes del dispositivo habrán sido descritos
en otro diseño VHDL previamente compilado.
Ejemplo:
entity EjemploAND1 is
ARCHITECTURE funcionAnd OF EjemploAND1 IS port(a,b, c, d: in BIT; z: out BIT);
--declaración de señales
signal s1, s2: BIT; end EjemploAND1;
--declaración de componentes
component cand is Definición Componentes
port (e1,e2: in Bit; sal: out bit); entity cand is
end component; port(e1,e2: in Bit; sal: out bit);
end cand;
--realizamos las conexiones
BEGIN -- Definicion Arquitectura
c1: cand PORT MAP (a,b,s1); ARCHITECTURE fAnd OF cand IS
c2: cand PORT MAP (s1,c,s2); BEGIN
c3: cand PORT MAP (s2,d,z); sal<= e1 and e2;
END funcionAnd; END fAnd;
Ejercicio
1. Implementar el circuito mostrado en la figura, en HDL,
mediante la arquitectura estructural, declarando cada
componente para luego realizar sus interconexiones.
Ejercicio:
Sentencias
IF:
Selecciona la ejecución de una sentencia dependiendo de
una o mas condiciones.
Ejemplo:
entity IF1 is
port (A,B,C: in STD_LOGIC; F: out STD_LOGIC);
end IF1;
architecture EjemploIF of IF1 is
begin
process (A,B,C)
begin
IF A='1' and B='0' and C='0' THEN
F<='1’;
ELSIF A='0' AND B='1' AND C='0' THEN
F<='1’;
ELSE
F<='0’;
END IF;
end process;
end EjemploIF;
Sentencias Forma 1:
WHEN: Función <= expresión_1 when condición_1 else
Se pueden hacer generaciones de sentencias condicionales. expresión _2 when condición_2 else
La falta de alguna condición en la sentencia genera un ...
expresión_m when condición_m else
elemento secuencial (se mantiene el valor de la señal).
expresión_n
Ejemplo 1: Mux 2:1
library IEEE;
Forma 2:
use ieee.std_logic_1164.all; with expresión select -- Se obtiene el valor
señal <= expresión_1 when valor1,
entity MUX2 is expresión_2 when valor2,
port (A0,A1,SEL: in STD_LOGIC; SAL: out STD_LOGIC); ...
end MUX2; (expresión_n when others;) --opcional
architecture MUX21 of MUX2 is
begin
SAL<=A1 WHEN (SEL='1’)
ELSE
A0;
end MUX21;
Forma 1:
Sentencias Función <= expresión_1 when condición_1 else
expresión _2 when condición_2 else
...
WHEN: expresión_m when condición_m else
expresión_n
Ejemplo 2: Mux 4:1
library IEEE; Forma 2:
use ieee.std_logic_1164.all;
with expresión select -- Se obtiene el valor
entity MUX4 is señal <= expresión_1 when valor1,
port expresión_2 when valor2,
(A0,A1,A2,A3 : in STD_LOGIC; ...
SEL : in STD_LOGIC_VECTOR(1 DOWNTO 0); (expresión_n when others;) --opcional
SAL : out STD_LOGIC);
end MUX4;
STD_LOGIC_VECTOR (0 to 2)
architecture MUX41 of MUX4 is
begin
SAL<=A0 WHEN (SEL="00") ELSE
A1 WHEN (SEL="01") ELSE
A2 WHEN (SEL="10") ELSE
A3; STD_LOGIC_VECTOR (3 downto 0)
end MUX41;
Sentencias Sintaxis:
CASE:
Ejemplo 2: Mux 4:1
entity MUX4 is
port
(A0,A1,A2,A3 : in STD_LOGIC;
SEL : in STD_LOGIC_VECTOR(1 DOWNTO 0);
SAL : out STD_LOGIC);
end MUX4;
architecture MUX41 of MUX4 is
begin
process (A0,A1,A2,A3,SEL)
begin
case SEL is
when "00" => SAL <= A0;
when "01" => SAL <= A1;
when "10" => SAL <= A2;
when "11" => SAL <= A3;
when others => SAL <= '0’;
end case;
end process;
end MUX41;
Sentencias Sintaxis:
CASE:
Ejemplo 2: Mux 4:1
entity MUX4 is
port
(A0,A1,A2,A3 : in STD_LOGIC;
SEL : in STD_LOGIC_VECTOR(1 DOWNTO 0);
SAL : out STD_LOGIC);
end MUX4;
architecture MUX41 of MUX4 is
begin
process (A0,A1,A2,A3,SEL)
begin
case SEL is
when "00" => SAL <= A0;
when "01" => SAL <= A1;
when "10" => SAL <= A2;
when "11" => SAL <= A3;
when others => SAL <= '0’;
end case;
end process;
end MUX41;
Circuitos Secuenciales:
Flip Flop D:
library ieee;
use ieee.std_logic_1164.all;
entity FFD is
port (D, clk: in std_logic; Q: out std_logic);
end FFD;
architecture FD of FFD is
begin
process (clk) reloj
begin
if rising_edge (clk) then
Q<=D;
end if;
end process;
end FD;
falling_edge Flanco descendente
rising_edge Flanco ascendente
Circuitos Secuenciales:
Flip Flop JK:
library ieee;
use ieee.std_logic_1164.all;
entity FFD is
port (J, K, clk: in std_logic; Q: out std_logic);
end FFD;
reloj
architecture FD of FFD is
signal qo: std_logic;
begin
process (clk)
begin
if rising_edge (clk) then
qo<=(J and not qo) or (not K and qo);
end if;
end process;
Q<=qo;
end FD;
Circuitos Secuenciales:
Flip Flop JK:
library ieee;
use ieee.std_logic_1164.all;
entity secuencia1 is
port (j0,j1, k0, k1, ck: in std_logic; Q0, Q1: out std_logic);
end secuencia1;
architecture conta of secuencia1 is
component FFJK is
Definicion del
port (J, K, clk: in std_logic; Q: out std_logic);
componente FFJK
end component;
begin
f1: FFJK port map (j0,k0,ck, Q0);
f2: FFJK port map (j1,k1,ck, Q1);
end conta;
Circuitos Secuenciales:
Flip Flop JK:
library ieee;
use ieee.std_logic_1164.all;
entity secuencia1 is
port (j0,j1, k0, k1, ck: in std_logic; Q0, Q1: out std_logic);
end secuencia1;
s1
architecture conta of secuencia1 is
signal s1: std_logic; --Definicion de senales
component FFJK is
port (J, K, clk: in std_logic; Q: out std_logic); Definicion del
end component; componente FFJK
begin
f1: FFJK port map (j0,k0,ck, s1);
f2: FFJK port map (j1,k1,s1, Q1);
Q0<=s1;
end conta;