ayuda con un codigo VHDL

HOla¡

Pues estoy haciendo una ALU en VHDL y ya la tengo practicamente terminada. El problema es que no puedo simularla por lo siguiente:

He creado la entidad de la ALU y luego he hecho una arquitectura diferente segun la operacion que tenga que realizar.
la operacion que tiene que realizar viene definida por un bit_vector, segun lo que valga en cada momento realiza una u otra.

Pues bien, el problema es que no se como decirle a la ALU en VHDL, que segun la secuencia de entrada del bit que seleciona la operacion, me cambie entre una arquitectura u otra.

Un ejemplo simplificado es el siguiente:

ENTITY alu IS
     PORT (Ci : IN BIT;
     A, B, S: IN BIT_vector (3 downto 0);
     SUM : OUT BIT_vector (3 downto 0);
  CO: buffer BIT);
  END alu;

ARCHITECTURE op1 OF alu IS
  signal n1,n2: bit_vector (4 downto 0);
   signal prov,b2: bit_vector (3 downto 0);
   
BEGIN

-- operacion A+A+1
n1(0)<=ci;   
n2(0)<=ci;
b2<="0001";
   F1:for  n  in a'range generate

   prov(n)<= (a(n) xor b(n) xor n1(n));
   n1(n+1)<= ((a(n) and b(n)) or ((a(n) or b(n)) and n1(n) ));

   SUM(n)<= (prov(n) xor b2(n) xor n2(n));
   n2(n+1)<= ((prov(n) and b2(n)) or ((prov(n) or b2(n)) and n2(n) ));
   
   
end generate;

   co<= n2(4);

end op1;

ARCHITECTURE op2 OF alu IS
  signal n1: bit_vector (4 downto 0);
       
BEGIN

--operacion A-B
n1(0)<='1';   

   F1:for  n  in a'range generate

   SUM(n)<= (a(n) xor b(n) xor n1(n));
   n1(n+1)<= ((a(n) and b(n)) or ((a(n) or b(n)) and n1(n) ));

end generate;

   co<= n1(4);

end op2;

-- Entidad de prueba de smador
entity Tsuma is end Tsuma;

architecture A1_Tsuma of Tsuma is
signal Ci, co : BIT;
signal A, B, S, SUM: bit_vector (3 downto 0);

component C_suma is
  PORT (Ci : IN BIT;
    A, B, S: IN BIT_vector (3 downto 0);
    SUM : OUT BIT_vector (3 downto 0);
CO: buffer BIT);
end component;

for C1:C_suma use entity work.alu(op1);
for C2:C_suma use entity work.alu(op2);

begin

process (S)

begin

if S="1100" then
C1: C_suma port map (ci, a, b,s, sum, co);
elsif S="0110" then
C2: C_suma port map (ci, a, b,s, sum, co);

end if;

a<="0001","0010" after 50ns, "0100" after 100 ns, "0101" after 150 ns;
b<="0010";
ci<='0' ;
S<="1100";


end A1_Tsuma;



en él, genero una arquitectura para la op A+A+1 y otra para A-B y en la entidad de prueba intento decirle que si S vale 1100 utilice la arquitectura op1 y si vale 0110 que utiliza la arquitectura op2. El caso es que el compilador me da un error y no se que hacer.

A ver si algun alma caritativa me orienta sobre como hacer que segun lo que vlaga la señal S utilice una estructura u otra.

Muchisimas gracias y perdon por el tocho [+risas]
si te sirve, te pongo el codigo de la alu de 1 bit que hice el cuatrimestre pasado:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;

entity ALU1bit is
    Port ( a : in  STD_LOGIC;
           b : in  STD_LOGIC;
           CarryIn : in  STD_LOGIC;
           Less : in  STD_LOGIC;
           Operacion : in  STD_LOGIC_VECTOR (1 downto 0);
           BInvert : in  STD_LOGIC;
           Result : out  STD_LOGIC;
           CarryOut : out  STD_LOGIC);
end ALU1bit;

architecture Behavioral of ALU1bit is
component sumador is
   Port ( A : in  STD_LOGIC;
           B : in  STD_LOGIC;
           Cin : in  STD_LOGIC;
           S : out  STD_LOGIC;
           Cout : out  STD_LOGIC);
end component;

signal Resultsum, Op2: STD_LOGIC;

begin

Op2 <= b when BInvert = '0' else not (b);

sum: sumador port map (a,Op2,CarryIn,Resultsum,CarryOut);

Result <= (a and b) when (Operacion = "00") else
          (a or b) when (Operacion = "01" ) else
           Resultsum when (Operacion = "10")   else
           Less;         
   
end Behavioral;


PD: te adjunto el enunciado de la practica, para que sepas que es cada señal y tal.

Adjuntos

yo iba a postear mi codigo pero es identico al de siko xD (acaso iremos a la misma uni? :O)

el tuyo me parece un poco lioso la verdad XD
Buenas, lo que en realidad quieres no es diferentes arquitecturas, si no una sóla arquitectura, y un multiplexor interno que seleccione una u otra operación.
Buenas¡

Pues os comento.

EN primer lugar muchas gracias por el codigo, lo que pasa es que en mi curso NO nos dejan usar librerias, de ahi la complejidad del codigo(mnenuda parrafada para que haga un puto sumador).

Poner un multiplexor interno es lo primero que pense, el problema es que para meter un if o un case me obliga a meter un process y al meter el process me obliga a quitar el generate y a poner un loop.

Al hacer esta operacion el sumador deja de funcionar correctamente

LA duda del post es si se puede hacer este switch entre arquitecturas que comento, porque tambien he pensado en hacer un componente por cada configuracion de la alu pero es que los component4es serian identicos.

de todas formas, el multiplexor de una alu de 4 bits tendria que ser de 16 operaciones ariutmeticas mas otras tantas logicas, con lo cual imaginate el tamaño de la arquitectura que te saldria...


Un saludo y gracias
No tienes que hacer ningún process ni ningún if ni nada, tienes que crearte una nueva entidad que sea un multiplexor, y después hacer algo así:

Si por ejemplo tienes suma, resta, and, or, pones

suma: suma port map (...,a)
resta: resta port map (...,b)
and: and port map (...,c)
or: or port map (...,d)

Y luego la salida final que salga dependiendo del codigo que tengas

multiplexor: mux4_1 port map (a,b,c,d, codigo, salida)

Si en tu caso son 16 entradas pues haces un multiplexor de 16 a 1 o pones varios multiplexores consecutivos.
Ni siquiera te hace falta un componente más. Pon señales de salida para cada operación y metes un process en el que eliges una de las salidas (insisto, puedes seguir teniendo los bucles como los tienes fuera del process).

Te lo digo más que nada por que lo de cambiar de arquitectura tiene otro proposito, que es por ejemplo hacer un modelo de simulacion y otro para sintesis con las mismas entradas/salidas (entidad). Se selecciona la arquitectura en otro sitio (configuration o algo asi, no me acuerdo ahora), y tiene que ser totalmente estatico, nada de if para poder seleccionar (porque ya te digo, tiene otro proposito).
Gracias DemonR, al final he utilizado un mux para la alu y funciona de pm, aunque me ha quedado mas lineas de codigo, pero me da igual...

Gracias a todos [tadoramo]
7 respuestas