¿Puede alguien explicarme un par de líneas de Verilog?

1

Soy un estudiante que intenta aprender Verilog por mi cuenta con un panel de desarrollo. Esto es sólo un módulo simple y corto. Solo necesito algunas aclaraciones.

module BASIC (CLOCK_50, KEY, LEDG);

input CLOCK_50;
input [3:0] KEY;
output reg [8:0] LEDG;

reg [2:0] key0_dly;

always @(posedge CLOCK_50)
begin
  if (!key0_dly[2] && key0_dly[1])
    LEDG[0] <= ~LEDG[0];
    key0_dly <= {key0_dly[1:0], KEY[0]};
end
endmodule

Ahora conozco la sintaxis básica de Verilog. Mis preguntas serían:

  1. ¿Cuál es el propósito de key0_dly? ¿Por qué la instrucción if comprueba sus 2 bits?

  2. ¿Por qué key0_dly tiene asignados los valores {key0_dly[1:0], KEY[0]} ? ¿Qué hace esa línea?

  3. ¿Esta línea key0_dly <= {key0_dly[1:0], KEY[0]}; está en la instrucción if? ¿Estoy en lo cierto al decir que si no hay un comienzo y un final, entonces, como en C, solo la línea de código que sigue en el bloque if?

pregunta Yage Hu

1 respuesta

2
  
  1. ¿Cuál es el propósito de key0_dly? ¿Por qué la instrucción if comprueba los 2 bits de la misma?
  2.   

Quiere complementar LEDG[0] solo si el desencadenante ha ocurrido durante el bucle anterior pero no hace 2 bucles. A mí me parece simple detección de rebotes / bordes.

  
  1. ¿Por qué key0_dly tiene asignados los valores {key0_dly[1:0], KEY[0]} ? ¿Qué hace esa línea?
  2.   

Desplaza a la izquierda key0_dly un bit, cambiando el valor de KEY[0] in.

  
  1. ¿Está esta línea key0_dly <= {key0_dly[1:0], KEY[0]}; en la instrucción if? ¿Estoy en lo cierto al decir que si no hay un comienzo y un final, entonces, como en C, solo la línea de código que sigue en el bloque if?
  2.   

Suena bien. Pero necesita que el cambio suceda en cada bucle, de lo contrario no habrá manera de desencadenar la condición.

    
respondido por el Ignacio Vazquez-Abrams

Lea otras preguntas en las etiquetas