VHDL: mapa de puertos en error de proceso

-1

Estoy diseñando una ALU en VHDL. En otro archivo llamado adder16bit, he diseñado mi sumador y quiero usarlo de diferentes maneras, por ejemplo, si ALU_OP es ADD, quiero que lo haga además, si es SUB, quiero que se reste, etc. Estoy usando una declaración de caso para detectar cómo usar el sumador de la manera adecuada. Aparentemente, la asignación de puertos con diferentes entradas en cada caso no funciona y ahora estoy atascado.

Los errores que estoy recibiendo:

  

Error (10500): error de sintaxis VHDL en ALU.vhd (26) cerca del texto "puerto"; esperando "(", o "'", o "."
  Error (10500): Error de sintaxis VHDL en ALU.vhd (35) cerca del texto ";"; esperando ":=", o "<="
  Error (10500): Error de sintaxis VHDL en ALU.vhd (38) cerca del texto "puerto"; esperando "(", o "'", o "."
  Error (10500): Error de sintaxis VHDL en ALU.vhd (47) cerca del texto ";"; esperando ":=", o "<="
  Error (10500): Error de sintaxis VHDL en ALU.vhd (50) cerca del texto "puerto"; esperando "(", o "'", o "."
  Error (10500): Error de sintaxis VHDL en ALU.vhd (59) cerca del texto ";"; esperando ":=", o "<="
  Error (10500): Error de sintaxis VHDL en ALU.vhd (62) cerca del texto "puerto"; esperando "(", o "'", o "."
  Error (10500): Error de sintaxis VHDL en ALU.vhd (63) cerca del texto ";"; esperando ")", o ","
  Error (10500): Error de sintaxis VHDL en ALU.vhd (65) cerca del texto "= >"; esperando "(", o "'", o "."
  Error (10500): Error de sintaxis VHDL en ALU.vhd (66) cerca del texto "= >"; esperando "(", o "'", o "."
  Error (10500): Error de sintaxis VHDL en ALU.vhd (102) cerca del texto "puerto"; esperando "(", o "'", o "."
  Error (10500): Error de sintaxis VHDL en ALU.vhd (103) cerca del texto ";"; esperando ")", o ","
  Error (10500): Error de sintaxis VHDL en ALU.vhd (111) cerca del texto ";"; esperando ":=", o "<="

código:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity ALU is
    port(
        ALU_A, ALU_B : in STD_LOGIC_VECTOR(15 downto 0); 
        ALU_output : out STD_LOGIC_VECTOR(15 downto 0);
        ALU_OP : in STD_LOGIC_VECTOR(4 downto 0)
    );
end ALU;
architecture behavioral of ALU is
    signal Nflag, Zflag, Cflag, Vflag : STD_LOGIC;
    signal flagsRegister : STD_LOGIC_VECTOR(15 downto 0);
component adder16bit
    port(
        adder_input_A, adder_input_B : in STD_LOGIC_VECTOR(15 downto 0);
        adder_output : out STD_LOGIC_VECTOR(15 downto 0);
        carry_in : in STD_LOGIC;
        N, Z, C, V : out STD_LOGIC
    );
end component;
begin
    process(ALU_OP)
    begin
        case ALU_OP is
            when "00000" => --problems!
                normalAddition: adder16bit port map(
                    ALU_A => adder_input_A,
                    ALU_B => adder_input_B,
                    ALU_output => adder_output,
                    '0' => carry_in,
                    Nflag => N,
                    Zflag => Z,
                    Cflag => C,
                    Vflag => V
                );
                flagsRegister <= "000000000000" & N & Z & C & V;
            when "00001" =>
                normalSubtraction: adder16bit port map(
                    ALU_A => adder_input_A,
                    not(ALU_B) => adder_input_B,
                    ALU_output => adder_output,
                    '1' => carry_in,
                    Nflag => N,
                    Zflag => Z,
                    Cflag => C,
                    Vflag => V
                );
                flagsRegister <= "000000000000" & N & Z & C & V;
            when "00010" =>
                addWithCarry: adder16bit port map(
                    ALU_A => adder_input_A,
                    ALU_B => adder_input_B,
                    ALU_output => adder_output,
                    flagsRegister(1) => carry_in,
                    Nflag => N,
                    Zflag => Z,
                    Cflag => C,
                    Vflag => V
                );
                flagsRegister <= "000000000000" & N & Z & C & V;
            when "00011" =>
                subtractWithCarry: adder16bit port map(
                    ALU_A => adder_input_A;
                    not(ALU_B) => adder_input_B;
                    ALU_output => adder_output;
                    flagsRegister(1) => carry_in,
                    Nflag => N,
                    Zflag => Z,
                    Cflag => C,
                    Vflag => V
                );
                flagsRegister <= "000000000000" & N & Z & C & V;
            when "00100" =>
                ALU_output <= STD_LOGIC_VECTOR(unsigned(ALU_A) + 1);
            when "00101" =>
                ALU_output <= STD_LOGIC_VECTOR(unsigned(ALU_A) - 1);
            when "00110" =>
                ALU_output <= ALU_A and ALU_B;
            when "00111" =>
                ALU_output <= ALU_A or ALU_B;
            when "01000" =>
                ALU_output <= ALU_A xor ALU_B;
            when "01001" =>
                ALU_output <= SHIFT_LEFT(unsigned(ALU_A), ALU_B(3 downto 0));
                flagsRegister <= "000000000000" & flagsRegister(3) & flagsRegister(2) & ALU_A(15) & flagsRegister(0); --bit 15 gets shifted into C flag
            when "01010" =>
                ALU_output <= SHIFT_RIGHT(unsigned(ALU_A), ALU_B(3 downto 0));
                flagsRegister <= "000000000000" & flagsRegister(3) & flagsRegister(2) & ALU_A(0) & flagsRegister(0); --bit 0 gets shifted into C flag
            when "01011" =>
                flagsRegister <= "000000000000" & flagsRegister(3) & flagsRegister(2) & '1' & flagsRegister(0);
            when "01100" =>
                flagsRegister <= "000000000000" & flagsRegister(3) & flagsRegister(2) & '0' & flagsRegister(0);
            when "01101" =>
                --set interrupt
                null;
            when "01110" =>
                --clear interrupt
                null;
            when "01111" =>
                ALU_out <= ALU_A;
            when "10000" =>
                LWandSW: adder16bit port map(
                    ALU_A => adder_input_A;
                    ALU_B => adder_input_B;
                    ALU_output => adder_output;
                    '0' => carry_in;
                    Nflags => N,
                    Zflags => Z,
                    Cflags => C,
                    Vflags => V
                    );
            when others =>
                null;
        end case;
    end process;
end behavioral;
    
pregunta gilianzz

1 respuesta

5

No puede crear una instancia de una entidad dentro de un proceso.

Use su declaración case para seleccionar qué señales se envían a una instancia de la entidad adder16bit .

    
respondido por el scary_jeff

Lea otras preguntas en las etiquetas