Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Industrial programming >> Verilog

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:

rstnjkqComentarios
0000Reset asertado, salida siempre 0
100Holdj=k=0, salida mantiene valor previo
1011k=1, salida se vuelve 1
1100k=0, salida se vuelve 0
111Togglej=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.

Implementar lógica secuencial con bloques always de Verilog

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.

Implementar lógica secuencial con bloques always de Verilog

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.

Implementar lógica secuencial con bloques always de Verilog

Verilog

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