计算机组成原理|多功能ALU设计实验
程序员文章站
2022-07-06 08:21:43
...
多功能ALU设计实验
一、实验目的与要求
-
实验目的:
(1)学习多功能ALU的工作原理,掌握运算器的设计方法
(2)掌握运用Verilog HDL 进行行为描述与建模的技巧和方法 -
实验要求:本实验要求设计一个具有8种运算功能的32位ALU,并能够产生运算结果的标志:结果为零标志ZF(Zero Flag)、溢出标志OF(Overflow Flag)。ALU通过3根控制线ALU_OP[2:0]来选择其8种功能。
功能表:
ALU_OP[2:0] | ALU_OP[2:0] | 功能说明 |
---|---|---|
0000 | and | 按位与运算 |
0001 | or | 按位或运 |
0010 | xor | 按位异或运算 |
0011 | nor | 按位或非运算 |
0100 | add | 算术加运算 |
0101 | sub | 算术减运算 |
0110 | slt | 若A<B,则输出1;否则输出0 |
0111 | sll | B逻辑左移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为最高位进位
aaa@qq.com(*)
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
仿真波形????
四、电路图
上一篇: 生活里的几则冷幽默