He intentado mucho pasar una señal que se encuentra en una entidad de nivel superior, a una entidad de bajo nivel como puerto de entrada y hacer algunas operaciones en esa señal y dejar que los cambios ocurran a la señal principal.
Aquí acabo de usar inc_tb.vhd (como módulo de nivel superior) que tiene una señal llamada PC y inc.vhd (como módulo de bajo nivel) que obtiene la PC e incrementarla en uno al borde del reloj. Pero cualquier cosa que haga, la PC obtiene el valor 'X'. ¿Cómo puedo hacer esto?
Este es el inc.vhd (módulo de bajo nivel):
library ieee;
use ieee.numeric_std.all;
use ieee.std_logic_1164.all;
use work.types.all;
entity inc is
port(
clk : in std_logic;
pc_in : in std_logic_vector(11 downto 0);
pc_out : out std_logic_vector(11 downto 0)
);
end entity;
architecture behav of inc is
begin
process(clk) is
begin
if(rising_edge(clk)) then
pc_out <= std_logic_vector(unsigned(pc_in) + 1);
end if;
end process;
end architecture;
Este es el inc_tb.vhd (módulo de nivel superior):
library ieee;
use ieee.numeric_std.all;
use ieee.std_logic_1164.all;
use work.types.all;
entity inc_tb is
end entity;
architecture sim of inc_tb is
-- inputs
signal pc : std_logic_vector(11 downto 0) := x"004";
signal clk : std_logic := '0';
begin
-- DUT
CPU_1 : entity work.inc(behav) port map(clk, pc, pc); -- i want this to just increment pc
-- clock event
clk <= not clk after 5 ns;
process is
begin
wait for 10*100 ns;
wait;
end process;
end architecture;