0
点赞
收藏
分享

微信扫一扫

半加器与全加器verilog

干自闭 2022-03-21 阅读 136
编辑器

半加器和全加器设计

  • 首先我们要了解什么是半加器和全加器:
  • 半加器和全加器都是用于计算二进制加法的单元
  • 区别在于,半加器只有两个输入,即a,b。而全加器则多了一个输入cin,cin是进位输入
  • 所以
  • 半加器: a,b作为输入 sum本位和,cout进位输出作为输出
  • 全加器: a,b,cin(进位输入)作为输入 sum本位和,cout进位输出作为输出
  • 通过查看半加器的真值表我们可以得出,sum本位和是a与b异或门得出,cout是a与b经与门得出

半加器

  • img上代码
module palf_add(
    input a,
    input b,
    output sum,
    output cout
    );
//	方法一
	assign sum = a^b;
	assign cout = a&b;
//	方法二    门级原语设计
	xor u1(sum,a,b);
	and u2(cout,a,b);
//	方法三
    //wire sum,cout;   也可以不定义线网型,wire型为默认
    assign {cout,sum} = a+b;

endmodule
//下面为仿真代码
//仿真代码可以根据真值表
		a = 0;b = 0;#100;
		a = 1;b = 0;#100;
		a = 0;b = 1;#100;
		a = 1;b = 1;#100;
  • 下面看一下半加器设计的电路图

img

  • 半加器的真值表较简单不在展示,根据程序综合后得到半加器波形如图所示:

img

一位全加器设计

  • 真值表如下:

img

img

  • 全加器的设计与半加器同理,可以利用门级电路图来进行程序编写
  • 如图即为一位全加器的逻辑电路图

img

  • 全加器的设计方法具有多种,我们先来看最基础的一种
//方法一
module qwe(a,b,cin,sum,cout
    );
	 input a,b,cin;
	 output reg sum,cout;
//	 reg m1,m2,m3;    定义wire型三个门级输出作为后面门的输入
	 always @(a or b or cin)
	 begin
	 {sum,cout} = a + b + cin;
	 end

endmodule
  • 输出波形图为:

img

  • 下面我们来看第二种方法
//方法二
//利用门级原语设计一位全加器
module qazx(sum,cout,a,b,cin);
	output sum,cout;
	input a,b,cin;
	wire s1,c1,c2;
	xor u1(s1,a,b); //s1输出端口,a,b为输入端口   异或门
	xor u2(sum,s1,cin);
	and u3(c1,a,b);
	and u4(c2,s1,cin);
	or u5(cout,c1,c2);

endmodule
  • 下面是仿真模块中的激励代码
	initial begin
		// Initialize Inputs
		//$为系统任务
		$display("Running testbench");//显示这句话
		$monitor($time,"a=%b,b=%b,cin=%b,---,cout=%b,sum=%b\n",a,b,cin,cout,sum);
		//a=。。。。%表示以二进制形式显示  
		a = 0;b = 0;cin = 0;//初始均为零
		#100 a=1'b0;b=1'b1;cin=1'b0;
		#100 a=1'b1;b=1'b0;cin=1'b0;
		#100 a=1'b1;b=1'b1;cin=1'b0;
		#100 a=1'b0;b=1'b0;cin=1'b1;
		#100 a=1'b0;b=1'b1;cin=1'b1;
		#100 a=1'b1;b=1'b0;cin=1'b1;
		#100 a=1'b1;b=1'b1;cin=1'b1;
		#100 $stop;
	end
//==============================================
//仿真激励代码,与上面效果相同
		a = 0;b = 0;cin = 0;#100;
		a = 1;b = 0;cin = 0;#100;
		a = 0;b = 1;cin = 0;#100;
		a = 0;b = 0;cin = 1;#100;
		a = 1;b = 1;cin = 0;#100;
		a = 0;b = 1;cin = 1;#100;
		a = 1;b = 0;cin = 1;#100;
		a = 1;b = 1;cin = 1;#100;
  • 错误:注意区分“ ’ ”和“ ` ”的区别!!!!!!!!!
  • 下面为仿真结果:

img

  • 由两个方法的综合波形图可知,波形图一致,参照真值表确认无误
  • 本文关于全加器的设计只介绍了两种较简单的方法,如需更多方法设计全加器可以点这里
  • END
举报

相关推荐

0 条评论