FPGA——verilog实现加法器(详细)

1、半加器
首先我们看看半加器的真值表

abcoso
0001
0101
1110

由真值表我们可以得到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、全加器

全加器真值表

abinsumcout
00000
00110
01010
01101
10010
10101
11001
11111

在这里我们采用上述半加器构成一个全加器
在这里插入图片描述
顶层代码:

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

仿真结果:
在这里插入图片描述
仿真结果符合预期要求。

  • 2
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值