Documentos de Académico
Documentos de Profesional
Documentos de Cultura
VHDL
VHDL
Dpto. Arquitectura de Computadores y Automtica Ingeniera Informtica Facultad de Informtica Universidad Complutense de Madrid
ndice
I. Introduccin ............................................................................................................ 3 II. Elementos Bsicos de VHDL........................................................................... 4 2.1 Identificadores............................................................................................... 4 2.2 Operadores........................................................................................................... 6 III. Estructura Bsica de un Archivo fuente en VHDL...................... 8 3.1 Entidades (Entity) ....................................................................................... 8 3.2 Arquitectura (Architecture).................................................................. 9 3.3 Sentencias de descripcin..................................................................... 10 3.4 Descripcin Estructural ......................................................................... 11 3.5 Descripcin por comportamiento(behavioural) ......................... 12 3.6 Ejemplos ............................................................................................................. 13 IV. Descripcin de Lgica Secuencial........................................................ 16 4.1 Ejemplos ............................................................................................................. 17 V. Diseo de una Mquina de Estados .......................................................... 19 VI. Funciones, Procedimientos y Paquetes .............................................. 22 6.1 Funciones ........................................................................................................... 22 6.2 Procedimiento ................................................................................................. 23 6.3 Ejemplo................................................................................................................ 23 VII. Ejemplo: Diseo de una Memoria RAM................................................. 25 Apndice ........................................................................................................................... 27
I. Informtica (UCM)
I. Introduccin
VHDL es un lenguaje de descripcin de circuitos electrnicos digitales que utiliza distintos niveles de abstraccin. El significadde las siglas VHDL es VHSIC (Very High Speed Integrated Circuits) Hardware Description Language. Esto significa que VHDL permite acelerar el proceso de diseo. VHDL no es un lenguaje de programacin, por ello conocer su sintaxis no implica necesariamente saber disear con l. VHDL es un lenguaje de descripcin de hardware genrico, que permite describir circuitos sncronos y asncronos. Para realizar esto debemos: - Pensar en puertas y biestables, no en variables ni funciones. - Evitar bucles combinacionales y relojes condicionados. - Saber qu parte del circuito es combinacional y cul secuencial. Los circuitos descritos en VHDL pueden ser simulados utilizando herramientas de simulacin para reproducir el funcionamiento del circuito. Adems utilizando herramientas de sntesis se puede implementar dicho circuito en un dispositivo lgico programable o en un circuito integrado. Webs y Noticias Relacionadas con la programacin en VHDL y sus herramientas de simulacin y sntesis www.edacafe.com Espacio web dedicado a difundir las noticias relacionadas con el mundo del diseo de circuitos. Tiene un foro particular de VHDL (problemas, herramientas gratuitas ) www.eda.org/vasg/ Welcome to the VHDL Analysis and Standardization Group (VASG). The purpose of this web site is to enhance the services and communications between members of the VASG and users of VHDL. We've provided a number of resources here to help you research the current and past activities of the VASG and report language bugs, LRM ambiguities, and suggest improvements to VHDL www.cadence.com Cadence Design Systems is the world's largest supplier of EDA technologies and engineering services. Cadence helps its customers break through their challenges by providing a new generation of electronic design solutions that speed advanced IC and system designs to volume www.xilinx.com In the world of digital electronic systems, there are three basic kinds of devices: memory, microprocessors, and logic. Memory devices store random information such as the contents of a spreadsheet or database. Microprocessors execute software instructions to perform a wide variety of tasks such as running a word processing program or video game. Logic devices provide specific functions, including device-to-device interfacing, data communication, signal processing, data display, timing and control operations, and almost every other function a system must perform
I. Informtica (UCM)
2.1 Identificadores
Constant. Los objetos de esta clase tienen un valor inicial que es asignado de forma previa a la simulacin y que no puede ser modificado durante sta. o constant identificador: tipo:= valor; Variable. Los objetos de esta clase contienen un nico valor que puede ser cambiado durante la simulacin con una sentencia de asignacin. 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. o variable identificador: tipo [:= valor]; Signal. Los objetos de esta clase contienen una lista de valores que incluye el valor actual y un conjunto de valores futuros. Las seales representan elementos de memoria o conexiones y si pueden ser sintetizadas. Los puertos de una entidad son implcitamente declarados como seales en el momento de la declaracin, ya que estos representan conexiones. Tambin pueden ser declaradas en la arquitectura antes del BEGIN, lo cual nos permite realizar conexiones entre diferentes mdulos. o signal identificador: tipo;
VHDL permite utilizar tipos 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)
I. Informtica (UCM)
STD_LOGIC Tipo predefinido en el estndar IEEE 1164. Este tipo representa una lgica multivaluada de 9 valores. Adems del 0 lgico y el 1 lgico, posee alta impedancia Z, desconocido X sin inicializar U entre otros. Igual que se permite crear un vector de bits se puede crear un vector de std_logic, STD_LOGIC_VECTOR. Para poder utilizar el tipo std_logic hay que aadir la librera que lo soporta. Para poder utilizar el tipo: use ieee.std_logic_1164.all. Para poder utilizar las funciones aritmeticolgicas definidas multiplicacin) use ieee.std_logic_arith.all. Si los vectores estn en representacin binaria pura use ieee.std_logic_unsigned.all. Los vectores estn en C2 use ieee.std_logic_unsigned.all.
(suma,
resta
TIPO ENUMERADO es un tipo de dato con un grupo de posibles valores asignados por el usuario. Los tipos enumerados se utilizan principalmente en el diseo de mquinas de estados type nombre is (valor1, valor2, ); Los tipos enumerados se ordenan de acuerdo a sus valores. Los programas de sntesis automticamente codifican binariamente los valores del tipo enumerado para que estos puedan ser sintetizados. Algunos programas lo hacen mediante una secuencia binaria ascendente, otros buscan cual es la codificacin que mejor conviene para tratar de minimizar el circuito o para incrementar la velocidad del mismo una vez que la descripcin ha sido sintetizada. Tambin es posible asignar el tipo de codificacin mediante directivas propias de la herramienta de sntesis. TIPOS COMPUESTOS un tipo compuesto es un tipo de dato formado con elementos de otros tipos, existen dos formas de tipos compuestos, arrays y records. Un ARRAY es un objeto de datos que consiste en una coleccin de elementos del mismo tipo. type nombre is array (rango) of tipo; Un RECORD es un objeto de datos que consiste en una coleccin de elementos de distintos tipos. type nombre is record elemento1: tipo_de_dato1; elemento2: tipo_de_dato2; end record;
I. Informtica (UCM)
constant DATA_WIDTH: integer := 8; signal CTRL: bit_vector(7 downto 0); variable SIG1, SIG2: integer range 0 to 15; ------------------------------------------------------------type color is (rojo, amarillo, azul); signal BMP: color; color <= rojo; ------------------------------------------------------------type word is array (0 to 15) of bit_vector (7 downto 0); signal palabra: word; word(0) <= 00111110; word(1) <= 00011010; word(15) <= 11111110; ------------------------------------------------------------type matrix is array (0 to 15)(7 downto 0) of bit; signal matriz: matrix; matriz(2)(5)<=1; ------------------------------------------------------------type conjunto is record palabra: std_logic_vector (0 to 15); valor: integer range -256 to 256; end record; signal dato: conjunto; dato.valor <= 176;
2.2 Operadores
Un operador nos permite construir diferentes tipos de expresiones mediante los cuales podemos calcular datos utilizando diferentes objetos de datos con el tipo de dato que maneja dicho objeto. En VHDL existen distintos operadores de asignacin con lo que se transfieren valores de un objeto de datos a otro, y operadores de asociacin que relacionan un objeto de datos con otro, lo cual no existe en ningn lenguaje de programacin de alto nivel. abs *, /, mod, rem + (sig.), - (sig) +, -, & and, or, nand, nor, xor := asignacin de valores a constantes y variables. <= asignacin de valores a seales.
I. Informtica (UCM)
y <= (x1 and x2) or d(0); y(1)<= x1 and not x2; y <= x1&x2; -- y=x1x2 c := 27 + r;
I. Informtica (UCM)
A 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 Adems, la entidad puede definir un valor genrico (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;
I. Informtica (UCM)
architecture arch_name of entity_name is signal declarations; begin -- sentencias concurrentes (combinacionales) and, or, not, nand, xor, +, -- sentencias secuenciales process (sensitivity list) variable declarations; begin sentencias end process; end arch_name;
9 I. Informtica (UCM)
PROCESS: Cuando en VHDL se escribe un process, dentro de l aparece la parte secuencial del circuito. La simulacin no entra en el process hasta que no haya variado alguna de las seales o variables de su lista de sensibilidad independientemente de lo que este contenido dentro del process. Por otro lado nicamente dentro de un process pueden aparecer las sentencias de tipo if y else y nunca puede aparecer una sentencia del tipo wait.
IF THEN ELSE solo son aplicables dentro de un process if condicin then ... --sequential statements elsif otra_condicin then ... --sequential statements else ... --sequential statements end if;
CASE WHEN solo son aplicables dentro de un process case expresin is when alternativa_l => ... --seq. statements when alternativa_n => ... --seq. statements when others => ... --seq. statements end case;
10
I. Informtica (UCM)
FOR LOOP solo son aplicables dentro de un process for loop_var in range loop ... --sequential statements end loop;
WHILE LOOP solo son aplicables dentro de un process while condicin loop ... --sequential statements end loop;
WHEN ELSE Signal_name <= valor_1 when condicin1 else valor_2 when condicin2 else ... valor_i when condicini else otro_valor;
WITH SELECT WHEN with identificador select Signal_name <= valor_1 when valor_identificador1, valor_2 when valor_identificador2, ... valor_i when valor_identificadori, otro_valor when others;
11
I. Informtica (UCM)
entity entity_name is port(); end entity_name; architecture arch_name of entity_name is component component_name port (); end component; signal declarations; begin component_i: component_name port map (io_name) end arch_name;
GENERATE: Las secuencias de generacin de componentes permiten crear una o ms copias de un conjunto de interconexiones, lo cual facilita el diseo de circuitos mediante descripciones estructurales. for indice in rango generate -- instrucciones concurrentes end generate; --------------------------------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;
12
I. Informtica (UCM)
Los mdulos que se suelen describir mediante comportamiento suelen ser: Mdulos que estn al final de la jerarqua en una descripcin estructural. Paquetes CI de una librera. Mdulos cuyo comportamiento es complicado para poderlo describir mediante una estructura. Process con wait, if, else, when, case ... Muchas veces las funciones dependen del tiempo, VHDL resuelve este problema permitiendo la descripcin del comportamiento en la forma de un programa tradicional.
3.6 Ejemplos
MULTIPLEXOR 2x1: Un multiplexor 2x1 se correspondera con el siguiente mdulo visto desde fuera:
Por lo que su entidad correspondiente sera: entity mux2 is port (D0, D1, S0: in std_logic; O out std_logic); end mux2; La descripcin de lo que hace internamente se puede realizar de varias maneras, as pues un multiplexor es un mdulo que hace: S0 0 1 O D0 D1
Lo cual podra corresponder perfectamente a la siguiente arquitectura: architecture behavioral1 of mux2 is begin O <= D1 when (S0 = 1) else D0; end behavioral1; a esta otra:
13
I. Informtica (UCM)
architecture behavioral2 of mux2 is begin multiplexor: process(D0,D1,S0) if(S0 = 1) then O <= D1; else O <= D0; end if; end process; end behavioral2; Tambin podemos saber mediante la realizacin de la tabla de verdad como est diseado por dentro un multiplexor:
Lo que dara como resultado la siguiente arquitectura si lo hacemos de manera estructural: architecture structural of mux2 is -- declaracin de componentes component AND2 port (I0,I1: in std_logic; O: out std_logic); end component; component OR2 port (I0,I1: in std_logic; O: out std_logic); end component; component INV port (I0,I1: in std_logic; O: out std_logic); end component; -- declaracin de seales signal S1,S2,S3: std_logic; begin U1: INV port map (S0,S1); U2: AND2 port map (D0,S1,S2); U3: AND2 port map (S0,D1,S3); U4: OR2 port map (S2,S3,O); end structural;
14
I. Informtica (UCM)
O esta otra si lo hacemos por comportamiento architecture mixed of mux2 is signal S1,S2: std_logic; begin S1 <= D0 and not S0; S2 <= D1 and S0; O <= S1 or S2; end mixed;
15
I. Informtica (UCM)
16
I. Informtica (UCM)
4.1 Ejemplos
REGISTRO DE 8 BITS entity registro_8 is port (clk, reset: in bit; A: in bit_vector(7 downto 0); B: out bit_vector(7 downto 0)); end registro; architecture arch_reg of registro_8 is begin process(clk, reset) begin if reset=1 then B<=00000000; elsif (clkevent and clk=1) then B<=A; end if; end process; end arch_reg;
REGISTRO DE 8 BITS A PARTIR DE BIESTABLES DE 1 BIT Definimos el registro de 8 bits como la unin de 8 biestables (descripcin concurrente): entity biestable is port (clk, reset, C: in bit; D: out bit); end biestable;
17
I. Informtica (UCM)
architecture arch of biestable is begin process(clk, reset) begin if reset=1 then D<=0; elsif (clkevent and clk=1) then D<=C; end if; end process; end arch; entity registro_8 is port (clk, reset: in bit; A: in bit_vector(7 downto 0); B: out bit_vector(7 downto 0)); end registro_8; architecture estructural of registro_8 is component biestable port(clk, reset, c: in bit; d: out bit); end component biestable; signal F: bit_vector(7 downto 0); begin gen: for i in 0 to 7 generate u: biestable port map(clk, reset, A(i),F(i)); end generate gen; B <= F; end estructural;
18
I. Informtica (UCM)
SIG_ESTADO CLK
ESTADO
Una Maquina de Estados Finita (FSM) se puede describir en VHDL de varias formas. En primer lugar en la seccin de declaraciones de la arquitectura, se define un tipo enumerado en el que se asignan identificadores a cada estado. Suele ser recomendable utilizar identificadores ilustrativos para los estados. La herramienta de sntesis ser la encargada de codificar estos estados. Posteriormente, en el cuerpo de la arquitectura se define la funcin de transicin de estados (F) y la funcin de salida (G) en uno o varios procesos. Por lo tanto tenemos: Un proceso secuencial que modela los biestables de estado; Por lo tanto que actualiza el estado (ESTADO). Un proceso combinacional que modela las funciones F y G; por lo tanto deriva el siguiente estado (ESTADO_SIG) y actualiza las salidas (O).
Para ilustrar la descripcin de mquinas de estados vamos a pensar en un ejemplo Se trata de disear una maquina de estados que active una salida S cuando se detecta la secuencia 001... en una lnea de datos E sincronizada con un reloj. Este detector de secuencia se puede realizar con una mquina 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. E=1 E=0 S1 O=0 E=1 E=1 E=0 E=0 S2 O=0 E=0 S3 O=0 E=1 S4 O=1
19
I. Informtica (UCM)
Para la implementacin en VHDL. Primero definimos un tipo enumerado, formado por los nombres de los estados y se declaran dos seales de este tipo: type ESTADOS is (S1, S2, S3, S4); signal ESTADO, ESTADO_SIG: ESTADOS; A continuacin creamos un proceso combinacional en el que se determina el siguiente estado (ESTADO_SIG) y la salida S en funcin del estado actual (ESTADO, E). El programa quedara al final de la siguiente manera: library IEEE; use IEEE.std_logic_1164.all; entity FSM is port(reset, E, clk: in bit; O: out bit); end FSM; architecture ARCH of FSM is type 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
20
I. Informtica (UCM)
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'; 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;
21
I. Informtica (UCM)
6.1 Funciones
No pueden modificar los parmetros que se les pasan (todos sern in). No pueden modificar seales ni variables declaradas externamente. Siempre devuelven un valor cuyo tipo se especifica en la propia declaracin de la funcin. Se ejecutan en tiempo nulo, por lo que no pueden contener ninguna sentencia wait. package nombre is -- declaracin de funciones function identificador() return tipo end package nombre; function identificador() return tipo -- seales, variables begin -- cuerpo del programa return valor; end function identificador;
22
I. Informtica (UCM)
6.2 Procedimiento
Posibilidad de intercambio bidireccional con el exterior Posibilidad de incluir una sentencia wait Posibilidad de efectuar asignaciones a seales Se define en la zona de declaraciones de la arquitectura procedure nombre(parmetros) -- seales, variables begin -- cuerpo del procedimiento end procedure nombre;
6.3 Ejemplo
EJEMPLO SUMA DE DOS VECTORS DE BIT UTILIZANDO PAQUETES
library IEEE; use IEEE.std_logic_1164.all; package ope_aritmeticas is function vector_to_natural (v:in std_logic_vector) return natural; function natural_to_vector (nat : in natural; length : in natural) return std_logic_vector; procedure vector_add ( v1, v2 : in std_logic_vector; v_result : out std_logic_vector); end ope_aritmeticas; package body ope_aritmeticas is function vector_to_natural (v:in std_logic_vector) return natural is variable aux : natural:=0; begin for i in v'range loop if v(i)='1' then aux := aux + (2**i); end if; end loop; return aux; end vector_to_natural; function natural_to_vector (nat : in natural; length : in natural) return std_logic_vector is variable v: std_logic_vector(length-1 downto 0); variable cociente, aux, i, resto: natural; begin
23
I. Informtica (UCM)
aux:= nat; i:=0; while (aux/=0) and (i<length) loop cociente := aux/2; resto := aux mod 2; if resto=0 then v(i):='0'; else v(i):='1'; end if; i := i+1; aux := cociente; end loop; for j in i to length-1 loop v(j):='0'; end loop; return v; end natural_to_vector; procedure vector_add ( v1, v2 : in std_logic_vector; v_result : out std_logic_vector) is variable suma,long: natural; begin long:=v1'length; suma:= vector_to_natural(v1) + vector_to_natural(v2); v_result := natural_to_vector(suma,long); end vector_add; end ope_aritmeticas; ------------------------------------------------------------------------library IEEE; use IEEE.std_logic_1164.all; use work.ope_aritmeticas.all; -- Para poder utilizar el paquete entity sum is port (v1,v2: in std_logic_vector; v_result : out std_logic_vector); end sum; architecture beh of sum is begin p1: process(v1, v2) variable suma: natural; begin vector_addu(v1,v2,suma); v_result<= suma; end process p1; end beh;
24
I. Informtica (UCM)
integer:=4; -- ancho de palabra integer:=4; -- n de palabras integer:=2); -- ancho direccin in std_logic; in std_logic; in std_logic; in std_logic; in std_logic_vector(a-1 downto 0); in std_logic_vector(a-1 downto 0); in std_logic_vector(w-1 downto 0); out std_logic_vector(w-1 downto 0)
architecture behav of SRAM is -- Utilizamos un array para guardar los valores de la memoria type ram_type is array (0 to d-1) of std_logic_vector(w-1 downto 0); signal tmp_ram: ram_type; begin -- Lectura process(Clock, Read) begin if (Clock'event and Clock='1') then if Enable='1' then if Read='1' then Data_out <= tmp_ram(std2n(Read_Addr)); else Data_out <= (Data_out'range => 'Z'); -- Todos los bits de Data_out se ponen a 'Z' end if; end if; end if; end process; -- Escritura process(Clock, Write) begin
25
I. Informtica (UCM)
if (Clock'event and Clock='1') then if Enable='1' then if Write='1' then tmp_ram(std2n(Write_Addr)) <= Data_in; end if; end if; end if; end process; end behav;
26
I. Informtica (UCM)
Apndice
Discusin utilizacin de seales frente a utilizacin de variables (signal vs variable) Las seales se utilizan para conectar los componentes del diseo llevando la informacin del estado actual del circuito a simular. Por otro lado las variables son utilizadas dentro de los procesos para computar valores particulares. El siguiente ejemplo muestra la diferencia: entity sig_var is port( d1, d2, d3: res1, res2: end sig_var;
architecture behv of sig_var is signal sig_s1: std_logic; begin proc1: process(d1,d2,d3) variable var_s1: std_logic; begin var_s1 := d1 and d2; res1 <= var_s1 xor d3; end process; proc2: process(d1,d2,d3) begin sig_s1 <= d1 and d2; res2 <= sig_s1 xor d3; end process; end behv; Aparentemente los dos procesos deberan ofrecer el mismo resultado pues realizan las mismas operaciones
27
I. Informtica (UCM)
Este manual fue inicialmente creado para la asignatura de Diseo y Test de Circuitos Integrados II de la titulacin de I. Electrnica ltima actualizacin septiembre 2006
28
I. Informtica (UCM)