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;