Código VHDL para un multiplicador binario de cuatro bits.#
El código VHDL para un multiplicador binario de cuatro bits debe incluir como bloque fundamental a un sumador con acarreo serie como el que se muestra en la Figura 26.
--------------------------------------------------
-- Código VHDL para la descripción de
-- un sumador con acarreo
-- serie de dos números de 4 bits
--------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
------------------------------------------------
-- Se usa la descripción de un bloque
-- básico el cual es un sumador completo
--------------------------------------------------
entity sumador_completo is
Port ( X : in STD_LOGIC;
Y : in STD_LOGIC;
Z : in STD_LOGIC;
S : out STD_LOGIC;
Cout : out STD_LOGIC);
end sumador_completo;
-- Se describe la arquitectura a nivel compuerta
architecture nivel_compuerta of sumador_completo is
begin
S <= X XOR Y XOR Z ;
Cout <= (X AND Y) OR (Z AND X) OR (Z AND Y) ;
end nivel_compuerta;
----------------------------------------------------
-- Se describe la entidad sumador serie que
-- contiene al sumador completo como bloque
-- fundamental
-------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity sumador_serie is
Port ( X : in STD_LOGIC_VECTOR (3 downto 0);
Y : in STD_LOGIC_VECTOR (3 downto 0);
C0 : in STD_LOGIC;
S : out STD_LOGIC_VECTOR (3 downto 0);
C4 : out STD_LOGIC);
end sumador_serie;
architecture arq_sumador_serie of sumador_serie is
-- Declaración del uso del sumador completo
-- como bloque básico
component sumador_completo
Port ( X : in STD_LOGIC;
Y : in STD_LOGIC;
Z : in STD_LOGIC;
S : out STD_LOGIC;
Cout : out STD_LOGIC);
end component;
-- Acarreos intermedios
signal c1,c2,c3: STD_LOGIC;
begin
-- Mapeo del sumador completo 4 veces, usado etiquetas
-- Sc para interconectar los bloques
Sc1: sumador_completo port map( X(0), Y(0), C0, S(0), c1);
Sc2: sumador_completo port map( X(1), Y(1), c1, S(1), c2);
Sc3: sumador_completo port map( X(2), Y(2), c2, S(2), c3);
Sc4: sumador_completo port map( X(3), Y(3), c3, S(3), C4);
end arq_sumador_serie;
----------------------------------------------------
-- Se describe la entidad multiplicador que
-- contiene al sumador_serie como bloque
-- fundamental
-------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity multiplicador is
Port(
X: in std_logic_vector(3 downto 0);
Y: in std_logic_vector(3 downto 0);
P: out std_logic_vector(7 downto 0)
);
end multiplicador;
architecture modular of multiplicador is
component sumador_serie
Port ( X : in STD_LOGIC_VECTOR (3 downto 0);
Y : in STD_LOGIC_VECTOR (3 downto 0);
C0 : in STD_LOGIC;
S : out STD_LOGIC_VECTOR (3 downto 0);
C4 : out STD_LOGIC);
end component;
--- Productos de los terminos con operación lógica AND
signal I0,I1,I2: std_logic_vector(3 downto 0);
--- Las entradas B tienen tres bits de productos AND
signal B0,B1,B2: std_logic_vector(3 downto 0);
begin
-- Y(1) a Y(3) productos AND
I0 <= (X(3) AND Y(1),X(2) AND Y(1),X(1) AND Y(1),X(0) AND Y(1));
I1 <= (X(3) AND Y(2),X(2) AND Y(2),X(1) AND Y(2),X(0) AND Y(2));
I2 <= (X(3) AND Y(3),X(2) AND Y(3),X(1) AND Y(3),X(0) AND Y(3));
-- Productos Y(0) y el producto Y(3) AND '0'
B0 <= ('0', X(3) AND Y(0),X(2) AND Y(0),X(1) AND Y(0));
-- Asciación modular
moulo_1:
sumador_serie
Port map ( X => I0,
Y => B0,
C0 => '0',
C4 => B1(3),
S(3) => B1(2), -- La asociación se puede dar en cualquier orden
S(2) => B1(1), -- Los elementos individuales de S estan asociados
S(1) => B1(0), -- todos estos miembros se entregan continuamente
S(0) => P(1)
);
moulo_2:
sumador_serie
Port map ( X => I1,
Y => B1,
C0 => '0',
C4 => B2(3),
S(3) => B2(2), -- La asociación se puede dar en cualquier orden
S(2) => B2(1), -- Los elementos individuales de S estan asociados
S(1) => B2(0), -- todos estos miembros se entregan continuamente
S(0) => P(2)
);
moulo_3:
sumador_serie
Port map ( X => I2,
Y => B2,
C0 => '0',
C4 => P(7),
S => P(6 downto 3)-- Acoplando elementos por formalidad
);
P(0) <= X(0) AND Y(0);
end modular;
El test bench para probar el circuito multiplicador es el siguiente:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity tb_multiplicador is
end tb_multiplicador;
architecture arq_tb of tb_multiplicador is
component multiplicador
Port(
X: in std_logic_vector(3 downto 0);
Y: in std_logic_vector(3 downto 0);
P: out std_logic_vector(7 downto 0)
);
end component;
signal test_X, test_Y: std_logic_vector(3 downto 0);
signal test_P: std_logic_vector (7 downto 0);
begin
DUT: multiplicador
Port map(
X => test_X,
Y => test_Y,
P => test_P
);
PRUEBAS:
Process
begin
wait for 100 ns;
test_X <= "0010";
test_Y <= "0110";
wait for 100 ns;
test_X <= "1010";
test_Y <= "1110";
wait for 100 ns;
wait for 100 ns;
test_X <= "1011";
test_Y <= "1010";
wait;
end process;
end arq_tb;
Una opción diferente para realizar el test bench para el multiplicador de cuatro bits se puede estructurar de tal manera que se elaboren las operaciones en un formato que emula a una tabla de multiplicar.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity tb_multiplicador is
end tb_multiplicador;
architecture arq_tb of tb_multiplicador is
component multiplicador
Port(
X: in std_logic_vector(3 downto 0);
Y: in std_logic_vector(3 downto 0);
P: out std_logic_vector(7 downto 0)
);
end component;
signal test_X, test_Y: std_logic_vector(3 downto 0);
signal test_P: std_logic_vector (7 downto 0);
use ieee.numeric_std.all;
begin
DUT: multiplicador
Port map(
X => test_X,
Y => test_Y,
P => test_P
);
PRUEBAS:
Process
begin
for i in 0 to 15 loop
test_X <= std_logic_vector(to_unsigned(i, test_X'length));
for j in 0 to 15 loop
test_Y <= std_logic_vector(to_unsigned(j, test_Y'length));
wait for 10 ns;
end loop;
end loop;
wait;
end process;
end arq_tb;