¿Cómo emitir señales intermedias en VHDL?

0

Tengo el siguiente código, que describe un elemento simple con dos registros y un sumador. También hay algunas señales de control, que son básicamente "habilitaciones de carga" para esos registros.

Cada registro envía su valor a una señal intermedia para enviarlo a la unidad sumadora. Lo que quiero implementar es obtener el valor de cada señal intermedia y conectarla al pin de salida adecuado de los elementos superiores. Sin embargo, no puedo hacer eso porque Xilinx ISE se queja de varios controladores, y simular el diseño en Modelsim genera valores no definidos. ¿Tienes alguna idea de lo que estoy haciendo mal?

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity pe is
  port(
     --Output signals
    DIFF_O      : out std_logic_vector (7 downto 0);
    CB_NEXT_O   : out std_logic_vector (7 downto 0);
    RB_NEXT_O   : out std_logic_vector (7 downto 0);
    --Input signals
    -- Data
    CB_in       : in  std_logic_vector (7 downto 0);
    RB_in       : in  std_logic_vector (7 downto 0);
    -- Control
    EN_SHIFT_CB_I  : in  std_logic;
    EN_SHIFT_RB_I  : in  std_logic;
    EN_DIFF        : in  std_logic;
    CLK_I          : in  std_logic;
    RST_I          : in  std_logic
  );
end pe;

architecture behavioral of pe is

  -- Internal signal definitions
  signal CBR : std_logic_vector(7 downto 0);
  signal RBR : std_logic_vector(7 downto 0);

begin

  process (CLK_I, RST_I)
  begin

    -- Reset subsystems asynchronously
    if (RST_I = '1') then
      CB_NEXT_O <= "00000000";
      RB_NEXT_O <= "00000000";
          DIFF_O <= "00000000";
          CBR <= "00000000";
          RBR <= "00000000";
    elsif (rising_edge(CLK_I)) then
      if (EN_SHIFT_CB_I = '1') then
         CBR <= CB_in;
        elsif (EN_SHIFT_RB_I = '1') then
         RBR <= RB_in;
        end if;
      end if;
  end process;

  -- Calculate AD
  DIFF_O <= std_logic_vector(to_unsigned(abs((to_integer(unsigned(CBR)) - to_integer(unsigned(RBR)))),8)) when (EN_DIFF = '1' and EN_SHIFT_RB_I = '0' and EN_SHIFT_CB_I = '0');
  CB_NEXT_O <= CBR; -- This signal and the next one are what causing issues.
  RB_NEXT_O <= RBR;

end behavioral;
    
pregunta Arkoudinos

0 respuestas

Lea otras preguntas en las etiquetas