/shifter_SystemVerilog

Primary LanguageSystemVerilogGNU General Public License v3.0GPL-3.0

Ejemplo de shifter realizado en SystemVerilog

Shifter realizado en Quartus II para implementar en Altera FPGA Cyclone V y simulado en ModelSim-Altera

SHIFTER.jpg

Creamos un modulo para el shifter con las siguientes señales:

a = Señales de entrada del shifter b = Señales de salida del shifter shamt5 = Nos fija la cantidad de bit de corrimiento que queremos realizar sh = Señales de seleccion que nos selecciona la operacion que queremos realizar

module shifter( input logic [31:0] a,  // señales de entrada
                output logic [31:0] y, // Señales de salida
                input logic [4:0] shamt5, // directivas de corrimiento
                input logic [1:0] sh); // High select 
always_comb
      case(sh)
        2'b00: y = a << shamt5;                       // LSL - corrimiento logico a la derecha
        2'b01: y = a >> shamt5;                       // LSR - corrimiento logico a la izquierda
        2'b10: y = {{32{a[31]}}, a} >> shamt5;  // ASR  y = a >>> shamt5; - Corrimiento aritmetico a la derecha
        2'b11: y = {a, a} >> shamt5;                 // ROR - Rotacion hacia derecha
      endcase
endmodule
		

##TestBench

  • Utizamos una escala de 1ns/10ps para la simulacion. Definimos sh1 donde inicializamos las entradas y entre parentesis le ponemos con que señal se corresponde del modulo shifter.
  • Realizamos una simulacion simple fijando la entrada a en 5 decimal (para facilitar la declaracion se utilizo el valor decimal y no el valor binario, aunque las operaciones se realizan en este segundo sistema)
  • Fijamos el valor de corrimiento shmt5 = 2 (sirve la aclaracion anterior).
  • Variamos la señal de entrada de 2 bit's para realizar las operaciones permitidas por el shifter:

00 - corrimiento logico a la derecha 01 - corrimiento logico a la izquierda 10 - Corrimiento aritmetico a la derecha 11 - Rotacion hacia la derecha

`timescale 1ns/10ps

module shifter_test();

	logic [31:0] a;  // señales de entrada
	logic [4:0] shamt5; // directivas de corrimiento
	logic [1:0] sh; // High select
	wire [31:0] y; // Señales de salida
	
shifter sh1	( 
			    	 .a(a), 
				     .shamt5(shamt5),
				     .sh(sh),
				     .y(y)
			    	 );
	
initial 
begin
a = 5; shamt5 = 2; sh= 2'b00; #100;
a = 5; sh = 2'b01; #100;
a = 5; sh = 2'b10; #100;
a = 5; sh = 2'b11; #100;
end
endmodule