D flip flop con reinicio disparado de nivel asíncrono

0

Ref: Está haciendo una ¿Se puede reiniciar el flip flop con nivel asíncrono?

Mi código:

always @ ( posedge clock, posedge rst)
begin
if(rst) q = 1'b0 ;
else q = d ;
end

Forma de onda:

error:

Entre 100 y 150 ns, la salida siguió a la entrada d, aunque no había ningún borde de reloj. En otras palabras, se comportó como un cierre.

Quería hacer un d flip flop disparado por flanco positivo con un reinicio desencadenado de nivel positivo asíncrono, que tuve éxito después de examinar el enlace de referencia anterior.

Antes de esto, estaba usando el código dado arriba. Como puede ver, la única diferencia es que he usado la asignación de bloqueo, mientras que la referencia utiliza la asignación de no bloqueo.

Ahora sé que la asignación sin bloqueo programa los valores en contraste con la asignación de bloqueo. Sin embargo, no puedo entender cómo afecta esto a mi diseño. En otras palabras, ¿puede alguien explicar paso a paso o con poco detalle por qué cambiar el bloqueo no bloqueado por el bloqueo resulta en un diseño incorrecto?

Además, también probé este código:

always @ ( posedge clock, rst)
begin
if(rst) q = 1'b0 ;
else q = d ;
end

que también dio lugar a un diseño erróneo. Pero por qué, no pude entender.

Gracias.

    

1 respuesta

2

La mejor respuesta para bloquear o no bloquear las asignaciones de flip-flops ya se responde en Stack Overflow aquí . Esa respuesta también hace referencia a un artículo de Cliff Cummings, aquí .

Ahora, el código para su segundo intento siempre resultará en el comportamiento que se muestra en la forma de onda, incluso con asignaciones no bloqueantes:

always @(posedge clock, rst)
begin
  if (rst) q <= 1'b0 ;
  else     q <= d ;
end

Esto se debe a que la lista de sensibilidad para la señal rst es incorrecta. La palabra clave posedge solo se aplica a la señal inmediatamente a la derecha de la palabra clave y no a las siguientes señales después de la coma. @(posedge clock, rst) es equivalente a @(posedge clock, posedge rst, negedge rst) . La condición else se evaluará en el borde decreciente de rst , que no se desea.

Una buena herramienta de alineación, sintetizador o LEC (comprobación lógica equivalente) debe marcar el desencadenante de borde doble en rst como un problema; posible como advertencia.

    
respondido por el Greg

Lea otras preguntas en las etiquetas