合工大头歌 计算机体系结构

assign {Cout,S}=A+B+Cin;


reg [7:0]S;

reg Cout;

integer i;

always @(*) begin

    S=0;

    {Cout,S[0]}=A[0]+B[0]+Cin;

    for(i=1;i<=7;i=i+1)

    begin

        {Cout,S[i]}=A[i]+B[i]+Cout;

    end

end


reg [7:0]alu_res;

reg OF;

reg ZF;

reg SF;

reg CF;

integer i;

//减法器相关定义

reg [7:0]C;

always @(*) begin

case(aluop)

    4'b0000:

        begin

            ZF=0;

            OF=0;

            SF=0;

            CF=0;

           

            /*运算部分*/

            for(i=0;i<=7;i=i+1)

                    {CF,alu_res[i]}=A[i]+B[i]+CF;

            /*检验是否溢出*/

            if(CF^((A[7]+B[7])!=alu_res[7]))

                OF=1;

            /*ZF*/

            if(alu_res==0)

                ZF=1;

            /*SF*/

            SF=alu_res[7];

        end

    4'b0001:

        begin

            ZF=0;

            OF=0;

            SF=0;

            CF=0;

            if(B[7]==1) begin

            {C[7],C[6:0]}=~{B[7],B[6:0]}+8'b00000001;

            end

            if(B[7]==0)

                C=~{B[7],B[6:0]}+8'b00000001;

            /*运算部分*/

            for(i=0;i<=7;i=i+1)

                    {CF,alu_res[i]}=A[i]+C[i]+CF;

            /*检验是否溢出*/

            if(CF^((A[7]+C[7])!=alu_res[7]))

                OF=1;

            /*ZF*/

            if(alu_res==0)

                ZF=1;

            /*SF*/

            SF=alu_res[7];

            CF=~CF;

        end

    4'b0010:begin

        ZF=0;

        OF=0;

        SF=0;

        CF=0;

        alu_res=A&B;

        if(alu_res==0)

            ZF=1;

    end

    4'b0011:begin

        ZF=0;

        OF=0;

        SF=0;

        CF=0;

        alu_res=A|B;

        if(alu_res==0)

            ZF=1;

    end

    4'b0100:begin

        ZF=0;

        OF=0;

        SF=0;

        CF=0;

        alu_res=~A;

        if(alu_res==0)

            ZF=1;

    end

    4'b0101:begin

        ZF=0;

        OF=0;

        SF=0;

        CF=0;

        alu_res=A^B;

        if(alu_res==0)

            ZF=1;

    end

    4'b0110:begin

        ZF=0;

        OF=0;

        SF=0;

        CF=0;

        alu_res=A<<B[2:0];

        if(alu_res==0)

            ZF=1;

    end

    4'b0111:begin

        ZF=0;

        OF=0;

        SF=0;

        CF=0;

        alu_res=A>>B[2:0];

        if(alu_res==0)

            ZF=1;

    end

    4'b1000:begin

        ZF=0;

        OF=0;

        SF=0;

        CF=0;

        alu_res=A>>B[2:0];

        alu_res[7:5]={3{A[7]}};

        if(alu_res==0)

            ZF=1;

    end

    4'b1001:begin

        ZF=0;

        OF=0;

        SF=0;

        CF=0;

        alu_res=($signed(A)<$signed(B))?1:0;

        if(alu_res==0)

            ZF=1;

    end

    4'b1010:begin

        ZF=0;

        OF=0;

        SF=0;

        CF=0;

        alu_res=(A<B)?1:0;

        if(alu_res==0)

            ZF=1;

    end

endcase

end



 


reg [15:0] Prod;

always @(*) begin

    if(Signed)

        Prod=$signed(A)*$signed(B);

    else

        Prod=A*B;

end


    reg [7:0]   out;                // 相当于SystemVerilog中“logic [7:0]   out;”

    reg         result_is_zero;     // 相当于SystemVerilog中“logic result_is_zero;”

    always @(*) begin

        case (do_sub)

          0: out = a+b;

          1: out = a-b;

        endcase

        if (out)

          result_is_zero = 0;

        else

          result_is_zero=1;

    end


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值