目录
前言
在完成实验的时候,注意到实验相关的参考代码很少,可能是题目进行了更新,在这里把我自己的代码(实验五到八)发出来提供给学弟学妹们参考。实验一到四内容都很简单,只是一些基础知识,站内也有人发布,就不再赘述。(提示:老师提供的文档内容非常细致,其实多看文档就能学会如何完成实验,鼓励大家独立完成)
我最后拿到的成绩是最高分,希望写的内容对大家有所帮助。
实验目标及任务
目标:
- 掌握一位全加器的工作原理和逻辑功能
- 掌握串行进位加法器的工作原理和进位延迟
- 掌握减法器的实现原理
- 掌握加减法器的设计方法
- 掌握ALU基本原理及在CPU中的作用
- 掌握ALU的设计方法;
任务:
- 采用原理图方式设计4位加/减法器
- 实现4位ALU及应用设计
实验内容与结果记录
(在完成实验基础上额外完成步骤六)
步骤一到四为使用vivado的基础操作,老师已在文档中给出,根据文档操作即可。
步骤五:
源代码:
module adder_1bit( input wire a, input b, input ci, output wire s, co );
and m0 (c1 ,a,b) ;
and m1 (c2 ,b ,ci) ;
and m2 (c3 ,a ,ci) ;
xor m3 (s1 ,a ,b) ;
xor m4 (s , s1,ci) ;
or m5(co ,c1 ,c2,c3) ;
endmodule
激励文件:
module adder_tb( );
reg a; reg b; reg ci;
wire s;
wire co;
adder_1bit u0( .a(a), .b(b), .ci(ci) , .s(s), .co(co) );
initial
begin
a = 1'b0;
b = 1'b0;
ci = 1'b0;
#100;
a = 1'b0;
b = 1'b0;
ci = 1'b1;
#100;
a = 1'b0;
b = 1'b1;
ci = 1'b0;
#100;
a = 1'b0;
b = 1'b1;
ci = 1'b1;
#100;
a = 1'b1;
b = 1'b0;
ci = 1'b0;
#100;
a = 1'b1;
b = 1'b0;
ci = 1'b1;
#100;
a = 1'b1;
b = 1'b1;
ci = 1'b0;
#100;
a = 1'b1;
b = 1'b1;
ci = 1'b1;
#100;
a = 1'b0;
b = 1'b0;
ci = 1'b0;
#100;
end
endmodule
引脚约束文件:
set_property PACKAGE_PIN R1 [get_ports {a}]
set_property PACKAGE_PIN N4 [get_ports {b}]
set_property PACKAGE_PIN M4 [get_ports {ci}]
set_property PACKAGE_PIN G4 [get_ports {s}]
set_property PACKAGE_PIN F6 [get_ports {co}]
set_property IOSTANDARD LVCMOS33 [get_ports {a}]
set_property IOSTANDARD LVCMOS33 [get_ports {b}]
set_property IOSTANDARD LVCMOS33 [get_ports {ci}]
set_property IOSTANDARD LVCMOS33 [get_ports {s}]
set_property IOSTANDARD LVCMOS33 [get_ports {co}]
模拟仿真图像:
下载到开发板上的图片结果:
步骤六:
源代码:
module add_sub_1bit(
input wire a,
input wire b,
input wire ci,
input wire ctrl,
output wire s,
output wire co
);
wire b_xor_ctrl;
// 实现 b 的取反,后面会有ci为ctrl是+1
xor(b_xor_ctrl, b, ctrl);
// 原有的加法器逻辑
wire s1, c1, c2, c3;
and(c1, a, b_xor_ctrl);
and(c2, b_xor_ctrl, ci);
and(c3, a, ci);
xor(s1, a, b_xor_ctrl);
xor(s, s1, ci);
or(co, c1, c2, c3);
endmodule
module add_sub_4bit(
input [3:0] a,
input [3:0] b,
input ctrl,
output [3:0] s,
output co
);
wire c1, c2, c3;
// 使用add_sub_1bit模块实例化四个1位加减法器
add_sub_1bit u0 (.a(a[0]), .b(b[0]), .ci(ctrl), .ctrl(ctrl), .s(s[0]), .co(c1));//只有此处的ci是ctrl,因为取反加一加也是在最末位
add_sub_1bit u1 (.a(a[1]), .b(b[1]), .ci(c1), .ctrl(ctrl), .s(s[1]), .co(c2));
add_sub_1bit u2 (.a(a[2]), .b(b[2]), .ci(c2), .ctrl(ctrl), .s(s[2]), .co(c3));
add_sub_1bit u3 (.a(a[3]), .b(b[3]), .ci(c3), .ctrl(ctrl), .s(s[3]), .co(co));
endmodule
激励文件:
module adder_4bit_tb();
reg [3:0] a, b;
reg ctrl;
wire [3:0] s;
wire co;
add_sub_4bit u0( .a(a), .b(b), .ctrl(ctrl), .s(s), .co(co));
initial
begin
a = 4'b0000;
b = 4'b0000;
ctrl = 1'b0;
#100;
a = 4'b0001;
b = 4'b0001;
ctrl = 1'b0;
#100;
a = 4'b0010;
b = 4'b0010;
ctrl = 1'b0;
#100;
a = 4'b0111;
b = 4'b0011;
ctrl = 1'b1;
#100;
a = 4'b0100;
b = 4'b0100;
ctrl = 1'b1;
#100;
a = 4'b0101;
b = 4'b0101;
ctrl = 1'b1;
#100;
a = 4'b0110;
b = 4'b0110;
ctrl = 1'b1;
#100;
a = 4'b0111;
b = 4'b0111;
ctrl = 1'b0;
#100;
a = 4'b1000;
b = 4'b1000;
ctrl = 1'b0;
#100;
$finish;
end
endmodule
引脚约束文件:
set_property PACKAGE_PIN R1 [get_ports {a[0]}]
set_property PACKAGE_PIN N4 [get_ports {a[1]}]
set_property PACKAGE_PIN M4 [get_ports {a[2]}]
set_property PACKAGE_PIN R2 [get_ports {a[3]}]
set_property PACKAGE_PIN P2 [get_ports {b[0]}]
set_property PACKAGE_PIN P3 [get_ports {b[1]}]
set_property PACKAGE_PIN P4 [get_ports {b[2]}]
set_property PACKAGE_PIN P5 [get_ports {b[3]}]
set_property PACKAGE_PIN U3 [get_ports {ctrl}]
set_property PACKAGE_PIN J4 [get_ports {s[0]}]
set_property PACKAGE_PIN G3 [get_ports {s[1]}]
set_property PACKAGE_PIN G4 [get_ports {s[2]}]
set_property PACKAGE_PIN F6 [get_ports {s[3]}]
set_property PACKAGE_PIN K2 [get_ports {co}]
set_property IOSTANDARD LVCMOS33 [get_ports {a[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {a[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {a[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {a[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {b[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {b[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {b[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {b[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {ctrl}]
set_property IOSTANDARD LVCMOS33 [get_ports {s[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {s[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {s[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {s[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {co}]
模拟仿真图像:
下载到开发板上的图片结果: