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

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

a b co so
0 0 0 1
0 1 0 1
1 1 1 0

由真值表我们可以得到RTL图
FPGA——verilog实现加法器(详细)_第1张图片
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

仿真结果:
FPGA——verilog实现加法器(详细)_第2张图片
仿真结果符合预期要求。

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

在这里我们采用上述半加器构成一个全加器
FPGA——verilog实现加法器(详细)_第3张图片
顶层代码:

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

仿真结果:
FPGA——verilog实现加法器(详细)_第4张图片
仿真结果符合预期要求。

你可能感兴趣的:(FPGA,verilog)