¿Cómo se da cuenta el siguiente código Verilog?

0

Estaba aprendiendo el lenguaje de descripción de hardware verilog. Estaba un poco confundido con las declaraciones de bloqueo y no bloqueo. ¿Alguien puede decirme en qué se basan los siguientes códigos de verilog? y consejos simples sobre cómo

always@(posedge clk)
begin
   q1=d;
   q2<=q1;
   q3=q2;
end

always@(posedge clk)
begin
   q1<=d;
   q2<=q1;
   q3=q2;
end

Estos son dos códigos diferentes implementados por separado. Creo que FF entra en escena debido a la detección de bordes. Pero no entiendo de qué se trata, ya que tiene una mezcla de declaraciones de bloqueo y no de bloqueo

    

1 respuesta

3

Comencemos con d = 0 q1 = 1 q2 = 2 q3 = 3.

always@(posedge clk)
begin
   q1=d;

q1 obtiene inmediatamente el valor de d = 0.

   q2<=q1;

Asignación sin bloqueo: guarda el valor actual de q1 (que actualmente es el mismo que d = 0)

   q3=q2;

q3 obtiene el valor de sin cambios de q2, = 2

end

En este punto, la asignación sin bloqueo ocurre y q2 obtiene el valor 0.

Supongo que el siguiente bloque siempre está en un módulo diferente; si lo coloca en el mismo módulo solo causará más confusión, ya que volverá a sobrescribir las mismas variables.

Comience con d = 0 q1 = 1 q2 = 2 q3 = 3 de nuevo.

always@(posedge clk)
begin
   q1<=d;
   q2<=q1;

Asignación de colas de q1 a 0 y q2 a 1. Esto ocurre al final del bloque.

   q3=q2;

Establezca q3 en el valor actual de q2, es decir, 2.

end

Finalmente establezca q1 = 0 y q2 = 1.

En general, es un estilo malo mezclar = y < = en el mismo bloque, y en general, para la síntesis siempre debe usar < =. '=' puede ser útil en bancos de pruebas donde se comporta más como un lenguaje de programación imperativo convencional.

    
respondido por el pjc50

Lea otras preguntas en las etiquetas