Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Introducción A VHDL
Introducción A VHDL
VHDL
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.
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.