Reinicio asíncrono en verilog

2

Soy nuevo en verilog y tengo un poco de problemas para llevarme bien con él.

Leí sobre reinicio asíncrono y síncrono y creo que lo logré, pero al implementar el mismo con verilog no puedo entender una línea de código que vi en este sitio web.

En el código de reinicio asíncrono, ¿por qué estamos usando always @ (posedge clk or posedge reset) en lugar de usar always @ (posedge clk ) ?

Quiero decir, ¿cómo pueden las dos líneas de código diferenciar cuál es asíncrona y cuál es síncrona?

    
pregunta Abhishek Tyagi

3 respuestas

3

siempre @ (señal 1, señal 2 ......) es una construcción utilizada en el modelado de comportamiento.

El código que está presente en el bloque que sigue a esta construcción solo se ejecutará cuando cambie alguna de las señales en la lista de sensibilidad, a saber, la señal 1, la señal 2 ...

Si solo coloca el reloj de posición en la lista, el código se ejecutará solo cuando haya un borde positivo del reloj y no de otra manera. Puede usar esto para crear circuitos temporizados que no responden a ninguna otra señal sino al reloj. Para reinicio síncrono, entonces escribirá

always @ ( posedge clock)
begin
if (reset)  //Do something
else     //Do something else
end

Para su caso, desea reinicio asíncrono. El reinicio asíncrono significa que su circuito debe reiniciarse siempre que la señal de reinicio esté activa 'Independientemente' del reloj. Naturalmente, esto debería incluirse en la lista de sensibilidad.

always @ (posedge clk, negedge reset)
begin
if ( 'reset) //Then reset , since it is active low.
else  // Do something else
end
    
respondido por el Plutonium smuggler
3

El último ejemplo se implementa normalmente de la siguiente manera

always @(posedge clk) begin
   if(reset)
      reg <= 0; //reset condition
   else
      reg <= whatever; //non-reset condition
end

El bloque solo se ejecuta en el flanco ascendente de clk, lo que hace que el reinicio a continuación sea sincrónico.

El restablecimiento asíncrono se agrega a la lista de sensibilidad con una nueva señal: restablecer. Cuando dices:

always @(posedge clk or posedge reset) begin
    if(reset == 1'b1)
       reg <= 0; //reset condition
    else
       reg <= whatever; // non-reset condition
end

Ahora, si el reinicio aumenta independientemente del reloj, puede ingresar la condición de reinicio. Este es un reinicio asíncrono. La palabra clave es "o".

    
respondido por el Doov
1

Brevemente, si solo pone clk en la lista sensible, y primero en la parte del cuerpo de siempre junto con otra asignación, puede encontrar que la operación de restablecimiento solo ocurre en el borde ascendente de clk al igual que otra asignación, lo que significa que es un reinicio síncrono.

Sin embargo, si coloca clk y rst en la lista confidencial, la operación de restablecimiento se realizará cada vez que ingrese un margen de r. En esta situación, la reacción de rst ya no necesita esperar a la siguiente posición de clk. Aunque el reinicio y el reloj pueden ocurrir al mismo tiempo en este tipo de diseño, pero en la mayoría de los casos, son asíncronos.

    
respondido por el fgg1991

Lea otras preguntas en las etiquetas