FPGA/CPLD芯片价格查询系统
电源监控方案 免费样品申请
发新话题
arm7 里面的

`timescale 1ns/100ps

module Barrel_Shifter(BS_Enable,BS_Input_Bus,BS_Shift_Type,BS_Shift_Amt,BS_Cin,BS_Shift_Output,BS_Cout);

input[31:0] BS_Input_Bus;
input[4:0] BS_Shift_Amt;
input[1:0] BS_Shift_Type;
input BS_Enable;
input BS_Cin;
output BS_Cout;
output[31:0] BS_Shift_Output;

wire[31:0] BS_Input_Bus;
wire[4:0] BS_Shift_Amt;
wire[1:0] BS_Shift_Type;
wire BS_Enable;
wire BS_Cin;
reg BS_Cout;
reg[31:0] BS_Shift_Output;
integer i;

always @(BS_Enable or BS_Input_Bus or BS_Shift_Type or BS_Shift_Amt or BS_Cin)  
   begin
   if (BS_Enable==1'b0)
     begin        
       BS_Shift_Output[31:0]=BS_Input_Bus[31:0];
       BS_Cout=BS_Cin;
     end
   else
   if (BS_Enable==1'b1)                            //If shift needed
     begin
     case(BS_Shift_Type[1:0])                      //Case for Shift type
      2'b00:begin                                  //LSL - Logical Shift Left
        if (BS_Shift_Amt[4:0]==5'b00000)            
         begin                                     //LSL#0 -special case   
           BS_Shift_Output[31:0]=BS_Input_Bus[31:0];
           BS_Cout=BS_Cin;
         end
        else                                           //Shift of nonzero bits
          begin
           for (i=0;i<=31;i=i + 1)                  //for each bit of output check the condition and assign a value  
            begin
             if (BS_Shift_Amt[4:0] > i)            //Condition
                 BS_Shift_Output=1'b0;
             else
                 BS_Shift_Output=BS_Input_Bus[i-BS_Shift_Amt[4:0]];     
            end
           BS_Cout=BS_Input_Bus[31-BS_Shift_Amt[4:0]+1];
          end
        end

      2'b01:begin                                 //LSR - Logic Shift Right
        if (BS_Shift_Amt[4:0]==5'b00000)          //LSR#0 -used to encode LSR#32
         begin
           BS_Shift_Output[31:0]=32'b00000000000000000000000000000000;
           BS_Cout=BS_Input_Bus[31];
         end
        else                                      //Shift of nonzero bits  
         begin
           for (i=0;i<=31;i=i+1)                   //for each bit of output check the condition and assign a value  
            begin
             if (i > 31-BS_Shift_Amt[4:0])        //Condition
                 BS_Shift_Output=1'b0;
             else
                BS_Shift_Output=BS_Input_Bus[i+BS_Shift_Amt[4:0]];   
            end
           BS_Cout=BS_Input_Bus[BS_Shift_Amt[4:0]-1];
          end
        end
      2'b10:begin                                //ASR - Arithmetic Shift Right
        if (BS_Shift_Amt[4:0]==5'b00000)        //ASR#0 -used to encode ASR#32
         begin
           for (i=0;i<=31;i=i+1)
           BS_Shift_Output=BS_Input_Bus[31];
           BS_Cout=BS_Input_Bus[31];
         end
        else                                           //Shift of nonzero bits
          begin
           for (i=0;i<=31;i=i+1)                  //for each bit of output check the condition and assign a value   
            begin
             if (i > 31-BS_Shift_Amt[4:0])       //Condition
                 BS_Shift_Output=BS_Input_Bus[31];
             else
                 BS_Shift_Output=BS_Input_Bus[i+BS_Shift_Amt[4:0]];
           end
           BS_Cout=BS_Input_Bus[BS_Shift_Amt[4:0]-1];     
          end
        end
      2'b11:begin                                //ROR - Rotate Right
        if (BS_Shift_Amt[4:0]==5'b00000)         //Shift of Zero(RRX) - Special case
         begin                                 
           for (i=0;i<=31;i=i+1)
            if (i < 31)
            BS_Shift_Output=BS_Input_Bus[i+1];
            else if (i==31)
            BS_Shift_Output=BS_Cin;
            BS_Cout=BS_Input_Bus[0];
         end
        else                                     //Shift of nonzero bits   
         begin
           for (i=0;i<=31;i=i+1)                  //for each bit of output check the condition and assign a value
            begin
             if (i > 31-BS_Shift_Amt[4:0])       //Condition
                 BS_Shift_Output=BS_Input_Bus[i-31+BS_Shift_Amt[4:0]-1];
             else
                 BS_Shift_Output=BS_Input_Bus[i+BS_Shift_Amt[4:0]];
            end
           BS_Cout = BS_Input_Bus[BS_Shift_Amt[4:0]-1];   
          end
        end
      default:begin
              end  
     endcase                                    // case(BS_Shift_Type[1:0])
       
     end                                        // if (BS_Enable==1'b1)

   end                                          //always
endmodule                                       //module
发新话题