1. 用 Verilog HDL 语言设计一位全加器电路。建立工程,编译,设计仿真波形文件,进行功能仿真测试等,为一位全加器建立符号模块 symbol,供顶层原理图文件调用。
2. 调用一位全加器符号模块,顶层采用原理图方式设计四位加法器,进位方式可采用串行进位或先行进位。
一、实验分析与设计
本实验需要建立两个项目。
第一个项目为full_adder,通过 Verilog HDL 语言编写全加器代码,并依次项目生成符号模块。
第二个项目为四位全加器,通过原理图方式,调用第一个项目建立的full_adder符号模块,连接成四位加法器。
二、程序代码
一位全加器
module full_adder(a,b,cin,sum,cout);
input a, b, cin;
output sum, cout;
assign{cout, sum} = a + b + cin;
endmodule
编译项目后,生成符号文件。
在原理图中,调用生成的符号文件。
将全加器与输入输出符号连接。编译后,按要求分配引脚。
三、ModelSim仿真
TestBench代码sy1.vt
`timescale 1 ps/ 1 ps
module sy1_vlg_tst();
reg a1;
reg a2;
reg a3;
reg a4;
reg b1;
reg b2;
reg b3;
reg b4;
reg cin;
// wires
wire cout_3;
wire sum_0;
wire sum_1;
wire sum_2;
wire sum_3;
sy1 i1 (
.a1(a1),
.a2(a2),
.a3(a3),
.a4(a4),
.b1(b1),
.b2(b2),
.b3(b3),
.b4(b4),
.cin(cin),
.cout_3(cout_3),
.sum_0(sum_0),
.sum_1(sum_1),
.sum_2(sum_2),
.sum_3(sum_3)
);
initial
begin
#20 cin = 1;
#20 a1 = 1;b1 = 0;
#20 a2 = 0;b2 = 1;
#20 a3 = 1;b3 = 0;
#20 a4 = 0;b4 = 1;
#20 $stop;
$display("Running testbench");
end
endmodule
由于ModelSim仿真不支持原理图,只能将原理图转换为 Verilog HDL 文件sy1.v
module sy1(
cin,
b2,
a2,
b3,
a3,
b4,
a4,
a1,
b1,
sum_0,
sum_1,
sum_2,
sum_3,
cout_3
);
input wire cin;
input wire b2;
input wire a2;
input wire b3;
input wire a3;
input wire b4;
input wire a4;
input wire a1;
input wire b1;
output wire sum_0;
output wire sum_1;
output wire sum_2;
output wire sum_3;
output wire cout_3;
wire SYNTHESIZED_WIRE_0;
wire SYNTHESIZED_WIRE_1;
wire SYNTHESIZED_WIRE_2;
full_adder b2v_inst(
.a(a1),
.b(b1),
.cin(cin),
.sum(sum_0),
.cout(SYNTHESIZED_WIRE_0));
full_adder b2v_inst1(
.a(a2),
.b(b2),
.cin(SYNTHESIZED_WIRE_0),
.sum(sum_1),
.cout(SYNTHESIZED_WIRE_2));
full_adder b2v_inst2(
.a(a4),
.b(b4),
.cin(SYNTHESIZED_WIRE_1),
.sum(sum_3),
.cout(cout_3));
full_adder b2v_inst3(
.a(a3),
.b(b3),
.cin(SYNTHESIZED_WIRE_2),
.sum(sum_2),
.cout(SYNTHESIZED_WIRE_1));
endmodule
新建ModelSim项目,导入三个文件
仿真结果如下:a(0101) + b(1010) + cin(1) = sum(0000) + cout(1)。