Soy bastante nuevo en el diseño de hardware con VHDL, y creo que estoy cometiendo un error de novato. Estoy haciendo una CPU y mi registerfile es rising_edge triggered. Sin embargo, he tenido un problema. Intentaré poner algo de pseudocódigo para aclararlo
on rising_edge {r0in <= 20; }
CLOCK CYCLE
on rising_edge {r1in <= r0out; }
CLOCK CYCLE
Mi problema es que r1in estaría recibiendo el valor antiguo de r0 en lugar del apropiado 20
. Entonces procedí a cambiar mi código para utilizar falling_edge en lugar de rising_edge sólo para el registerfile. Una versión simplificada está abajo:
process(WriteEnable, DataIn, Clock)
begin
if falling_edge(Clock) then --note the falling_edge instead of rising_edge
if(WriteEnable = '1') then
registers <= DataIn;
end if;
end if;
end process;
DataOut <= registers;
Así que ahora mis registros se activan por el flanco descendente en lugar del flanco ascendente. Todos los casos de prueba que tengo pasan con esta configuración y se sintetiza sin advertencias... pero ¿es esto correcto?
Hago esta pregunta porque hace tiempo que me han dicho que sólo hay que utilizar ambos bordes en un diseño si realmente se sabe lo que se está haciendo. Llevo unas semanas programando en VHDL, así que quiero asegurarme de que este es un caso apropiado para utilizar ambas aristas