VHDL: ¿usando PORT MAP en CASE?

-1
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_unsigned.ALL;

-- Uncomment the following library declaration if using
-- arithmetic functions with Signed or Unsigned values
--use IEEE.NUMERIC_STD.ALL;

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

entity ALU is
Port ( A : in  STD_LOGIC_VECTOR (3 downto 0);
       B : in  STD_LOGIC_VECTOR (3 downto 0);
       S : in  STD_LOGIC_VECTOR (3 downto 0);
       R : in  STD_LOGIC;
       load : in  STD_LOGIC;
       clk : in  STD_LOGIC;
       flags : out  STD_LOGIC_VECTOR (4 downto 0);
       result : out  STD_LOGIC_VECTOR (3 downto 0));

end ALU;

architecture Behavioral of ALU is

signal result1 : std_logic_vector (3 downto 0);
signal c,z : STD_LOGIC;


component topleveladd

Port (
x : in  STD_LOGIC_VECTOR (3 downto 0);
y : in  STD_LOGIC_VECTOR (3 downto 0);
cin : in  STD_LOGIC;
sum : out  STD_LOGIC_VECTOR (3 downto 0);
cout : out  STD_LOGIC);

end component;

begin

stage5 : topleveladd port map(x=>A, y=>B, cin=>c, sum=>result, cout=>z);

end Behavioral;

Estoy tratando de hacer una ALU. Mi plan es hacer todos los circuitos necesarios como el sumador y el sustractor en diferentes módulos. Luego los implementaré en el módulo principal de ALU usando el mapa de puertos. Mi problema es que no sé cómo usar los mapas de puertos para las declaraciones de casos o algo similar. Por ejemplo,

Case S is
when "0000" =>
result <= stage5 : topleveladd port map(x=>A, y=>B, cin=>c, sum=>result, cout=>z); 

Entiendo que esto no funcionará porque stage5 no es un vector.

En conclusión, estoy ejecutando un mapa de puertos y quiero que se muestren los "resultados" de ese mapa de puertos cuando se selecciona un determinado pin a través de S. Con suerte, proporcioné la información adecuada. Lo siento si mi lógica no encaja, ya que tengo muy pocas experiencias con VHDL.

    
pregunta epsilon58

2 respuestas

2

Debe crear una instancia de cada parte de la ALU. AGREGAR, SUBAR, Y, O ... con diferentes vectores de salida sum=>result_add , sub=>result_sub , etc. luego multiplexar las salidas, ya sea en un proceso con un% co_de Declaración%, o fuera de ella usando CASE y WHEN :

result<=result_add WHEN S="0000"
        ELSE result_sub WHEN S="0001"
        ELSE result_and WHEN S="0010"
        ELSE "XXXX";

... etc ...

Tenga en cuenta que los sumadores y los restadores suelen estar combinados.

    
respondido por el TEMLIB
1

Su código e idea tiene varios fallos:

  1. Una declaración case solo se puede incrustar en un proceso o sub rutina.
  2. No puede crear sub módulos en un proceso.
  3. Los sub módulos no están restringidos a un solo valor de retorno, por lo que no puede usar una declaración de instancia como una expresión en el lado derecho como una función.

Consulte la sintaxis correcta en cualquier libro de texto VHDL.

    
respondido por el Paebbels

Lea otras preguntas en las etiquetas