Untitled
unknown
verilog
2 years ago
2.7 kB
6
Indexable
module comb_shift #(parameter W=32) ( input [W-1:0] data_in, input [4:0] shamt, input [1:0] control, output reg [W-1:0] data_out ); always @(*) begin case(control) 2'b00: data_out = data_in << shamt; //LSL 2'b01: data_out = data_in >> shamt; //LSR 2'b10: data_out = ($signed(data_in) >>> shamt); //ASR: Filling the leftmost bits with the sign bit of the input data 2'b11: case (shamt % W) //RR: Concatenation Operator is used //Modulo operator is used in case of shamt is larger than the width (W) of data_in 5'b00000: data_out = data_in; //shamt = 0, no shift 5'b00001: data_out = {data_in[0], data_in[W-1:1]}; 5'b00010: data_out = {data_in[1:0], data_in[W-1:2]}; 5'b00011: data_out = {data_in[2:0], data_in[W-1:3]}; 5'b00100: data_out = {data_in[3:0], data_in[W-1:4]}; 5'b00101: data_out = {data_in[4:0], data_in[W-1:5]}; 5'b00110: data_out = {data_in[5:0], data_in[W-1:6]}; 5'b00111: data_out = {data_in[6:0], data_in[W-1:7]}; 5'b01000: data_out = {data_in[7:0], data_in[W-1:8]}; 5'b01001: data_out = {data_in[8:0], data_in[W-1:9]}; 5'b01010: data_out = {data_in[9:0], data_in[W-1:10]}; 5'b01011: data_out = {data_in[10:0], data_in[W-1:11]}; 5'b01100: data_out = {data_in[11:0], data_in[W-1:12]}; 5'b01101: data_out = {data_in[12:0], data_in[W-1:13]}; 5'b01110: data_out = {data_in[13:0], data_in[W-1:14]}; 5'b01111: data_out = {data_in[14:0], data_in[W-1:15]}; //shamt = 15 5'b10000: data_out = {data_in[15:0], data_in[W-1:16]}; 5'b10001: data_out = {data_in[16:0], data_in[W-1:17]}; 5'b10010: data_out = {data_in[17:0], data_in[W-1:18]}; 5'b10011: data_out = {data_in[18:0], data_in[W-1:19]}; 5'b10100: data_out = {data_in[19:0], data_in[W-1:20]}; 5'b10101: data_out = {data_in[20:0], data_in[W-1:21]}; 5'b10110: data_out = {data_in[21:0], data_in[W-1:22]}; 5'b10111: data_out = {data_in[22:0], data_in[W-1:23]}; 5'b11000: data_out = {data_in[23:0], data_in[W-1:24]}; 5'b11001: data_out = {data_in[24:0], data_in[W-1:25]}; 5'b11010: data_out = {data_in[25:0], data_in[W-1:26]}; 5'b11011: data_out = {data_in[26:0], data_in[W-1:27]}; 5'b11100: data_out = {data_in[27:0], data_in[W-1:28]}; 5'b11101: data_out = {data_in[28:0], data_in[W-1:29]}; 5'b11110: data_out = {data_in[29:0], data_in[W-1:30]}; 5'b11111: data_out = {data_in[30:0], data_in[W-1:31]}; //shamt = 31 endcase endcase end endmodule
Editor is loading...