Verilog: busque dos negedges en el bloque siempre

trato de hacer algo como esto:

always @ (negedge speed_dec or negedge speed_inc)
 begin
  do something
 end

Esto no funciona, ya que la verificación de 2 flancos negativos es demasiado exigente y da como resultado solo verificar el reloj.

Intenté hacer la verificación manualmente:

    reg old_key0;
always @ (KEY[0])
begin
    if(KEY[0] == 1  & old_key0 == 0)
            do something
    old_key0 = KEY[0];
    end

Pero ahora deja de funcionar por completo. ¿Alguien puede detectar el error?

Además, consulte esta pregunta reciente que muestra la forma estándar de detectar bordes entrantes: electronics.stackexchange.com/questions/26474

Respuestas (2)

Es always@una lista de sensibilidad y generalmente no es una lista de verificación, es decir, no funciona como un if-elsebloque.

En su lugar, indica cuándo el registro/bloqueo especificado en el bloque necesita cambiar de estado, normalmente en un borde de reloj (registro) o cambio de nivel (bloqueo).

Si intenta detectar un borde en una entrada, como 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).

Entonces, para su aplicación, es posible que desee hacer lo anterior dos veces y luego usar las dos señales de detección de bordes para controlar algún otro dispositivo/bloque.

El punto clave a recordar con todo el trabajo de HDL es que HDL significa Lenguaje de descripción de hardware. Es un reemplazo para esquemas, no 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 ese esquema de circuito.

ok espero haberte entendido bien. en lugar de entrada, puse KEY[0] allí. También hice otro bloque siempre con el borde para alterar algunos valores. el problema es que tengo dos botones, uno para aumentar y otro para disminuir un valor. Tengo que verificar esto en un solo paso porque, de lo contrario, el compilador se queja de que podría presionar ambos botones al mismo tiempo y alteraría el mismo registro con dos funciones simultáneamente.
su problema no tiene nada que ver con los bordes, tiene todo que ver con qué hacer en una situación en la que se presionan ambos botones. necesita resolver esto en una máquina de estado separada. con dos botones, solo hay cuatro posibles cambios de estado: arriba, abajo, ambos, ninguno. usted necesita averiguar qué hacer con cada uno.

Lo que escribiste es Verilog perfectamente válido. Por ejemplo, un caso en el que un bloque siempre depende de dos aristas es la descripción de un flip-flop con reinicio asíncrono:

wire d;
reg q;
always @ (posedge CLOCK or posedge RESET) begin
    if (RESET) 
        q <= 0;
    else
        q <= d;
end

Otro caso en el que un bloque siempre tiene sensibilidad a múltiples entradas (pero no a sus bordes) es al describir un multiplexor:

wire s, a, b;
reg out;
always @ ( s or a or b ) begin
    case ( s )
        0 : out <= a;
        1 : out <= b;
    endcase
end

Tenga en cuenta que en este caso, aunque out es una variable de registro en Verilog, en realidad se implementará como la salida de la lógica combinatoria, y no se generará ningún flip-flop o latch a partir de este código.

Sin embargo, el hecho de que algo sea Verilog válido no significa que se pueda sintetizar en su dispositivo (supongo que está tratando de sintetizar para un FPGA o CPLD). Si su dispositivo no tiene puertas reales disponibles que puedan realizar la lógica que describe en su Verilog, obtendrá un error de síntesis.

Como dijo Sybreon, a menudo es una buena idea diseñar mentalmente su lógica en términos de los recursos de hardware disponibles en su dispositivo, luego descubrir cómo traducir eso a Verilog, en lugar de simplemente escribir Verilog y luego tratar de descubrir cómo ajustarlo. para hacerlo sintetizable.