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:
- Habilitable/deshabilitable mediante pin
en - Desplazamiento a izquierda o derecha según
dir - Reset activo-bajo (
rstn) pone la salida a 0 - Dato de entrada controlado por pin
d
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
- Dominar Verilog: Tutorial completo para diseño de circuitos digitales
- Dominar la concatenación en Verilog: Guía práctica
- Comprender las asignaciones en Verilog: tipos, sintaxis y mejores prácticas
- Bloqueante vs. No bloqueante en Verilog: Diferencias clave explicadas
- Dominar las funciones en Verilog para diseño RTL eficiente
- Comprender las Tasks en Verilog: Funciones vs Tasks, sintaxis y uso
- Generador de reloj en Verilog: Guía de diseño e implementación
- Dominar las funciones matemáticas en Verilog para diseño de hardware eficiente
- Dominar $timeformat en Verilog: Control de precisión y visualización
- Comprender e imprimir timescales de Verilog en cualquier alcance
- Dominando la E/S de Archivos en Verilog: Abrir, Leer, Escribir y Cerrar