数字电路 多功能ALU设计实验
Posted Ice丨shine
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数字电路 多功能ALU设计实验相关的知识,希望对你有一定的参考价值。
本实验要求设计一个具有8种运算功能的32位ALU,并能够产生运算结果的表示:结果为零标志ZF(Zero Flag)、进借位标志位CF()溢出标志OF(Overflow Flag)、符号位标志SF(Sign Flag)和奇偶标志PF(Parity Flag),标志位值解释见代码。ALU通过4根控制线ALU_OP[2:0]来选择其8种功能,功能见表所示,多余的8位用于后继运算的拓展备用。
图中ALU_OP应该是三位,忽略最左侧的0
程序代码
module ALU(
input [31:0]A,
input [31:0]B,
output reg [31:0]F,
output reg ZF,
output reg OF,
output reg SF,//符号标志
output reg PF,//奇偶标志
output reg CF,//进位/借位标志
input [2:0]ALU_OP
);
always @(*)
begin
OF=0;
CF=0;
case(ALU_OP)
3'b000://按位与
begin
F=A&B;
end
3'b001:F=A|B;//按位或
3'b010:F=A^B;//按位异或
3'b011://按位或非
begin
F=A|B;
F=~F;
end
3'b100://算术加
begin
CF,F=A+B;
OF=F[31]^CF;
end
3'b101://算术减
begin
CF,F=A-B;
OF=F[31]^CF;
CF=~CF;
end
3'b110://比较,A<B时出1,其他出0
begin
if(A<B) F=1;
else F=0;
end
3'b111:F=B<<A;//B逻辑左移A所指定的位数
endcase
end
always @(*)
begin
if(F==0) ZF=1;
else ZF=0;
end
always @(*)
begin
SF=F[31];
if(^F==0) PF=1;
else PF=0;
end
endmodule
测试代码
module ALU_test;
// Inputs
reg [31:0] A;
reg [31:0] B;
reg [2:0] ALU_OP;
// Outputs
wire [31:0] F;
wire ZF;
wire OF;
wire SF;
wire PF;
wire CF;
// Instantiate the Unit Under Test (UUT)
ALU uut (
.A(A),
.B(B),
.F(F),
.ZF(ZF),
.OF(OF),
.SF(SF),
.PF(PF),
.CF(CF),
.ALU_OP(ALU_OP)
);
initial begin
// Initialize Inputs
A = 0;
B = 0;
ALU_OP = 0;
// Wait 100 ns for global reset to finish
#10 A = 32'h0000_0010;B = 32'h0000_0011;ALU_OP = 3'b000;//按位与
#10 A = 32'h0000_0003;B = 32'h0000_0607;ALU_OP = 3'b001;//按位或
#10 A = 32'h8000_0000;B = 32'h8000_0001;ALU_OP = 3'b010;//按位异或
#10 A = 32'h7FFF_FFFF;B = 32'h7FFF_FFF1;ALU_OP = 3'b011;//按位或非
#10 A = 32'h3FFF_FFFF;B = 32'hFFFF_FFFF;ALU_OP = 3'b100;//算术加,有溢出
#10 A = 32'h0000_1010;B = 32'h0000_0001;ALU_OP = 3'b100;//算术加,无溢出
#10 A = 32'h8000_0000;B = 32'hFFFF_FFFF;ALU_OP = 3'b101;//算术减
#10 A = 32'hFFFF_FFFF;B = 32'h8000_0000;ALU_OP = 3'b110;//比较,A大
#10 A = 32'h8000_0000;B = 32'h8000_0000;ALU_OP = 3'b110;//比较,相等
#10 A = 32'h0000_0001;B = 32'h8000_0000;ALU_OP = 3'b110;//比较,A小
#10 A = 32'h1234_5678;B = 32'h3333_2222;ALU_OP = 3'b111;//B逻辑左移A位,全0
#10 A = 32'h0000_0001;B = 32'h3333_2222;ALU_OP = 3'b111;//B逻辑左移A位
// Add stimulus here
end
endmodule
仿真波形请各位自行设计实验项进行实验,这里就不放图了
软件采用ISE14.7
以上是关于数字电路 多功能ALU设计实验的主要内容,如果未能解决你的问题,请参考以下文章