4 votos

¿Es correcto utilizar tanto el eje ascendente como el descendente en este diseño VHDL?

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

8voto

jfmessier Puntos 223

Sí, se puede, pero no es recomendable. Tendrás que hacer que el hardware sintetice al doble de la velocidad de reloj actual: un bus de 100MHz tiene que configurarse a 200MHz porque los datos sólo tienen la mitad de tiempo para propagarse. De hecho, lo has hecho DDR .

Parece que, en realidad, no está entendiendo cómo funciona un proceso. Todas las salidas dentro de un proceso son programado que se presentará en la salida al siguiente ciclo de reloj . Así que todo lo que codificas dentro de ese proceso está ocurriendo en realidad en paralelo y debe estabilizarse antes de que llegue el siguiente reloj, que es cuando se contabilizarán las salidas.

1voto

Chris Miller Puntos 2552

El código que usted ha equivocado funcionará si la pieza de destino tiene esta capacidad. Como puedes invertir el reloj y utilizar el flanco ascendente, lo hará. Sin embargo, el tiempo puede no ser lo que usted desea.

No necesita WriteEnable, DataIn en la sensibilidad del proceso.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X