Soy un desarrollador de software que está aprendiendo más sobre FPGA / VHDL y me pregunto si usar lenguajes secuenciales por mucho tiempo hace que sea más difícil pensar en el hardware.
Mi pregunta es sobre la conexión de componentes y estoy seguro de que esto es algo muy básico, pero no puedo encontrar una respuesta adecuada.
Suponga que tengo un componente ALU que tiene como entrada dos elementos de datos de 8 bits A (0-7) B (0-7) y una salida O (0-7), así como una operación para realizar "OP". Tendrá una entrada de reloj también "CLK". Tiene el código en una declaración "if rising_edge (clk)"
Ahora entiendo que la salida del componente se establecerá solo en el flanco ascendente del reloj, o muy poco después de esto debido a retrasos en la propagación.
Todo bien.
Sin embargo, también tengo un componente de memoria.
Esto tiene la dirección A0-10, las entradas de datos D0-7 y un CLK. En el borde ascendente del reloj, almacena los datos en la dirección.
Sin embargo, hay un problema aquí. En el borde ascendente del reloj, la salida de la ALU aún no está lista , así que, ¿qué almacenará la memoria? Parece que sería un poco aleatorio en cuanto a si obtiene la salida nueva o la antigua de la ALU dependiendo de la rapidez con la que logre cambiar. En términos de código, tenemos una condición de carrera que depende de si la ALU genera los datos primero o si el componente de memoria logra muestrear esos datos primero.
Mis preguntas son 1) ¿Es este un problema real o me estoy perdiendo algo? 2) Si no es un problema, ¿cómo funciona? 3) Si es un problema, ¿cómo lo resuelvo (los principios generales están bien)?