Line 28... |
Line 28... |
--use ieee.std_logic_unsigned.conv_integer;
|
--use ieee.std_logic_unsigned.conv_integer;
|
|
|
|
|
--! Biblioteca de definicion de memorias de altera
|
--! Biblioteca de definicion de memorias de altera
|
library altera_mf;
|
library altera_mf;
|
|
|
--! Paquete para manejar memorias internas tipo M9K
|
--! Paquete para manejar memorias internas tipo M9K
|
use altera_mf.all;
|
use altera_mf.all;
|
|
|
--! Biblioteca de modulos parametrizados.
|
--! Biblioteca de modulos parametrizados.
|
library lpm;
|
library lpm;
|
Line 48... |
Line 49... |
package arithpack is
|
package arithpack is
|
|
|
--! TestBenchState
|
--! TestBenchState
|
type tbState is (abcd,axb,cxd,stop);
|
type tbState is (abcd,axb,cxd,stop);
|
|
|
--! Constante con el nivel l—gico de reset.
|
--! Constante con el nivel lógico de reset.
|
constant rstMasterValue : std_logic := '1';
|
constant rstMasterValue : std_logic := '1';
|
|
|
--! Constante: periodo del reloj;
|
--! Constante: periodo del reloj, para una frecuencia de 50 MHz
|
constant tclk : time := 20 ns;
|
constant tclk : time := 20 ns;
|
|
|
|
--! Constante: medio periodo de reloj.
|
constant tclk2: time := tclk/2;
|
constant tclk2: time := tclk/2;
|
|
|
|
--! Constante: cuarto de periodo del reloj.
|
constant tclk4: time := tclk/4;
|
constant tclk4: time := tclk/4;
|
|
|
|
|
--! Generacion de Clock y de Reset.
|
--! Generacion de Clock y de Reset.
|
component clock_gen
|
component clock_gen
|
Line 103... |
Line 108... |
port (
|
port (
|
clock0 : in std_logic ;
|
clock0 : in std_logic ;
|
address_a : in std_logic_vector (8 downto 0);
|
address_a : in std_logic_vector (8 downto 0);
|
q_a : out std_logic_vector (17 downto 0)
|
q_a : out std_logic_vector (17 downto 0)
|
);
|
);
|
end component; --! Entidad uf: sus siglas significan undidad funcional. La unidad funcional se encarga de realizar las diferentes operaciones vectoriales (producto cruz — producto punto).
|
end component; --! Entidad uf: sus siglas significan undidad funcional. La unidad funcional se encarga de realizar las diferentes operaciones vectoriales (producto cruz ó producto punto).
|
|
|
component uf
|
component uf
|
generic (
|
generic (
|
use_std_logic_signed : string := "NO";
|
use_std_logic_signed : string := "NO";
|
testbench_generation : string := "NO";
|
testbench_generation : string := "NO";
|
Line 119... |
Line 124... |
cpx,cpy,cpz,dp0,dp1 : out std_logic_vector(31 downto 0);
|
cpx,cpy,cpz,dp0,dp1 : out std_logic_vector(31 downto 0);
|
clk,rst : in std_logic
|
clk,rst : in std_logic
|
);
|
);
|
end component;
|
end component;
|
|
|
--! Entidad opcoder: opcoder decodifica la operaci—n que se va a realizar. Para tal fin coloca en la entrada de uf (unidad funcional), cuales van a ser los operandos de los multiplicadores con los que uf cuenta y adem‡s escribe en el selector de operaci—n de uf, el tipo de operaci—n a realizar.
|
--! Entidad opcoder: opcoder decodifica la operación que se va a realizar. Para tal fin coloca en la entrada de uf (unidad funcional), cuales van a ser los operandos de los multiplicadores con los que uf cuenta y adem‡s escribe en el selector de operación de uf, el tipo de operación a realizar.
|
component opcoder
|
component opcoder
|
generic (
|
generic (
|
width : integer := 18;
|
width : integer := 18;
|
structuralDescription : string:= "NO"
|
structuralDescription : string:= "NO"
|
);
|
);
|
Line 145... |
Line 150... |
c: out std_logic_vector(width-1 downto 0)
|
c: out std_logic_vector(width-1 downto 0)
|
);
|
);
|
end component;
|
end component;
|
|
|
|
|
--! Esta entidad corresponde al multiplicador que se instanciar’a dentro de la unidad funcional. El multiplicador registra los operandos a la entrada y el respectivo producto de la multiplicaci—n a la salida.
|
--! Esta entidad corresponde al multiplicador que se instanciaría dentro de la unidad funcional. El multiplicador registra los operandos a la entrada y el respectivo producto de la multiplicación a la salida.
|
component lpm_mult
|
component lpm_mult
|
generic (
|
generic (
|
lpm_hint : string;
|
lpm_hint : string;
|
lpm_pipeline : natural;
|
lpm_pipeline : natural;
|
lpm_representation : string;
|
lpm_representation : string;
|
Line 168... |
Line 173... |
end component;
|
end component;
|
|
|
|
|
|
|
|
|
--! cla_logic_block corresponde a un bloque de l—gica Carry look Ahead. Se instancia y utiliza dentro de un sumador cualquiera, pues sirve para calcular los carry out de la operaci—n.
|
--! cla_logic_block corresponde a un bloque de lógica Carry look Ahead. Se instancia y utiliza dentro de un sumador cualquiera, pues sirve para calcular los carry out de la operación.
|
component cla_logic_block
|
component cla_logic_block
|
generic ( width: integer:=4);
|
generic ( width: integer:=4);
|
port (
|
port (
|
p,g:in std_logic_vector(width-1 downto 0);
|
p,g:in std_logic_vector(width-1 downto 0);
|
cin:in std_logic;
|
cin:in std_logic;
|
c:out std_logic_vector(width downto 1)
|
c:out std_logic_vector(width downto 1)
|
);
|
);
|
end component;
|
end component;
|
|
|
--! rca_logic_block corresponde a un bloque de l—gica Ripple Carry Adder. Se instancia y utiliza dentro de un sumador cualquiera, pues sirve para calcular los carry out de la operaci—n.
|
--! rca_logic_block corresponde a un bloque de lógica Ripple Carry Adder. Se instancia y utiliza dentro de un sumador cualquiera, pues sirve para calcular los carry out de la operación.
|
component rca_logic_block
|
component rca_logic_block
|
generic ( width : integer := 4);
|
generic ( width : integer := 4);
|
port (
|
port (
|
p,g: in std_logic_vector(width-1 downto 0);
|
p,g: in std_logic_vector(width-1 downto 0);
|
cin: in std_logic;
|
cin: in std_logic;
|
Line 203... |
Line 208... |
result : out std_logic_vector (width-1 downto 0);
|
result : out std_logic_vector (width-1 downto 0);
|
cout : out std_logic
|
cout : out std_logic
|
);
|
);
|
end component;
|
end component;
|
|
|
|
--! Procedimiento para escribir std_logic_vectors en formato hexadecimal.
|
procedure hexwrite_0(l:inout line; h: in std_logic_vector);
|
procedure hexwrite_0(l:inout line; h: in std_logic_vector);
|
|
|
end package;
|
end package;
|
|
|
package body arithpack is
|
|
--! Funciones utilitarias, relacionadas sobre todo con el testbench
|
--! Funciones utilitarias, relacionadas sobre todo con el testbench
|
|
package body arithpack is
|
|
|
constant hexchars : string (1 to 16) := "0123456789ABCDEF";
|
constant hexchars : string (1 to 16) := "0123456789ABCDEF";
|
|
|
procedure hexwrite_0(l:inout line;h:in std_logic_vector) is
|
procedure hexwrite_0(l:inout line;h:in std_logic_vector) is
|
variable index_high,index_low,highone : integer;
|
variable index_high,index_low,highone : integer;
|
|
|