1、半加器
首先我们看看半加器的真值表
a | b | co | so |
---|---|---|---|
0 | 0 | 0 | 1 |
0 | 1 | 0 | 1 |
1 | 1 | 1 | 0 |
由真值表我们可以得到RTL图
verilog代码:
module half_add(a,b,so,co);//半加器
input a,b;//定义两个输入
output so,co;//so为和值的输出,co为进位数据的输出
assign so=a^b;//根据真值表可得so为a,b异或逻辑后的结果
assign co=a&b;//根据真值表可得co为a,b与逻辑后的结果
endmodule
这里用modelsim进行仿真
testbench文件:
`timescale 1ns/1ps//时延单位为1ns,时延精度为1ps
module half_add_tb;
//定义激励信号,对应连接到测试模块的输入端口,寄存器型
reg signal_a;
reg signal_b;
//定义待检测信号,对应连接到测试模块的输出端口,网线型
wire signal_so;
wire signal_co;
//例化测试模块
half_add U0(
.a(signal_a),
.b(signal_b),
.so(signal_so),
.co(signal_co)
);//对应连接,端口名关联法
//产生激励
initial//初始
begin//按照真值表给a,b赋值
signal_a=0;signal_b=0;
#100;//电平维持100ns
signal_a=0;signal_b=1;
#100;//电平维持100ns
signal_a=1;signal_b=0;
#100;//电平维持100ns
signal_a=1;signal_b=1;
#100;//电平维持100ns
$stop;//停止
end
endmodule
仿真结果:
仿真结果符合预期要求。
2、全加器
全加器真值表
a | b | in | sum | cout |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 0 | 1 | 1 | 0 |
0 | 1 | 0 | 1 | 0 |
0 | 1 | 1 | 0 | 1 |
1 | 0 | 0 | 1 | 0 |
1 | 0 | 1 | 0 | 1 |
1 | 1 | 0 | 0 | 1 |
1 | 1 | 1 | 1 | 1 |
在这里我们采用上述半加器构成一个全加器
顶层代码:
module full_add(a,b,in,sum,cout);
input a,b;//两个数据输入
input in;//进位输入
output sum;//和输出
output cout;//进位输出
wire sum_b;
wire in_a;
wire co1,co2;//定义网络线
half_add U1(.a(a),.b(b),.so(sum_b),.co(co2));
half_add U2(.a(in),.b(sum_b),.so(sum),.co(co1));
assign cout = co1|co2;
endmodule
这里用modelsim进行仿真
testbench文件:
`timescale 1ns/1ps//时延单位为1ns,时延精度为1ps
module full_add_tb;
//定义激励信号,对应连接到测试模块的输入端口,寄存器型
reg signal_a;
reg signal_b;
reg signal_in;
//定义待检测信号,对应连接到测试模块的输出端口,网线型
wire signal_sum;
wire signal_cout;
//例化测试模块
full_add U0(
.a(signal_a),
.b(signal_b),
.in(signal_in),
.sum(signal_sum),
.cout(signal_cout)
);//对应连接,端口名关联法
//产生激励
initial//初始
begin//按照真值表给a,b赋值
signal_a=0;signal_b=0;signal_in=0;
#100;//电平维持100ns
signal_a=0;signal_b=0;signal_in=1;
#100;//电平维持100ns
signal_a=0;signal_b=1;signal_in=0;
#100;//电平维持100ns
signal_a=0;signal_b=1;signal_in=1;
#100;//电平维持100ns
signal_a=1;signal_b=0;signal_in=0;
#100;//电平维持100ns
signal_a=1;signal_b=0;signal_in=1;
#100;//电平维持100ns
signal_a=1;signal_b=1;signal_in=0;
#100;//电平维持100ns
signal_a=1;signal_b=1;signal_in=1;
#100;//电平维持100ns
$stop;//停止
end
endmodule
仿真结果:
仿真结果符合预期要求。