dispositivos lógicos programables y lenguaje vhdl
TRANSCRIPT
Dispositivos lógicos Programables
y Lenguaje VHDL
Preparado por: Jairo M. Vergara Ávila
(Diapositivas tomadas de varias fuentes de Internet)
VHDL
VHSIC Hardware Design Language
(VHSIC es acrónimo de ‘Very High Speed Integrated Circuits’)
Historia• El VHDL nace por iniciativa del Departamento de Defensa de
EE.UU. (comienzo de los 80)• En julio de 1983 tres compañías (Texas Instruments, IBM e
Internetics) reciben el encargo de desarrollarlo• La primera versión se publica en agosto de 1985• En 1986 se convierte en un estándar del IEEE (IEEE 1076-
1987)• Posteriormente, con el estándar IEEE 1164 se le añaden
nuevas características• El estándar 1076 debe ser revisado cada cinco años.
Actualmente rige el 1076-1993
Principales ventajas
• Estándar público• Independiente de la tecnología• Soporta diferentes metodologías de diseño• Independiente del sistema de diseño• Compatible
DEFINICIÓN:
VHDL es un lenguaje de descripción de circuitos electrónicos digitales que utiliza distintos niveles de abstracción.
El significado de las siglas VHDL es VHSIC (Very High Speed Integrated Circuits) Hardware Description Language.
Esto significa que VHDL permite acelerar el proceso de diseño.
Los circuitos descritos en VHDL pueden ser simulados utilizando herramientas de simulación para reproducir el funcionamiento del circuito. Además utilizando herramientas de síntesis se puede implementar dicho circuito en un dispositivo lógico programable o en un circuito integrado.
MODELAJE DE HARDWARE
Al describir cualquier dispositivo en VHDL, el diseñador debe definir tres elementos principales:
Librerías (LIBRARY). La librería estándar es siempre visible. Si se requieren utilizar otras librerías se deben importar.
La entidad (ENTITY). Especifica la interfaz del circuito. Describe la forma de interconectar un bloque con los demás (entradas, salidas)
La arquitectura (ARCHITECTURE). Es la descripción interna del circuito. Describe el comportamiento lógico del bloque
Entidad
Las entidades definen el Nombre de los puertos, el modo (entradas o salidas) y el tipo (integer, bit,…) de un circuito.
La declaración de las entidades es análoga al símbolo esquemático de lo que queremos implementar, el cual describe las conexiones del proyecto, es decir, si hay una entrada o puerto de 8 bits o dos salidas o puertos de 4 bits, etc.
Arquitectura Indica el tipo de procesamiento que se realiza con las señales
de entradas, (declarados en la entidad). En ella reside todo el funcionamiento del circuito.
Si la entidad es vista como una “caja negra”, para lo cual lo único importante son las entradas y salidas, entonces, la arquitectura es el conjunto de detalles interiores de la caja negra
La arquitectura presenta diferentes modelos, los cuales son:• - Algorítmico (funcional o comportamental ).• - Flujo de datos.• - Estructural.
COMPOSICIÓN DE UN MODELO
Ejemplo:Describir en VHDL, un circuito que multiplexe dos líneas(a y b) de un bit, a una sola línea de salida de un bit.
Modelo comportamental:Mux 2x1:
SOLUCION: ENTITY mux2 IS PORT ( a, b: IN BIT; selec: IN BIT; salida: OUT BIT); END mux2; ARCHITECTURE comportamental OF mux2 IS BEGIN PROCESS (a, b, selec) BEGIN IF (selec = ‘0’) THEN salida <= ‘a’; ELSE salida <= ‘b’; END IF; END PROCESS; END comportamental;
Un bloque PROCESS, se considera como una subrutina cuyas instrucciones se ejecutan secuencialmente cada vez que algunas de las señales de la lista sensible cambia. Esta lista sensible es una lista de señales que se suele poner junto a la palabra PROCESS, como en el ejemplo es (a, b, selec).
ENTITY mux2x1 ISPORT (a,b: in bit; selec: in bit; salida: out bit);END mux2x1;ARCHITECTURE mux OF mux2x1 ISBEGINSalida <= ((a and (not selec)) or (b and selec));END mux;
Flujo de datos:Mux 2x1:tabla característica:
SELEC SALIDA0 a1 b
Expresión de la salida:Salida = a(selec) + b(selec) Luego el programa en VHDL es:
ENTITY Mux2x1 ISPORT (a,b: IN bit; selec: IN bit; salida: OUT bit);END Mux2x1;--****************************ARCHITECTURE estructural OF Mux2x1 ISSIGNAL nosel, ax, bx : bit; COMPONENT and2 PORT (e1,e2: IN bit; y: OUT bit); END COMPONENT; COMPONENT or2 PORT(e1,e2: IN bit; y: OUT bit); END COMPONENT;
COMPONENT inv PORT(e: IN bit; y: OUT bit); END COMPONENT;
BEGIN u0: inv PORT MAP (e=>selec, y=>nosel); u1: and2 PORT MAP (e1=>a, e2=>nosel, y=>ax); u2: and2 PORT MAP (e1=>b, e2=>sel, y=>bx); u3: or2 PORT (e1=>ax, e2=>bx,y=>salida);END estructural;
Estructural:Mux 2x1.
LOGICA SECUENCIALDescribir de forma comportamental, el funcionamiento de un Flip-flop tipo D, el cual posee una entrada de reset y es activo en alto.
entity ff is port(d,clk,clr: in bit; Q: out bit); end ff; architecture funcional of ff is begin process(clk,clr) begin if clr = '1' then
Q <='0'; elsif (clk'event and clk ='1') then
Q <= d; end if; end process; end architecture funcional;
Operadores predefinidos
• La manera más general de describir el comportamiento de una arquitectura es mediante sentencias tipo proceso
• Un proceso puede contener órdenes secuenciales, pero todos los procesos se ejecutan concurrentemente
• Las acciones descritas en el cuerpo del proceso se ejecutan en orden, de la primera a la última
• Cuando se ejecuta la última acción se dice que el proceso queda suspendido
• Cuando ocurre un cambio en una señal de la lista de sensibilidades el proceso se inicia de nuevo, volviendo a ejecutar las acciones de la primera a la última
PROCESO
PROCESO• Cada proceso se ejecuta una vez al comienzo de la simulación
para determinar el valor inicial de sus salidas• Algunas sentencias sólo pueden aparecer en un proceso
porque implican ejecución secuencial: estructural de ejecución secuencial
• Otras estructuras de ejecución secuencial:• – Sentencia de espera: wait• – Sentencia condicional: if...then...else• – Sentencia de selección: case• – Sentencia de bucles: for y while
count: process (x)variable cnt : integer := -1;begincnt:=cnt+1;end process;
Ejemplo de proceso• – Nombre del proceso• – Lista de sensibilidades• – Declaración de variable• – Inicialización de la variable• – La variable cnt se incrementa cada vez que se ejecuta el proceso• – Esto ocurre al comienzo de la simulación y cada vez que cambia la
señal x
Declaración de constantes, variables y señales
• Constantes: Es un elemento que se inicializa con un determinado valor y no puede ser cambiado una vez inicializado.
Ejemplo: Constant e: real:= 2.71828;
Constant retraso: time:=10 ms;
********************************************************************************************
• Variables: Es lo mismo que una constante con la diferencia de que se valor puede ser alterado en cualquier momento, a las variables también se les puede asignar un valor inicial.
Ejemplo: Variable contador : natural := 00;
Variable aux: bit_vector (31 downto 00);
**********************************************************************************************
• Señales: Las señales se declaran igual a las constantes y variables con la diferencia de que las señales pueden además ser de varios tipos: normal, register y bus, por defecto son de tipo normal, a las señales también se les puede asignar un valor inicial.
Ejemplo: Signal select: bit:= ‘0’;
Signal datos: bit_vector (7 downto 0) bus :=(“00000000”);
Diferencias entre señales y variables• Un bloque PROCESS es equivalente a una única instrucción concurrente
formada por numerosas instrucciones en series• En un bloque PROCESS las SEÑALES conservan su valor y no cambian hasta
que el bloque termine de ejecutarse, momento en el cual, ya tiene el valor que se les halla asignado durante la ejecución del proceso debido a que se encontrará en el siguiente paso de simulación. (es como si la señal tuviera un valor actual y otro valor en el estado siguiente
• Las variables son algo diferentes. Puesto que las variables toman su valor en el momento de la asignación, como ocurre en otros lenguajes de programación.
• Estas diferencias se ven el siguiente ejemplo:
-- Uso incorrecto de las señales
ARCHITECTURE ejemp1 OF cosa IS
SIGNAL a,b,c,x,y: integer;
BEGIN
p1: PROCESS(a,b,c)
BEGIN
c<=a; -- Se ignora
x<=c+2;
c<=b; -- Se mantiene
y<=c+2;
END PROCESS p1;
END ejemp1;
-- Uso correcto de las variables
ARCHITECTURE ejemp1 OF cosa ISSIGNAL a,b,x,y: integer;BEGINp1: PROCESS(a,b)VARIABLE c: integer;BEGINc:=a; -- Inmediatox<=c+2;c:=b; -- Inmediatoy<=c+2;END PROCESS p1;END ejemp1
Diferencias entre señales y variables
EJEMPLOS
DECODIFICADOR 3X8 CON HABILITACIONlibrary IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL; entity Deco3x8 is Port ( Entradas : in STD_LOGIC_VECTOR (2 downto 0); Habilitacion : in STD_LOGIC; Salidas : out STD_LOGIC_VECTOR (7 downto 0); end Deco3x8;architecture Decodificador of Deco3x8 isBeginHabilitar_deco: process(Entradas,Habilitacion) begin If (Habilitacion = '1') then case Entradas is
when "000" => Salidas <= "00000001"; when "001" => Salidas <= "00000010"; when "010" => Salidas <= "00000100"; when "011" => Salidas <= "00001000"; when "100" => Salidas <= "00010000"; when "101" => Salidas <= "00100000"; when "110" => Salidas <= "01000000"; when others => Salidas <= "10000000";
end case; else Salidas <= "00000000"; end if; end process Habilitar_deco;end Decodificador;
DECODIFICADOR DE 2X4
ENTITY decod24 IS PORT (f0,f1:IN BIT; s0,s1,s2,s3:OUT BIT);END decod24;
ARCHITECTURE comportamiento OF decod24 ISBEGIN PROCESS (f0,f1) BEGIN
IF f0='0' and f1='0' THENs0<='1' ;s1<='0' ;s2<='0' ;s3<='0' ;
ELSIF f0='1' and f1='0' THENs0<='0' ;s1<='1' ;s2<='0' ;s3<='0' ;
ELSIF f0='0' and f1='1' THENs0<='0' ;s1<='0' ;s2<='1' ;s3<='0' ;
ELSIF f0='1' and f1='1' THENs0<='0' ;s1<='0' ;s2<='0' ;s3<='1' ;END IF;
END PROCESS;END comportamiento;
CODIFICADOR DE 4X2
ENTITY decod42 IS PORT (f0,f1,f2,f3:IN BIT; salida:OUT BIT_VECTOR(1 DOWNTO 0));END decod42;
ARCHITECTURE comportamental OF decod42 ISBEGIN PROCESS (f0,f1,f2,f3) BEGIN IF f0='1' and f1='0' and f2='0' and f3='0' THEN
salida(0)<='0' ;salida(1)<='0' ;
ELSIF f0='0' and f1='1' and f2='0' and f3='0' THENsalida(0)<='1' ;salida(1)<='0' ;
ELSIF f0='0' and f1='0' and f2='1' and f3='0' THENsalida(0)<='0' ;salida(1)<='1' ;
ELSIF f0='0' and f1='0' and f2='0' and f3='1' THENsalida(0)<='1' ;salida(1)<='0' ;
ELSIF f0='0' and f1='0' and f2='0' and f3='1' THENsalida(0)<='1' ;salida(1)<='1' ;
END IF; END PROCESS;END comportamental;
FLIP FLOP TIPO D
ENTITY biestable_D IS PORT(D,clk:IN BIT; Q,Q_menos: OUT BIT);END biestable_D;
ARCHITECTURE comportamiento OF biestable_D ISBEGIN PROCESS(CLK) BEGIN IF CLK'EVENT AND clk='1' THEN CASE D IS WHEN '1' => Q<='1'; Q_menos<='0'; WHEN '0' => Q<='0'; Q_menos<='1'; END CASE; END IF; END PROCESS;END comportamiento;
ENTITY BIESTABLE_D ISPORT(D,CLK:IN BIT;Q:OUT BIT);
END BIESTABLE_D;
ARCHITECTURE COMPORTAMIENTO OF BIESTABLE_D ISBEGIN PROCESS(CLK) BEGIN IF CLK'EVENT AND CLK='1' THEN
CASE D IS WHEN '1'=> Q<='1'; WHEN '0' => Q<='0';END CASE;
END IF; END PROCESS;END COMPORTAMIENTO;
Contador ascendente de 4 bitslibrary ieee;use ieee.std_logic_1164.all;use work.std_arith.all; entity contador is port(clk: in std_logic; conta: buffer std_logic_vector(3 downto 0));end contador; architecture archicontador of contador isbegin process (clk) begin if (clk'event and clk= '1') then conta <= conta + 1; end if; end process;end archicontador;
Contador ascendente con carga y reset
entity contador is port(clk, load, reset:in std_logic; data: in std_logic_vector(3 downto0); conta:buffer std_logic_vector(3 downto 0));end contador;
architecture archicontador of contador is Begin process (clk,reset) begin if reset = '1' then conta <= "0000"; elsif (clk'event and clk= '1') then if load = '1' then conta <= data; else conta <= conta + 1; end if; end if; end process; end archicontador;
Diseño de una Máquina de Estados
Se trata de diseñar una maquina de estados que active una salida S cuando se detecta la secuencia …001... en una línea de datos E sincronizada con un reloj. Este detector de secuencia se puede realizar con una máquina de Moore de cuatro estados.
— S1: Esperar el l.er Cero de la secuencia.— S2: Esperar el 2.° Cero de la secuencia.— S3: Esperar el uno de la secuencia y activar la salida S cuando llega.
library IEEE;use IEEE.std_logic_1164.all;
entity FSM isport(reset, E, clk: in bit; O: out bit);end FSM;
architecture ARCH of FSM istype ESTADOS is (S1, S2, S3,S4);signal ESTADO, SIG_ESTADO: ESTADOS;Begin
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
SIG_ESTADO <= S2; else SIG_ESTADO <= S1; end if; when S2 => O <= '0'; if (E='0') then SIG_ESTADO <= S3; else SIG_ESTADO <= S1; end if; when S3 => O <= '0'; 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;
Tutorial Xilinx-ISE Manejo básico
XILINX ISE
La herramienta XILINX ISE (Integrated Software Environment) es una herramienta de diseño profesional, que mediante la realización de circuitos esquemáticos, o la utilización de lenguaje de programación como el VHDL, nos permite la simulación y la generación de códigos ejecutables para programar dispositivos lógicos.
Creación de un nuevo proyecto
• Un proyecto es un conjunto de ficheros, tales como esquemáticos, líneas de códigos de programa (utilizando un lenguaje de programación), lista de conexionados, librerías de componentes, vectores de test para simulación, etc., seleccionados para un proyecto específico.
Para crear un nuevo proyecto1. File New Project.2. Project Name Colocar el nombre del proyecto3. Project Location Elegir la carpeta para guardar el proyecto4. Top-Level Source Type Seleccionar el método de trabajo, Schematic o HDL
(Si utiliza lenguaje de programación VHDL)5. Next
1. Family: Seleccionar según dispositivo a programar, CDLP(XC9500XL CPLDs ) o FPGA (Spartan3E)2. Device: CPLD ( XC9572XL) o FPGA(XC3500E)3. Package: CPLD (PC44) o FPGA (FG320)4. Preferred Language: VHDL5. Next
1. New Source: Seleccionar la fuente del proyecto2. En la nueva ventana que se despliega seleccionar: Shematic (Esquemáticos) o VHDL Module según el método seleccionado anteriormente. 3. File Name: Escriba el nombre del archivo4. Next
1. Entity Name: Digite el nombre de la Entidad.2. Architecture Name: Digite un nombre para la arquitectura (ojalá nombres coherentes con el
proyecto)3. Port Name: Asigne el nombre de los puertos de entradas y salidas4. Selecione la opción una de las opciones, in, out, inout según el diseño del proyecto. 5. Si utilza vectores de entrada o salida habilite la opción de Bus y digite cual es el bit mas significativo y el menos significativo (Por ejemplo si el vector es de 8 bits, entonces MSB = 7 y LSB = 0) 6.Next
1. Resumen del proyecto para su revisión, si existe algún error oprima Back para regresar y corregir2. Presione el botón Finish
Opción para crear un nuevo proyecto y un nuevo archivo fuente, en nuestro caso oprima Next, Next.
Ventana donde se muestra las especificaciones del proyecto.Oprima Finish.
Empiece a desarrollar el programa (arquitectura) utilizando el lenguaje VHDL y después proceda a generar el archivo de programación (Generate Programming File)
(Ejemplo demostrativo)
Programa totalmente terminado y compilado