计算机组成原理|多功能ALU设计实验

多功能ALU设计实验

一、实验目的与要求

  1. 实验目的:
    (1)学习多功能ALU的工作原理,掌握运算器的设计方法
    (2)掌握运用Verilog HDL 进行行为描述与建模的技巧和方法

  2. 实验要求:本实验要求设计一个具有8种运算功能的32位ALU,并能够产生运算结果的标志:结果为零标志ZF(Zero Flag)、溢出标志OF(Overflow Flag)。ALU通过3根控制线ALU_OP[2:0]来选择其8种功能。

功能表:

ALU_OP[2:0]ALU_OP[2:0]功能说明
0000and按位与运算
0001or按位或运
0010xor按位异或运算
0011nor按位或非运算
0100add算术加运算
0101sub算术减运算
0110slt若A<B,则输出1;否则输出0
0111sllB逻辑左移A所指定的位数

二、实验设计与程序代码

module ALU(OP,A,B,F,ZF,CF,OF,SF,PF);
    parameter SIZE = 32;//运算位数
    input [3:0] OP;//运算操作
    input [SIZE:1] A;//左运算数
    input [SIZE:1] B;//右运算数
    output [SIZE:1] F;//运算结果
    output  ZF, //0标志位, 运算结果为0(全零)则置1, 否则置0 
            CF, //进借位标志位, 取最高位进位C,加法时C=1则CF=1表示有进位,减法时C=0则CF=1表示有借位
            OF, //溢出标志位,对有符号数运算有意义,溢出则OF=1,否则为0
            SF, //符号标志位,与F的最高位相同
            PF; //奇偶标志位,F有奇数个1,则PF=1,否则为0
    reg [SIZE:1] F;
    reg C,ZF,CF,OF,SF,PF;//C为最高位进位
    always@(*)
    begin
        C=0;
        case(OP)
            4'b0000:begin F=A&B; end    //按位与
            4'b0001:begin F=A|B; end    //按位或
            4'b0010:begin F=A^B; end    //按位异或
            4'b0011:begin F=~(A|B); end //按位或非
            4'b0100:begin { C,F}=A+B; end //加法
            4'b0101:begin { C,F}=A-B; end //减法
            4'b0110:begin F=A<B; end    //A<B则F=1,否则F=0
            4'b0111:begin F=B<<A; end   //将B左移A位
        endcase
        ZF = F==0;//F全为0,则ZF=1
        CF = C; //进位借位标志
        OF = A[SIZE]^B[SIZE]^F[SIZE]^C;//溢出标志公式
        SF = F[SIZE];//符号标志,取F的最高位
        PF = ~^F;//奇偶标志,F有奇数个1,则F=1;偶数个1,则F=0
    end     
endmodule

三、实验仿真
仿真代码

module Test();
    reg [31:0] A,B;
    reg [3:0] OP;
    initial//初始化,每中运算擦拭两组数据
    begin
        /*按位与*/
            OP=4'b0000;A=32'h0000_0000; B=32'h0000_0001;#50;
            OP=4'b0000;A=32'h0000_0001; B=32'h0000_0001;#50;
        /*按位或*/
            OP=4'b0001;A=32'h0000_0000; B=32'h0000_0001;#50;
            OP=4'b0001;A=32'h0000_0000; B=32'h0000_0000;#50;
        /*按位异或*/
            OP=4'b0010;A=32'h0000_0000; B=32'h0000_0001;#50;
            OP=4'b0010;A=32'h0000_0000; B=32'h0000_0000;#50;
        /*按位或非*/
            OP=4'b0011;A=32'h0000_0000; B=32'h0000_0001;#50;
            OP=4'b0011;A=32'h0000_0000; B=32'h0000_0000;#50;
        /*算术加运算*/
            OP=4'b0100;A=32'h7FFF_FFFF; B=32'h7FFF_FFFF;#50;
            OP=4'b0100;A=32'hFFFF_FFFF; B=32'hFFFF_FFFF;#50;
        /*算术减运算*/
            OP=4'b0101;A=32'h7FFF_FFFF; B=32'h7FFF_FFFD;#50;
            OP=4'b0101;A=32'h7FFF_FFFF; B=32'hFFFF_FFFF;#50;
        /*A<B时,输出1,否则输出0*/
            OP=4'b0110;A=32'h7FFF_FFFF; B=32'h8FFF_FFFF;#50;
            OP=4'b0110;A=32'hFFFF_FFFF; B=32'h7FFF_FFFF;#50;
        /*B逻辑左移A指定的位数*/
            OP=4'b0111;A=32'h0000_0001; B=32'h0000_0001;#50;
            OP=4'b0111;A=32'h0000_0001; B=32'h0000_0008;#50;
    end
    wire [31:0] F;
    wire ZF, CF, OF, SF, PF;
    ALU ALU_test(
        .OP(OP),
        .A(A),
        .B(B),
        .F(F),
        .ZF(ZF),
        .CF(CF),
        .OF(OF),
        .SF(SF),
        .PF(PF)
    );
    
endmodule

仿真波形
《计算机组成原理|多功能ALU设计实验》

四、电路图
《计算机组成原理|多功能ALU设计实验》
《计算机组成原理|多功能ALU设计实验》

    原文作者:无限遐想计划
    原文地址: https://blog.csdn.net/qq_43571150/article/details/103484676
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞