Implementar lógica secuencial con bloques always de Verilog
Un artículo previo mostró ejemplos de always para lógica combinacional. El always también se usa principalmente para lógica secuencial con elementos de memoria como flip-flops que retienen valores.
Flip-Flop JK
Un flip-flop JK almacena valores y tiene dos entradas de datos j y k, más reset rstn y clock clk. Tabla de verdad típica implementada con puertas NAND:
| rstn | j | k | q | Comentarios |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | Reset asertado, salida siempre 0 |
| 1 | 0 | 0 | Hold | j=k=0, salida mantiene valor previo |
| 1 | 0 | 1 | 1 | k=1, salida se vuelve 1 |
| 1 | 1 | 0 | 0 | k=0, salida se vuelve 0 |
| 1 | 1 | 1 | Toggle | j=k=1, salida alterna valor actual |
Código Verilog conductual para JK flip-flop:
module jk_ff (
input j, // Entrada J
input k, // Entrada K
input rstn, // Reset asíncrono activo en bajo
input clk, // Clock
output reg q // Salida Q
);
always @ (posedge clk or negedge rstn) begin
if (!rstn) begin
q <= 0;
end else begin
q <= (j & ~q) | (~k & q);
end
end
endmodule
Testbench
Primero declarar variables del testbench e iniciar clock con always simple. Instanciar diseño y conectar puertos con variables testbench. q es wire porque conecta a salida del diseño que la impulsa activamente. Otras entradas son reg para impulsarlas en bloque procedimental initial.
El estímulo inicializa entradas a cero, de-aserta reset tras un tiempo. Un for impulsa valores aleatorios a j y k en tiempos aleatorios. Al terminar, espera y finaliza simulación.
module tb;
reg j, k, rstn, clk;
wire q;
integer i;
reg [2:0] dly;
always #10 clk = ~clk;
jk_ff u0 ( .j(j), .k(k), .clk(clk), .rstn(rstn), .q(q));
initial begin
{j, k, rstn, clk} <= 0;
#10 rstn <= 1;
for (i = 0; i < 10; i = i+1) begin
dly = $random;
#(dly) j <= $random;
#(dly) k <= $random;
end
#20 $finish;
end
endmodule
En la onda de simulación se ve que en flanco positivo de clock, salida q cambia según estado de j y k según tabla de verdad.

Contador Módulo-10
Contadores Módulo (MOD) cuentan hasta cierto número antes de volver a cero. Un contador MOD-N cuenta de 0 a N-1 y vuelve a cero. Requieren típicamente log2N flip-flops. Código Verilog para contador MOD-10 que cuenta en cada clock mientras reset de-asertado:
Parámetros Verilog permiten hacer contador MOD-N escalable.
module mod10_counter (
input clk,
input rstn,
output reg [3:0] out
);
always @ (posedge clk) begin
if (!rstn) begin
out <= 0;
end else begin
if (out == 10) out <= 0;
else out <= out + 1;
end
end
endmodule
Testbench
module tb;
reg clk, rstn;
reg [3:0] out;
mod10_counter u0 ( .clk(clk), .rstn(rstn), .out(out));
always #10 clk = ~clk;
initial begin
{clk, rstn} <= 0;
#10 rstn <= 1;
#450 $finish;
end
endmodule
El contador cuenta de 0 a 9, vuelve a 0 y repite.

Registro de Desplazamiento Izquierdo 4-bit
Registro de desplazamiento izquierdo 4-bit que acepta entrada d en LSB y todos los bits se desplazan izquierda 1. Si d=0 e inicial 0011, próximo flanco clock se vuelve 0110.
module lshift_4b_reg (
input d,
input clk,
input rstn,
output reg [3:0] out
);
always @ (posedge clk) begin
if (!rstn) begin
out <= 0;
end else begin
out <= {out[2:0], d};
end
end
endmodule
Testbench
module tb;
reg clk, rstn, d;
wire [3:0] out;
integer i;
lshift_4b_reg u0 ( .d(d), .clk(clk), .rstn(rstn), .out(out));
always #10 clk = ~clk;
initial begin
{clk, rstn, d} <= 0;
#10 rstn <= 1;
for (i = 0; i < 20; i=i+1) begin
@(posedge clk) d <= $random;
end
#10 $finish;
end
endmodule
Cada bit se desplaza izquierda 1 y nuevo valor de d se aplica a LSB.

Verilog
- Circuito con interruptor: guía práctica de circuitos eléctricos básicos
- Circuitos integrados: Fundamentos de puertas lógicas digitales
- Controladores lógicos programables (PLC): control digital moderno para sistemas industriales
- Comprender el álgebra booleana: de fundamentos lógicos a circuitos digitales
- Dominando la Simplificación Lógica con Mapas de Karnaugh
- Lógica Digital con Realimentación: De Compuertas Deterministas a Multivibradores
- Logre acabados perfectos con las rectificadoras de precisión Okamoto
- Dominando VHDL y Verilog: Escribiendo lógica combinacional y secuencial limpia
- Diseño de Contador Mod-N en Verilog: Módulo Parametrizado y Testbench
- Módulo Contador Gray en Verilog – Generador de Código Gray de 4 Bits
- nv-SRAM 4T2R Totalmente Compatible CMOS usando STI-RRAM con Auto-Inhibición de Carga — Potencia Estática Cero y Alta Velocidad