算术逻辑单元ALU(Verilog HDL虚拟实验)

Verilog HDL实现算术逻辑单元(ALU)

一、 ALUop与对应运算关系

需要进行描述的ALU运算器:
在这里插入图片描述

ALUop运算功能描述SRSVSLM3M2M1M0S1S0
0000F=X传送X010000000
0001F=X+Y加法010000100
0010F=X-Y减法010011000
0011F=X &Y逻辑与010000101
0100F=X or Y逻辑或010000110
0101F=X ⊕Y逻辑异或010000111
0110F=X/2算术右移100000000
0111F=2X左移001000000
1000F=!X逻辑非010001111
1001F=X+1加1010010000
1010F=X-1减1010001100
1011F=X+Y+Cin带进位加法010100100
1100F=X-Y-Cin带进位减法010101000

二、实现方法

wire [3:0]ALUop = S[12:9];//M2
wire [3:0]M;
wire [1:0]SW;
wire Cin=S[8];
wire SR;
wire SV;
wire SL;
wire [3:0] X = S[7:4];
wire [3:0] Y = S[3:0];
logic [4:0]result;
/************* The logic of this experiment *************/
wire [3:0] A,B,F;
wire C0;
always@(ALUop[3:0])
 begin
  case(ALUop[3:0])  //F=X;
   4'b0000:begin
	 SW[1:0]=2'b00;
	 M[3:0]=4'b0000;
	 SV=1'b1;
	 
	 SR=1'b0;
	 SL=1'b0;
     end
	4'b0001: begin  //F=X+Y
	 SW[1:0]=2'b00;
	 M[3:0]=4'b0001;
	 SV=1'b1;
	 SR=1'b0;
	 SL=1'b0;
	        end
	4'b0010: begin	//F=X-Y 
	   SW[1:0]=2'b00;
      SV=1'b1;
      M[3:0]=4'b0110;
      SR=1'b0;
	   SL=1'b0;		
				end
	4'b0011:begin     //F=X &Y
	     SV=1'b1;
		  SW[1:0]=2'b01;
		  M[3:0]=4'b0001;
		  SR=1'b0;
		  SL=1'b0;
		  end
	4'b0100:begin   // F=X or Y
	    SV=1'b1;
		 SW[1:0]=2'b10;
		 M[3:0]=4'b0001;
		 SR=1'b0;
		 SL=1'b0;
		 end
	4'b0101:begin       //F=X ^Y
	   SV=1'b1;
		SW[1:0]=2'b11;
		M[3:0]=4'b0001;
		SL=1'b0;
		SR=1'b0;
		end
	4'b0110:begin     //F=X/2
	   SR=1'b1;
		SV=1'b0;
		SL=1'b0;
		SW[1:0]=2'b00;
		M[3:0]=4'b0000;
		end
	4'b0111:begin
	  SL=1'b1;    //F=2X
	  SV=1'b0;
	  SR=1'b0;
	  SW[1:0]=2'b00;
		M[3:0]=4'b0000;
	  end
	 4'b1000:begin  //F=!X
	  SV=1'b1;
	  SW[1:0]=2'b11;
	  M[3:0]=4'b0011;
	  SL=1'b0;
	  SR=1'b0;
	  end
	 4'b1001:begin  //F=X+1
	  SV=1'b1;
	  M[3:0]=4'b0100;
	  SL=1'b0;
	  SR=1'b0;
	  SW[1:0]=2'b00;
	  end
	 4'b1010:begin  //F=X-1
	  SV=1'b1;
	  M[3:0]=4'b0011;
	  SL=1'b0;
	  SR=1'b0;
	  SW[1:0]=2'b00;
	  end
	 4'b1011:begin //F=X+Y+Cin
	  SV=1'b1;
	  M[3:0]=4'b1001;
	  SL=1'b0;
	  SR=1'b0;
	  SW[1:0]=2'b00;
	  end
	  4'b1100:begin  //F=X-Y-Cin
	  SV=1'b1;
	  M[3:0]=4'b1010;
	  SL=1'b0;
	  SR=1'b0;
	  SW[1:0]=2'b00;
	  end
	  default:begin
	  SV=1'b0;
	  M[3:0]=4'b0000;
	  SL=1'b0;
	  SR=1'b0;
	  SW[1:0]=2'b00;
	  end
	  endcase
	  end
	 
assign C0 = (Cin & M[3] | M[2]);
wire sign, zero, overflow, carryOut;
assign A[3]=SR & X[3] | X[3] & SV | SL &X[2] ;
assign A[2]=SR & X[3] | X[2] & SV | SL &X[1];
assign A[1]=SR & X[2] | X[1] & SV | SL &X[0] ;
assign A[0]=SR & X[1] | X[0] & SV | SL &1'b0 ;
assign B[3] =(M[0] & Y[3]) | (M[1] & !Y[3]) ;
assign B[2] =M[0] & Y[2] | M[1] & !Y[2] ;
assign B[1] =M[0] & Y[1] | M[1] & !Y[1] ;
assign B[0] =M[0] & Y[0] | M[1] & !Y[0] ;


always_comb
 begin 
  case({SW[1:0]})
   2'b00: result=A+B+C0;
	2'b01: result=X & B;
	2'b10: result=X |B;
	2'b11: result=X ^ B;
	default:result={(5){1'b0}};
	endcase
end

assign carryOut=result[4];
assign F[3:0] = result[3:0];  
assign sign = F[3];
assign zero = (F==0) ? 1 : 0;  // ~|F;
assign overflow = (~A[3]) & ~B[3] & F[3] | (A[3]) & B[3] & ~F[3] ;

/****** Internal signal assign to output port *******/
assign L[3:0]  = B[3:0];
assign L[12:9] = F;
assign L[29:26] = {M[0],M[1],M[2],M[3]};
assign L[24:23] =SW[1:0];
assign L[21:18] = {sign, zero, overflow, carryOut};
assign L[32:30]={SR,SV,SL};
  • 3
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Best-Wishes

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值