32位ALU设计

设计思路及代码

module ALU32(
ALUcont,A,B,
zero,result
	);
    input [31:0] A,B;
    input [2:0] ALUcont;
    output reg[31:0] result;
    output reg zero;
    
always@(*)
begin
    case(ALUcont)
        //AND
        3'b000:
            begin
            result=A&B;
            zero=(result==0)?1:0;
            end
        //OR
        3'b001:
            begin
            result=A|B;
            zero=(result==0)?1:0;
            end
        //+
        3'b010:
            begin
            result=A+B;
            zero=(result==0)?1:0;
            end
        //not used
        //3'b011:
        //AND !
        3'b100:
            begin
         	result=A&(~B);
            zero=(result==0)?1:0;
            end
        //OR !
        3'b101:
            begin
            result=A|(~B);
            zero=(result==0)?1:0;
            end
        //-
        3'b110:
            begin
            result=A-B;
            zero=(A==B)?1:0;
            end
        //SLT
        3'b111:
            begin
                if(A[31]==1&&B[31]==0)
                    result=1;
                else if(A[31]==0&&B[31]==0)
                    result=0;
                else 
                    result=(A<B)?1:0;
                zero=(result==0)?1:0;
            end
    endcase
end
endmodule        
    

测试代码及表格补全

TestALUcontABresultzero
ADD 0+020000000000000000000000001
ADD 0+(-1)200000000FFFFFFFFFFFFFFFF0
ADD 1+(-1)200000001FFFFFFFF000000001
ADD FF+12000000FF00000001000001000
SUB 0-060000000000000000000000001
SUB 0-(-1)600000000FFFFFFFF000000010
SUB 1-160000000100000001000000001
SUB 100-160000010000000001000000ff0
SLT 0,070000000000000000000000001
SLT 0,170000000000000001000000010
SLT 0,-1700000000FFFFFFFF000000001
SLT 1,070000000100000000000000001
SLT -1,07FFFFFFFF00000000000000010
AND FFFFFFFF,FFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFF0
AND FFFFFFFF,123456780FFFFFFFF12345678123456780
AND 12345678,8765432101234567887654321022442200
AND 00000000,FFFFFFFF000000000FFFFFFFF000000001
OR FFFFFFFF,FFFFFFFF1FFFFFFFFFFFFFFFFFFFFFFFF0
OR 12345678,8765432111234567887654321977557790
OR 00000000,FFFFFFFF100000000FFFFFFFFFFFFFFFF0
OR 00000000,0000000010000000000000000000000001
module ALU32_test(
    );
    reg [2:0] ALUcont;
    reg [31:0] A,B;
    wire [31:0] result;
    wire zero;
    ALU32 alu(ALUcont,A,B,zero,result); 
    initial
    begin
    //add
        ALUcont=3'b010;
        A=32'h00000000;
        B=32'h00000000;
    #20 A=32'h00000000;
        B=32'hffffffff;
    #20 A=32'h00000001;
        B=32'hffffffff;
    #20 A=32'h000000ff;
        B=32'h00000001;
    //sub
    #20 ALUcont=3'b110;
        A=32'h00000000;
        B=32'h00000000;
    #20 A=32'h00000000;
        B=32'hffffffff;
    #20 A=32'h00000001;
        B=32'h00000001;
    #20 A=32'h00000100;
        B=32'h00000001;
    //slt
    #20 ALUcont=3'b111;
        A=32'h00000000;
        B=32'h00000000;
    #20 A=32'h00000000;
        B=32'h00000001;
    #20 A=32'h00000000;
        B=32'hffffffff;
    #20 A=32'h00000001;
        B=32'h00000000;
    #20 A=32'hffffffff;
        B=32'h00000000;
    //and
    #20 ALUcont=3'b000;
        A=32'hffffffff;
        B=32'hffffffff;
    #20 A=32'hffffffff;
        B=32'h12345678;
    #20 A=32'h12345678;
        B=32'h87654321;
    #20 A=32'h00000000;
        B=32'hffffffff;
    //or
    #20 ALUcont=3'b001;
        A=32'hffffffff;
        B=32'hffffffff;
    #20 A=32'h12345678;
        B=32'h87654321;
    #20 A=32'h00000000;
        B=32'hffffffff;
    #20 A=32'h00000000;
        B=32'h00000000;
    end
endmodule
    

仿真波形图

678;
B=32’h87654321;
#20 A=32’h00000000;
B=32’hffffffff;
#20 A=32’h00000000;
B=32’h00000000;
end
endmodule

仿真波形图

image-20210318081357819

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值