Line 25... |
Line 25... |
use ieee.std_logic_1164.all;
|
use ieee.std_logic_1164.all;
|
|
|
--! Paquete para el manejo de aritmŽtica con signo sobre el tipo std_logic_vector
|
--! Paquete para el manejo de aritmŽtica con signo sobre el tipo std_logic_vector
|
use ieee.std_logic_signed.all;
|
use ieee.std_logic_signed.all;
|
|
|
|
--! Paquete para calculo de funciones reales.
|
|
use ieee.math_real.all;
|
|
|
--! Paquete estandar de texto
|
--! Paquete estandar de texto
|
use std.textio.all;
|
use std.textio.all;
|
|
|
--! Se usaran en esta descripcion los componentes del package arithpack.vhd.
|
--! Se usaran en esta descripcion los componentes del package arithpack.vhd.
|
use work.arithpack.all;
|
use work.arithpack.all;
|
Line 39... |
Line 42... |
--! La entrada opcode indica la operación que se está realizando, en los sumadores, es la misma señal que se encuentra en la entidad opcoder, que selecciona si se está realizando un producto punto o un producto cruz. Dentro de la arquitectura de uf, la señal opcode selecciona en la primera etapa de sumadores, si la operación a realizar será una resta o una suma.
|
--! La entrada opcode indica la operación que se está realizando, en los sumadores, es la misma señal que se encuentra en la entidad opcoder, que selecciona si se está realizando un producto punto o un producto cruz. Dentro de la arquitectura de uf, la señal opcode selecciona en la primera etapa de sumadores, si la operación a realizar será una resta o una suma.
|
--! Los resultados estar´n en distintas salidas dependiendo de la operación, lo cual es apenas natural: El producto cruz tiene por resultado un vector, mientras que el producto punto tiene por resultado un escalar.
|
--! Los resultados estar´n en distintas salidas dependiendo de la operación, lo cual es apenas natural: El producto cruz tiene por resultado un vector, mientras que el producto punto tiene por resultado un escalar.
|
--! Esta entidad utiliza las señales de control clk y rst.
|
--! Esta entidad utiliza las señales de control clk y rst.
|
--! \n\n
|
--! \n\n
|
--! La característica fundamental de uf, es que puede realizar 2 operaciones de producto punto al mimso tiempo ó una operación de producto cruz. La otra característica importante es que el pipe de producto punto es mas largo que el pipe de producto cruz: el producto punto tomar´ 3 clocks para realizarse, mientras que el procto punto tomara 4 clocks para realizarse.
|
--! La característica fundamental de uf, es que puede realizar 2 operaciones de producto punto al mimso tiempo ó una operación de producto cruz. La otra característica importante es que el pipe de producto punto es mas largo que el pipe de producto cruz: el producto punto tomar´ 3 clocks para realizarse, mientras que el procto punto tomara 4 clocks para realizarse.
|
|
--! Es importante entender que las resultados de las operaciones, correspondientes a las salidas de esta entidad no est'an conectadas directamente a la salida del circuito combinatorio que ejecuta sus repectivas operaciones: en vez de ello, los resutados est'an conectados a la salida de un registro.
|
|
--! Este circuito es una ALU
|
entity uf is
|
entity uf is
|
generic (
|
generic (
|
|
square_root_width : integer := 16;
|
use_std_logic_signed : string := "NO";
|
use_std_logic_signed : string := "NO";
|
testbench_generation : string := "NO";
|
testbench_generation : string := "NO";
|
carry_logic : string := "CLA"
|
carry_logic : string := "CLA"
|
);
|
);
|
port (
|
port (
|
opcode : in std_logic; --! Entrada que dentro de la arquitectura funciona como selector de la operación que se lleva a cabo en la primera etapa de sumadores/restadores.
|
opcode : in std_logic; --! Entrada que dentro de la arquitectura funciona como selector de la operación que se lleva a cabo en la primera etapa de sumadores/restadores.
|
|
exp0,exp1 : in std_logic_vector(integer(ceil(log(real(square_root_width),2.0)))-1 downto 0); --! Junto con la mantissa este es el exponente del valor flotante, mejora muchisimo la precisi'on.
|
m0f0,m0f1,m1f0,m1f1,m2f0,m2f1,m3f0,m3f1,m4f0,m4f1,m5f0,m5f1 : in std_logic_vector(17 downto 0); --! Entradas que van conectadas a los multiplicadores en la primera etapa de la descripción.
|
m0f0,m0f1,m1f0,m1f1,m2f0,m2f1,m3f0,m3f1,m4f0,m4f1,m5f0,m5f1 : in std_logic_vector(17 downto 0); --! Entradas que van conectadas a los multiplicadores en la primera etapa de la descripción.
|
cpx,cpy,cpz,dp0,dp1,kvx0,kvy0,kvz0,kvx1,kvy1,kvz1 : out std_logic_vector(31 downto 0); --! Salidas donde se registran los resultados de las operaciones aritméticas: cpx,cpy,cpz ser´n los componentes del vector que da por resultado el producto cruz entre los vectores AxB ó CxD. kvx0, kvy0, kvz0, kvx1, kvy1, kvz1 es el resultado de los multiplicadores
|
cpx,cpy,cpz,dp0,dp1,kvx0,kvy0,kvz0,kvx1,kvy1,kvz1 : out std_logic_vector(31 downto 0); --! Salidas donde se registran los resultados de las operaciones aritméticas: cpx,cpy,cpz ser´n los componentes del vector que da por resultado el producto cruz entre los vectores AxB ó CxD. kvx0, kvy0, kvz0, kvx1, kvy1, kvz1 es el resultado de los multiplicadores
|
clk,rst : in std_logic --! Las entradas de control usuales.
|
clk,rst : in std_logic --! Las entradas de control usuales.
|
);
|
);
|
end uf;
|
end uf;
|
Line 59... |
Line 65... |
architecture uf_arch of uf is
|
architecture uf_arch of uf is
|
|
|
-- Stage 0 signals
|
-- Stage 0 signals
|
|
|
signal stage0mf00,stage0mf01,stage0mf10,stage0mf11,stage0mf20,stage0mf21,stage0mf30,stage0mf31,stage0mf40,stage0mf41,stage0mf50,stage0mf51 : std_logic_vector(17 downto 0); --! Señales que conectan los operandos seleccionados en opcode a las entradas de los multiplicadores.
|
signal stage0mf00,stage0mf01,stage0mf10,stage0mf11,stage0mf20,stage0mf21,stage0mf30,stage0mf31,stage0mf40,stage0mf41,stage0mf50,stage0mf51 : std_logic_vector(17 downto 0); --! Señales que conectan los operandos seleccionados en opcode a las entradas de los multiplicadores.
|
signal stage0p0,stage0p1, stage0p2, stage0p3, stage0p4, stage0p5 : std_logic_vector(31 downto 0); --! Señales / buses, con los productos de los multiplicadores.
|
signal stage0p0,stage0p1, stage0p2, stage0p3, stage0p4, stage0p5 : std_logic_vector(31 downto 0); --! Señales / buses, con los productos de los multiplicadores.
|
signal stageMopcode : std_logic; --! Señal de atraso del opcode. Revisar el diagrama de bloques para mayor claridad.
|
signal stageMopcode : std_logic; --! Señal de atraso del opcode. Revisar el diagrama de bloques para mayor claridad.
|
|
signal stage0exp0 : std_logic_vector(integer(ceil(log(real(square_root_width),2.0)))-1 downto 0);
|
|
signal stage0exp1 : std_logic_vector(integer(ceil(log(real(square_root_width),2.0)))-1 downto 0);
|
|
|
--Stage 1 signals
|
--Stage 1 signals
|
|
|
signal stage1p0, stage1p1, stage1p2, stage1p3, stage1p4, stage1p5 : std_logic_vector (31 downto 0); --! Señales provenientes de los productos de la etapa previa de multiplicadores.
|
signal stage1p0, stage1p1, stage1p2, stage1p3, stage1p4, stage1p5 : std_logic_vector (31 downto 0); --! Señales provenientes de los productos de la etapa previa de multiplicadores.
|
signal stage1a0, stage1a1, stage1a2 : std_logic_vector (31 downto 0); --! Señales / buses, con los resultados de los sumadores.
|
signal stage1a0, stage1a1, stage1a2 : std_logic_vector (31 downto 0); --! Señales / buses, con los resultados de los sumadores.
|
signal stageSRopcode : std_logic; --! Señal proveniente del opcode que selecciona si los sumadores deben ejecutar una resta o una suma dependiendo de la operación que se ejecute en ese momento del pipe.
|
signal stageSRopcode : std_logic; --! Señal proveniente del opcode que selecciona si los sumadores deben ejecutar una resta o una suma dependiendo de la operación que se ejecute en ese momento del pipe.
|
|
signal stage1exp0 : std_logic_vector(integer(ceil(log(real(square_root_width),2.0)))-1 downto 0);
|
|
signal stage1exp1 : std_logic_vector(integer(ceil(log(real(square_root_width),2.0)))-1 downto 0);
|
|
|
-- Some support signals
|
-- Some support signals
|
signal stage1_internalCarry : std_logic_vector(2 downto 0); --! Cada uno de los 3 sumadores de la etapa de sumadores est´ compuesto de una cascada de 2 sumadores Carry Look Ahead: aXhigh y aXlow. El carry out del componente low y el carry in del componente high, se conectar´ a través de las señales internal carry.
|
signal stage1_internalCarry : std_logic_vector(2 downto 0); --! Cada uno de los 3 sumadores de la etapa de sumadores est´ compuesto de una cascada de 2 sumadores Carry Look Ahead: aXhigh y aXlow. El carry out del componente low y el carry in del componente high, se conectar´ a través de las señales internal carry.
|
signal stage2_internalCarry : std_logic_vector(1 downto 0); --! Cada uno de los 2 sumadores de la última etapa de sumadores est´ compuesto de una cascada de 2 sumadores Carry Look AheadÑ: aXhigh y aXlow. El carry out del componente low y el carry in del componente high, se conectar´ a través de las señales internal carry.
|
signal stage2_internalCarry : std_logic_vector(1 downto 0); --! Cada uno de los 2 sumadores de la última etapa de sumadores est´ compuesto de una cascada de 2 sumadores Carry Look AheadÑ: aXhigh y aXlow. El carry out del componente low y el carry in del componente high, se conectar´ a través de las señales internal carry.
|
|
|
Line 221... |
Line 231... |
-- Adder Instantiation (Stage 2)
|
-- Adder Instantiation (Stage 2)
|
stage2a3 <= stage2a0+stage2p2;
|
stage2a3 <= stage2a0+stage2p2;
|
stage2a4 <= stage2p3+stage2a2;
|
stage2a4 <= stage2p3+stage2a2;
|
|
|
end generate useIeee;
|
end generate useIeee;
|
dontUseIeee:
|
|
if use_std_logic_signed="NO" generate
|
|
--! Adder 0, 16 bit carry lookahead low adder.
|
|
a0low : adder
|
|
generic map (16,carry_logic,"YES") -- Carry Look Ahead Logic (More Gates Used, But Less Time)
|
|
-- Yes instantiate Xor gates stage in the adder so we can substract on the opcode signal command.
|
|
port map (stage1p0(15 downto 0),stage1p1(15 downto 0),stageSRopcode,'0',stage1a0(15 downto 0),stage1_internalCarry(0));
|
|
--Adder 0, 16 bit carry lookahead high adder.
|
|
a0high : adder
|
|
generic map (16,carry_logic,"YES") -- Carry Look Ahead Logic (More Gates Used, But Less Time)
|
|
-- Yes instantiate Xor gates stage in the adder so we can substract on the opcode signal command.
|
|
port map (stage1p0(31 downto 16),stage1p1(31 downto 16),stageSRopcode,stage1_internalCarry(0),stage1a0(31 downto 16),open);
|
|
--! Adder 1, 16 bit carry lookahead low adder.
|
|
a1low : adder
|
|
generic map (16,carry_logic,"YES") -- Carry Look Ahead Logic (More Gates Used, But Less Time)
|
|
-- Yes instantiate Xor gates stage in the adder so we can substract on the opcode signal command.
|
|
port map (stage1p2(15 downto 0),stage1p3(15 downto 0),'1','0',stage1a1(15 downto 0),stage1_internalCarry(1));
|
|
--! Adder 1, 16 bit carry lookahead high adder.
|
|
a1high : adder
|
|
generic map (16,carry_logic,"YES") -- Carry Look Ahead Logic (More Gates Used, But Less Time)
|
|
-- Yes instantiate Xor gates stage in the adder so we can substract on the opcode signal command.
|
|
port map (stage1p2(31 downto 16),stage1p3(31 downto 16),'1',stage1_internalCarry(1),stage1a1(31 downto 16),open);
|
|
--! Adder 2, 16 bit carry lookahead low adder.
|
|
a2low : adder
|
|
generic map (16,carry_logic,"YES") -- Carry Look Ahead Logic (More Gates Used, But Less Time)
|
|
-- Yes instantiate Xor gates stage in the adder so we can substract on the opcode signal command.
|
|
port map (stage1p4(15 downto 0),stage1p5(15 downto 0),stageSRopcode,'0',stage1a2(15 downto 0),stage1_internalCarry(2));
|
|
--! Adder 2, 16 bit carry lookahead high adder.
|
|
a2high : adder
|
|
generic map (16,carry_logic,"YES") -- Carry Look Ahead Logic (More Gates Used, But Less Time)
|
|
-- Yes instantiate Xor gates stage in the adder so we can substract on the opcode signal command.
|
|
port map (stage1p4(31 downto 16),stage1p5(31 downto 16),stageSRopcode,stage1_internalCarry(2),stage1a2(31 downto 16),open);
|
|
-- Adder Instantiation (Stage 2)
|
|
--! Adder 3, 16 bit carry lookahead low adder.
|
|
a3low : adder
|
|
generic map (16,carry_logic,"NO") -- Carry Look Ahead Logic (More Gates Used, But Less Time)
|
|
-- Dont instantiate Xor gates stage in the adder.
|
|
port map (stage2a0(15 downto 0),stage2p2(15 downto 0),'0','0',stage2a3(15 downto 0),stage2_internalCarry(0));
|
|
--Adder 3, 16 bit carry lookahead high adder.
|
|
a3high : adder
|
|
generic map (16,carry_logic,"NO") -- Carry Look Ahead Logic (More Gates Used, But Less Time)
|
|
-- Dont instantiate Xor gates stage in the adder.
|
|
port map (stage2a0(31 downto 16),stage2p2(31 downto 16),'0',stage2_internalCarry(0),stage2a3(31 downto 16),open);
|
|
--! Adder 4, 16 bit carry lookahead low adder.
|
|
a4low : adder
|
|
generic map (16,carry_logic,"NO") -- Carry Look Ahead Logic (More Gates Used, But Less Time)
|
|
-- Dont instantiate Xor gates stage in the adder.
|
|
port map (stage2p3(15 downto 0),stage2a2(15 downto 0),'0','0',stage2a4(15 downto 0),stage2_internalCarry(1));
|
|
--! Adder 4, 16 bit carry lookahead high adder.
|
|
a4high : adder
|
|
generic map (16,carry_logic,"NO") -- Carry Look Ahead Logic (More Gates Used, But Less Time)
|
|
-- Dont instantiate Xor gates stage in the adder.
|
|
port map (stage2p3(31 downto 16),stage2a2(31 downto 16),'0',stage2_internalCarry(1),stage2a4(31 downto 16),open);
|
|
|
|
end generate dontUseIeee;
|
|
-- Incoming from opcoder.vhd signals into pipeline's stage 0.
|
-- Incoming from opcoder.vhd signals into pipeline's stage 0.
|
stage0mf00 <= m0f0;
|
stage0mf00 <= m0f0;
|
stage0mf01 <= m0f1;
|
stage0mf01 <= m0f1;
|
stage0mf10 <= m1f0;
|
stage0mf10 <= m1f0;
|
stage0mf11 <= m1f1;
|
stage0mf11 <= m1f1;
|
Line 301... |
Line 257... |
stage1p4 <= stage0p4;
|
stage1p4 <= stage0p4;
|
stage1p5 <= stage0p5;
|
stage1p5 <= stage0p5;
|
|
|
|
|
--Outcoming to the rest of the system (by the time i wrote this i dont know where this leads to... jeje)
|
--Outcoming to the rest of the system (by the time i wrote this i dont know where this leads to... jeje)
|
|
--May 31 23:31:56 Guess What!, now I know!!!
|
|
|
cpx <= stage1a0;
|
cpx <= stage1a0;
|
cpy <= stage1a1;
|
cpy <= stage1a1;
|
cpz <= stage1a2;
|
cpz <= stage1a2;
|
|
|
|
|
dp0 <= stage2a3;
|
dp0 <= stage2a3;
|
dp1 <= stage2a4;
|
dp1 <= stage2a4;
|
|
|
-- Looking into the design the stage 1 to stage 2 are the sequences pipe stages that must be controlled in this particular HDL.
|
-- Looking into the design the stage 1 to stage 2 are the sequences pipe stages that must be controlled in this particular HDL.
|
--! Este proceso describe la manera en que se organizan las etapas de pipe.
|
--! Este proceso describe la manera en que se organizan las etapas de pipe.
|
Line 471... |
Line 431... |
end if;
|
end if;
|
end loop displayRom;
|
end loop displayRom;
|
end process tbproc2;
|
end process tbproc2;
|
|
|
end generate tbgen;
|
end generate tbgen;
|
|
dontUseIeee:
|
|
if use_std_logic_signed="NO" generate
|
|
--! Adder 0, 16 bit carry lookahead low adder.
|
|
a0low : adder
|
|
generic map (16,carry_logic,"YES") -- Carry Look Ahead Logic (More Gates Used, But Less Time)
|
|
-- Yes instantiate Xor gates stage in the adder so we can substract on the opcode signal command.
|
|
port map (stage1p0(15 downto 0),stage1p1(15 downto 0),stageSRopcode,'0',stage1a0(15 downto 0),stage1_internalCarry(0));
|
|
--Adder 0, 16 bit carry lookahead high adder.
|
|
a0high : adder
|
|
generic map (16,carry_logic,"YES") -- Carry Look Ahead Logic (More Gates Used, But Less Time)
|
|
-- Yes instantiate Xor gates stage in the adder so we can substract on the opcode signal command.
|
|
port map (stage1p0(31 downto 16),stage1p1(31 downto 16),stageSRopcode,stage1_internalCarry(0),stage1a0(31 downto 16),open);
|
|
--! Adder 1, 16 bit carry lookahead low adder.
|
|
a1low : adder
|
|
generic map (16,carry_logic,"YES") -- Carry Look Ahead Logic (More Gates Used, But Less Time)
|
|
-- Yes instantiate Xor gates stage in the adder so we can substract on the opcode signal command.
|
|
port map (stage1p2(15 downto 0),stage1p3(15 downto 0),'1','0',stage1a1(15 downto 0),stage1_internalCarry(1));
|
|
--! Adder 1, 16 bit carry lookahead high adder.
|
|
a1high : adder
|
|
generic map (16,carry_logic,"YES") -- Carry Look Ahead Logic (More Gates Used, But Less Time)
|
|
-- Yes instantiate Xor gates stage in the adder so we can substract on the opcode signal command.
|
|
port map (stage1p2(31 downto 16),stage1p3(31 downto 16),'1',stage1_internalCarry(1),stage1a1(31 downto 16),open);
|
|
--! Adder 2, 16 bit carry lookahead low adder.
|
|
a2low : adder
|
|
generic map (16,carry_logic,"YES") -- Carry Look Ahead Logic (More Gates Used, But Less Time)
|
|
-- Yes instantiate Xor gates stage in the adder so we can substract on the opcode signal command.
|
|
port map (stage1p4(15 downto 0),stage1p5(15 downto 0),stageSRopcode,'0',stage1a2(15 downto 0),stage1_internalCarry(2));
|
|
--! Adder 2, 16 bit carry lookahead high adder.
|
|
a2high : adder
|
|
generic map (16,carry_logic,"YES") -- Carry Look Ahead Logic (More Gates Used, But Less Time)
|
|
-- Yes instantiate Xor gates stage in the adder so we can substract on the opcode signal command.
|
|
port map (stage1p4(31 downto 16),stage1p5(31 downto 16),stageSRopcode,stage1_internalCarry(2),stage1a2(31 downto 16),open);
|
|
-- Adder Instantiation (Stage 2)
|
|
--! Adder 3, 16 bit carry lookahead low adder.
|
|
a3low : adder
|
|
generic map (16,carry_logic,"NO") -- Carry Look Ahead Logic (More Gates Used, But Less Time)
|
|
-- Dont instantiate Xor gates stage in the adder.
|
|
port map (stage2a0(15 downto 0),stage2p2(15 downto 0),'0','0',stage2a3(15 downto 0),stage2_internalCarry(0));
|
|
--Adder 3, 16 bit carry lookahead high adder.
|
|
a3high : adder
|
|
generic map (16,carry_logic,"NO") -- Carry Look Ahead Logic (More Gates Used, But Less Time)
|
|
-- Dont instantiate Xor gates stage in the adder.
|
|
port map (stage2a0(31 downto 16),stage2p2(31 downto 16),'0',stage2_internalCarry(0),stage2a3(31 downto 16),open);
|
|
--! Adder 4, 16 bit carry lookahead low adder.
|
|
a4low : adder
|
|
generic map (16,carry_logic,"NO") -- Carry Look Ahead Logic (More Gates Used, But Less Time)
|
|
-- Dont instantiate Xor gates stage in the adder.
|
|
port map (stage2p3(15 downto 0),stage2a2(15 downto 0),'0','0',stage2a4(15 downto 0),stage2_internalCarry(1));
|
|
--! Adder 4, 16 bit carry lookahead high adder.
|
|
a4high : adder
|
|
generic map (16,carry_logic,"NO") -- Carry Look Ahead Logic (More Gates Used, But Less Time)
|
|
-- Dont instantiate Xor gates stage in the adder.
|
|
port map (stage2p3(31 downto 16),stage2a2(31 downto 16),'0',stage2_internalCarry(1),stage2a4(31 downto 16),open);
|
|
|
|
end generate dontUseIeee;
|
|
|
|
|
|
|
end uf_arch;
|
end uf_arch;
|
|
|
No newline at end of file
|
No newline at end of file
|