Ejemplo 1

En este ejemplo se va a realizar la descripción estructural de un sumador de ancho de flujo 4 bits basado en full-adders

Por consiguiente, el componente base va a ser el full-adder, cuyo código es el siguiente:

--Descripción del full-adder
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
Entity fa is
port(

a,b: in std_logic;
c: in std_logic;
s, co: out std_logic);

end fa;

Architecture logica of fa is --Descripción de una primera arquitectura
begin

s <= a xor b xor c;
co <= (a and b) or (b and c) or (a and c);

end logica;

Architecture rtl of fa is --Descripción de una segunda arquitectura
signal int: std_logic_vector(1 downto 0);
begin

int <= ('0' & a) + b + c; --Cuidado con esta descripción --> ver nota de pie
s <= int(0);
co <= int(1);

end rtl;

Puede comprobarse que se han creado dos arquitecturas para el full-adder: tenemos un componente (entidad) con deble definición para el diseño

Ello nos permite elegir la arquitectura que deseemos en cada caso concreto, pero ésta debe ser especificada en el correspondiente código estructurado

Entonces, para la descripción de un sumador de 4 bits (formato carry-propagate) necesitaremos encadenar los cuatro sumadores mediante un conexionado correcto de las señales de interconexión

El código final es el siguiente

--Sumador carry-propagate de 4 bits
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
Entity Suma is
port(

A, B: in std_logic_vector(3 downto 0);
Cin: in std_logic;
S: out std_logic_vector(3 downto 0);
Cout: out std_logic);

end Suma;
Architecture estructural of Suma is

component fa -- Declaración de componente a usar
port (

a, b, c:in std_logic;
s, co: out std_logic);

end component;
for u1, u2: fa use entity work.fa(logica); -- Dos full-adders utilizan la descripción logica
for u3, u4: fa use entity work.fa(rtl); -- Dos full-adders utilizan la descripción rtl
signal int: std_logic_vector(4 downto 0);
begin

int(0) <= cin;
u1: fa port map (A(0), B(0), int(0), S(0), int(1)); --Instanciación de componentes
u2: fa port map (A(1), B(1), int(1), S(1), int(2));
u3: fa port map (A(2), B(2), int(2), S(2), int(3));
u4: fa port map (A(3), B(3), int(3), S(3), int(4));
Cout <= int(4);

end estructural;


Nota de pie

La asignación int <= ('0' & a) + b + c permite al compilador sobrecargar a una señal con ancho de flujo de 2 bits una operación con operandos de 1 bit

Esta concatencación debe realizarse siempre que operemos con datos cuyo ancho de flujo sea distinto al de los operandos

Anterior
Volver a inicio curso
Volver a inicio capítulo
Siguiente


WcN - Joan Oliver. Diseño de circuitos digitales con VHDL: VHDL estructurado