El always@
es una lista de sensibilidad y generalmente no una lista de comprobación, es decir, no funciona como un bloque if-else
.
En cambio, indica cuándo el registro / latch especificado en el bloque necesita cambiar de estado, generalmente en un borde del reloj (register) o cambio de nivel (latch).
Si está intentando detectar un borde en una entrada, como en el caso de una detección de interrupción, la forma recomendada es sincronizar el borde con un registro de desplazamiento interno.
Podría ser tan simple como esto:
reg [1:0] det_edge;
wire sig_edge;
assign sig_edge = (det_edge == 2'b10);
always @(posedge clk)
begin
det_edge <= {det_edge[0], input};
end
Luego, puede hacer lo que quiera con la señal de borde, posiblemente como una señal de habilitación para una máquina de estado u otro bloque que haga algo con su dispositivo (como marcar la interrupción).
Por lo tanto, para su aplicación, es posible que desee hacer lo anterior dos veces y luego usar las dos señales de detección de borde para controlar algún otro dispositivo / bloque.
El punto punto a recordar con todo el trabajo de HDL es que HDL significa Lenguaje de descripción de hardware. Es un reemplazo para los esquemas, no para el software.
Para empezar, recomendaría comenzar con el hardware y luego traducirlo en código, es decir, dibujar el esquema y luego escribir el HDL que describe el esquema del circuito.