Line 39... |
Line 39... |
--! \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 al mismo tiempo. 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 al mismo tiempo. 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.
|
|
|
entity uf is
|
entity uf is
|
generic (
|
generic (
|
use_std_logic_signed : string := "YES"
|
use_std_logic_signed : string := "NO"
|
);
|
);
|
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.
|
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 : 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.
|
cpx,cpy,cpz,dp0,dp1 : 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.
|
Line 55... |
Line 55... |
|
|
-- 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 stage0opcode : 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.
|
|
|
--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 stage1opcode : 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.
|
|
|
-- 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 141... |
Line 141... |
|
|
useIeee:
|
useIeee:
|
if use_std_logic_signed="YES" generate
|
if use_std_logic_signed="YES" generate
|
-- Adder Instantiation (sTaGe 1)
|
-- Adder Instantiation (sTaGe 1)
|
stage1adderProc:
|
stage1adderProc:
|
process (stage1p0,stage1p1,stage1p2,stage1p3,stage1p4,stage1p5,stage1opcode)
|
process (stage1p0,stage1p1,stage1p2,stage1p3,stage1p4,stage1p5,stageSRopcode)
|
begin
|
begin
|
case (stage1opcode) is
|
case (stageSRopcode) is
|
when '1' => -- Cross Product
|
when '1' => -- Cross Product
|
stage1a0 <= stage1p0-stage1p1;
|
stage1a0 <= stage1p0-stage1p1;
|
stage1a2 <= stage1p4-stage1p5;
|
stage1a2 <= stage1p4-stage1p5;
|
when others => -- Dot Product
|
when others => -- Dot Product
|
stage1a0 <= stage1p0+stage1p1;
|
stage1a0 <= stage1p0+stage1p1;
|
Line 164... |
Line 164... |
if use_std_logic_signed="NO" generate
|
if use_std_logic_signed="NO" generate
|
--! Adder 0, 16 bit carry lookahead low adder.
|
--! Adder 0, 16 bit carry lookahead low adder.
|
a0low : adder
|
a0low : adder
|
generic map (16,"CLA","YES") -- Carry Look Ahead Logic (More Gates Used, But Less Time)
|
generic map (16,"CLA","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.
|
-- 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),stage1opcode,'0',stage1a0(15 downto 0),stage1_internalCarry(0));
|
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.
|
--Adder 0, 16 bit carry lookahead high adder.
|
a0high : adder
|
a0high : adder
|
generic map (16,"CLA","YES") -- Carry Look Ahead Logic (More Gates Used, But Less Time)
|
generic map (16,"CLA","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.
|
-- 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),stage1opcode,stage1_internalCarry(0),stage1a0(31 downto 16),open);
|
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.
|
--! Adder 1, 16 bit carry lookahead low adder.
|
a1low : adder
|
a1low : adder
|
generic map (16,"CLA","YES") -- Carry Look Ahead Logic (More Gates Used, But Less Time)
|
generic map (16,"CLA","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.
|
-- 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));
|
port map (stage1p2(15 downto 0),stage1p3(15 downto 0),'1','0',stage1a1(15 downto 0),stage1_internalCarry(1));
|
Line 184... |
Line 184... |
port map (stage1p2(31 downto 16),stage1p3(31 downto 16),'1',stage1_internalCarry(1),stage1a1(31 downto 16),open);
|
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.
|
--! Adder 2, 16 bit carry lookahead low adder.
|
a2low : adder
|
a2low : adder
|
generic map (16,"CLA","YES") -- Carry Look Ahead Logic (More Gates Used, But Less Time)
|
generic map (16,"CLA","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.
|
-- 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),stage1opcode,'0',stage1a2(15 downto 0),stage1_internalCarry(2));
|
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.
|
--! Adder 2, 16 bit carry lookahead high adder.
|
a2high : adder
|
a2high : adder
|
generic map (16,"CLA","YES") -- Carry Look Ahead Logic (More Gates Used, But Less Time)
|
generic map (16,"CLA","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.
|
-- 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),stage1opcode,stage1_internalCarry(2),stage1a2(31 downto 16),open);
|
port map (stage1p4(31 downto 16),stage1p5(31 downto 16),stageSRopcode,stage1_internalCarry(2),stage1a2(31 downto 16),open);
|
-- Adder Instantiation (Stage 2)
|
-- Adder Instantiation (Stage 2)
|
--! Adder 3, 16 bit carry lookahead low adder.
|
--! Adder 3, 16 bit carry lookahead low adder.
|
a3low : adder
|
a3low : adder
|
generic map (16,"CLA","NO") -- Carry Look Ahead Logic (More Gates Used, But Less Time)
|
generic map (16,"CLA","NO") -- Carry Look Ahead Logic (More Gates Used, But Less Time)
|
-- Dont instantiate Xor gates stage in the adder.
|
-- Dont instantiate Xor gates stage in the adder.
|
Line 246... |
Line 246... |
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.
|
--! Todas las señales internas en las etapas de pipe, en el momento en que la entrada rst alcanza el nivel rstMasterValue, se colocan en '0'. Nótese que, salvo stage0opcode<=stage1opcode, las señales que vienen desde la entrada hacia los multiplicadores en la etapa 0 y desde la salida de los multiplicadores desde la etapa0 hacia la etapa 1, no están siendo descritas en este proceso, la explicación de es simple: Los multiplicadores que se están instanciado tienen registros a la entrada y la salida, permitiendo así, registrar las entradas y registrar los productos o salidas de los multiplicadores, hacia la etapa 1 o etapa de sumadores/restadores.
|
--! Todas las señales internas en las etapas de pipe, en el momento en que la entrada rst alcanza el nivel rstMasterValue, se colocan en '0'. Nótese que, salvo stageMopcode<=stageSRopcode, las señales que vienen desde la entrada hacia los multiplicadores en la etapa 0 y desde la salida de los multiplicadores desde la etapa0 hacia la etapa 1, no están siendo descritas en este proceso, la explicación de es simple: Los multiplicadores que se están instanciado tienen registros a la entrada y la salida, permitiendo así, registrar las entradas y registrar los productos o salidas de los multiplicadores, hacia la etapa 1 o etapa de sumadores/restadores.
|
|
|
uf_seq: process (clk,rst)
|
uf_seq: process (clk,rst)
|
begin
|
begin
|
|
|
if rst=rstMasterValue then
|
if rst=rstMasterValue then
|
stage0opcode <= '0';
|
stageMopcode <= '0';
|
stage1opcode <= '0';
|
stageSRopcode <= '0';
|
|
|
stage2a2 <= (others => '0');
|
stage2a2 <= (others => '0');
|
stage2p3 <= (others => '0');
|
stage2p3 <= (others => '0');
|
stage2p2 <= (others => '0');
|
stage2p2 <= (others => '0');
|
stage2a0 <= (others => '0');
|
stage2a0 <= (others => '0');
|
Line 268... |
Line 268... |
stage2p3 <= stage1p3;
|
stage2p3 <= stage1p3;
|
stage2p2 <= stage1p2;
|
stage2p2 <= stage1p2;
|
stage2a0 <= stage1a0;
|
stage2a0 <= stage1a0;
|
|
|
-- Opcode control sequence
|
-- Opcode control sequence
|
stage0opcode <= opcode;
|
stageMopcode <= opcode;
|
stage1opcode <= stage0opcode;
|
stageSRopcode <= stageMopcode;
|
|
|
end if;
|
end if;
|
end process uf_seq;
|
end process uf_seq;
|
|
|
|
|