Buscar..


Sintaxis

  • always @ (posedge clk) comienza / * sentencias * / finaliza
  • always @ (negedge clk) inicio / * sentencias * / fin
  • always @ (registro de posición o restablecimiento de posición) // puede sintetizar con menos eficiencia que el restablecimiento sincrónico

Contador simple

Un contador utilizando una inicialización de flip-flop estilo FPGA:

module counter(
    input clk,
    output reg[7:0] count
)
initial count = 0;
always @ (posedge clk) begin
    count <= count + 1'b1;
end

Un contador implementado utilizando restablecimientos asíncronos adecuados para la síntesis ASIC:

module counter(
  input            clk,  
  input            rst_n, // Active-low reset
  output reg [7:0] count
)
always @ (posedge clk or negedge rst_n) begin
  if (~rst_n) begin
    count <= 'b0;
  end
  else begin
    count <= count + 1'b1;
  end
end

Los bloques de procedimientos en estos ejemplos incrementan el count en cada flanco ascendente del reloj.

Asignaciones no bloqueantes

Una asignación sin bloqueo ( <= ) se utiliza para la asignación dentro de bloques always sensibles al borde. Dentro de un bloque, los nuevos valores no son visibles hasta que se haya procesado todo el bloque. Por ejemplo:

module flip(
    input clk,
    input reset
)
reg f1;
reg f2;

always @ (posedge clk) begin
  if (reset) begin // synchronous reset
    f1 <= 0;
    f2 <= 1;
  end
  else begin
    f1 <= f2;
    f2 <= f1;
  end
end
endmodule

Observe el uso de asignaciones no bloqueantes ( <= ) aquí. Dado que la primera asignación no surte efecto hasta después del bloqueo del procedimiento, la segunda asignación cumple con los objetivos y en realidad intercambia las dos variables, a diferencia de una asignación de bloqueo ( = ) o asignaciones en otros idiomas; f1 aún tiene su valor original en el lado derecho de la segunda asignación en el bloque.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow