verilog
Bloques de procedimiento
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.