Digamos que tengo este diseño, por ejemplo:
library ieee;
use ieee.std_logic_1164.all;
entity adder is
port(x : in std_logic_vector(3 downto 0);
y : in std_logic_vector(3 downto 0);
z : out std_logic_vector(4 downto 0));
end entity adder;
architecture rtl of adder is
signal c : std_logic_vector(3 downto 0);
begin
adder_gen : for i in 0 to 4 generate
half_adder_gen : if i = 0 generate
z(i) <= x(i) xor y(i);
c(i) <= (x(i) and y(i));
end generate half_adder_gen;
full_adder_gen : if 0 < i and i < 4 generate
z(i) <= x(i) xor y(i) xor c(i-1);
c(i) <= (x(i) and y(i)) or ((x(i) or y(i)) and c(i-1));
end generate full_adder_gen;
overflow_gen : if i = 4 generate
z(i) <= c(i-1);
end generate overflow_gen;
end generate;
end architecture rtl;
Generalmente, si ejecuto un diseño como este, lo que veo en la forma de onda es que TODOS los bits de la salida cambian instantáneamente tan pronto como los bits de entrada también cambian. Sin embargo, este comportamiento no es lo que espero en este caso, yo esperaría que los bits de salida y(4) ... y(0)
cambien cuando se conozca el valor de c(i)
, pero ese bit depende del c(i-1)
y así sucesivamente ... ¿Existe? algo que echo de menos entender?