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

Registro de Desplazamiento Bidireccional de N Bits en Verilog – Diseño e Implementación

En electrónica digital, un registro de desplazamiento es una cascada de flip-flops donde la salida q de uno se conecta a la entrada de datos (d) del siguiente. Como todos trabajan con el mismo reloj, el array de bits almacenado se desplaza una posición. Por ejemplo, un registro de desplazamiento a la derecha de 5 bits con valor inicial 10110 y entrada atada a 0, el siguiente patrón será 01011 y luego 00101.

Diseño

Este diseño de registro de desplazamiento tiene cinco entradas y una salida de n bits, parametrizado con parameter MSB para indicar el ancho. Si n=4, es de 4 bits; si n=8, de 8 bits.

Características clave:

module shift_reg #(parameter MSB=8) (
  input d,      // Dato para el primer flip-flop
  input clk,    // Reloj para todos los flip-flops
  input en,     // Habilitación para activar/desactivar
  input dir,    // Dirección: 0=derecha, 1=izquierda
  input rstn,   // Reset activo-bajo
  output reg [MSB-1:0] out // Valor actual de todos los flip-flops
);
// Bloque always disparado en flanco positivo de reloj
always @ (posedge clk)
  if (!rstn) out <= 0;
  else begin
    if (en) case (dir)
      0 : out <= {out[MSB-2:0], d};  // Desplazamiento derecha
      1 : out <= {d, out[MSB-1:1]};  // Desplazamiento izquierda
    endcase
    else out <= out;
  end
endmodule

Esquema Hardware

Testbench

El testbench verifica la funcionalidad. El diseño se instancia en el módulo superior y las entradas se conducen con diferentes valores.

module tb_sr;
  parameter MSB = 16;
  reg data;
  reg clk;
  reg en;
  reg dir;
  reg rstn;
  wire [MSB-1:0] out;
  // Instanciar diseño (registro 16 bits) pasando MSB
  shift_reg #(MSB) sr0 (
    .d (data), .clk (clk), .en (en), .dir (dir), .rstn (rstn), .out (out)
  );
  // Generar reloj: período = 20ns, freq = 50MHz
  always #10 clk = ~clk;
  // Inicializar variables en tiempo 0
  initial begin
    clk <= 0; en <= 0; dir <= 0; rstn <= 0; data <= 'h1;
  end
  // Estímulo principal
  initial begin
    // 1. Aplicar reset y desactivar después
    rstn <= 0; #20 rstn <= 1; en <= 1;
    // 2. Por 7 ciclos, alternar valor en data
    repeat (7) @ (posedge clk) data <= ~data;
    // 4. Cambiar dirección y alternar data por 7 ciclos más
    #10 dir <= 1;
    repeat (7) @ (posedge clk) data <= ~data;
    // 5. Sin cambios en data por 7 ciclos, solo desplazar
    repeat (7) @ (posedge clk);
    // 6. Finalizar
    $finish;
  end
  // Monitor para depuración
  initial $monitor ("rstn=%0b data=%b, en=%0b, dir=%0b, out=%b", rstn, data, en, dir, out);
endmodule

El período habilitado está resaltado en verde en el log. El cambio de dirección en amarillo. Entrada data constante en azul.

Registro de simulación

ncsim> run
rstn=0 data=1, en=0, dir=0, out=xxxxxxxxxxxxxxxx
rstn=0 data=1, en=0, dir=0, out=0000000000000000
rstn=1 data=1, en=1, dir=0, out=0000000000000000
rstn=1 data=0, en=1, dir=0, out=0000000000000001
rstn=1 data=1, en=1, dir=0, out=0000000000000010
rstn=1 data=0, en=1, dir=0, out=0000000000000101
rstn=1 data=1, en=1, dir=0, out=0000000000001010
rstn=1 data=0, en=1, dir=0, out=0000000000010101
rstn=1 data=1, en=1, dir=0, out=0000000000101010
rstn=1 data=0, en=1, dir=0, out=0000000001010101
rstn=1 data=0, en=1, dir=1, out=0000000001010101
rstn=1 data=1, en=1, dir=1, out=0000000000101010
rstn=1 data=0, en=1, dir=1, out=1000000000010101
rstn=1 data=1, en=1, dir=1, out=0100000000001010
rstn=1 data=0, en=1, dir=1, out=1010000000000101
rstn=1 data=1, en=1, dir=1, out=0101000000000010
rstn=1 data=0, en=1, dir=1, out=1010100000000001
rstn=1 data=1, en=1, dir=1, out=0101010000000000
rstn=1 data=1, en=1, dir=1, out=1010101000000000
rstn=1 data=1, en=1, dir=1, out=1101010100000000
rstn=1 data=1, en=1, dir=1, out=1110101010000000
rstn=1 data=1, en=1, dir=1, out=1111010101000000
rstn=1 data=1, en=1, dir=1, out=1111101010100000
rstn=1 data=1, en=1, dir=1, out=1111110101010000
La simulación finalizó vía $finish(1) en el tiempo 430 NS + 0

Verilog

  1. Dominar Verilog: Tutorial completo para diseño de circuitos digitales
  2. Dominar la concatenación en Verilog: Guía práctica
  3. Comprender las asignaciones en Verilog: tipos, sintaxis y mejores prácticas
  4. Bloqueante vs. No bloqueante en Verilog: Diferencias clave explicadas
  5. Dominar las funciones en Verilog para diseño RTL eficiente
  6. Comprender las Tasks en Verilog: Funciones vs Tasks, sintaxis y uso
  7. Generador de reloj en Verilog: Guía de diseño e implementación
  8. Dominar las funciones matemáticas en Verilog para diseño de hardware eficiente
  9. Dominar $timeformat en Verilog: Control de precisión y visualización
  10. Comprender e imprimir timescales de Verilog en cualquier alcance
  11. Dominando la E/S de Archivos en Verilog: Abrir, Leer, Escribir y Cerrar