garfield

【原创】四位全加器设计

0
阅读(7425)

涉及背景:

全加器的运用是相当的广泛的,像各种各样的CPU和某些模型机,然而对于快速正确的加法器的设计是相当的重要的,所以在这次课程设计我选择对全加器的设计与实现。

一个器件需要进一步的更新换代,在我所学的知识领域里面,我认为应该需要两个方面,一个是设计,有一个好的设计,它就像一种需求一样,即使这种设计在实际上暂时无法得到应用,但是,在一定时期以后,它是可以实现的。另一个是工艺,对于一个好的设计,由于工艺还没有达到那个水平没法进行对好的设计的实现。所以在这次我使用我所学过的知识进行对这个16位全加器进行设计。

关键技术介绍:

全加器是组合逻辑电路的一个重要的器件,它的设计方式有多种,这里采用逐个进位即串行进位和超前进位即并行进位综合设计。

全加器是实现两个一位二进制数及低位来的进位数相加,即将三个一位二进制数相加,求得和数及向高位进位的逻辑电路。

超前进位:是在低位没有完成计算就已经进位,这种设计比起串行进位方式设计的电路延时小,特别是多位的全加器,但设计原理相对较难。

串行进位:是等到低位计算完毕后才产生进位,这种方式设计的电路延时较大,在多位的运算中延时是较大的但设计简单易懂。

Max+plusII是Altera公司推出的的第三代PLD开发系统(Altera第四代PLD开发系统被称为:QuartusII,主要用于设计新器件和大规模CPLD/FPGA).使用MAX+PLUSII的设计者不需精通器件内部的复杂结构。设计者可以用自己熟悉的设计工具(如原理图输入或硬件描述语言)建立设计,Max+PLusII把这些设计转自动换成最终所需的格式。其设计速度非常快。对于一般几千门的电路设计,使用Max+PLusII,从设计输入到器件编程完毕,用户拿到设计好的逻辑电路,大约只需几小时。设计处理一般在数分钟内内完成。特别是在原理图输入等方面,Max+PLusII被公认为是最易使用,人机界面最友善的PLD开发软件,特别适合初学者使用。

Ø 设计过程

设计原理:

加法器是数字系统中的基本逻辑器件。例如:为了节省资源,减法器和硬件乘法器都可由加法器来构成。但宽位加法器的设计是很耗费资源的,因此在实际的设计和相关系统的开发中需要注意资源的利用率和进位速度等两方面的问题。多位加法器的构成有两种方式:并行进位和串行进位方式。并行进位加法器设有并行进位产生逻辑,运算速度快;串行进位方式是将全加器级联构成多位加法器。通常,并行加法器比串行级联加法器占用更多的资源,并且随着位数的增加,相同位数的并行加法器比串行加法器的资源占用差距也会越来越大。

全加器可对两个多位二进制数进行加法运算,同时产生进位。当两个二进制数相加时,较高高位相加时必须加入较低位的进位项(Ci),以得到输出为和(S)和进位(C0)。

clip_image002

全加器原理图

A

B

Ci

S

CO

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

全加器增值表

设计过程:

1、设计思路:

四位加法器可以采用四个一位全加器级连成串行进位加法器,实现框图如下图所示,其中 CSA为一位全加器。显然,对于这种方式,因高位运算必须要等低位进位来到后才能进行,因此它的延迟非常可观,高速运算肯定无法胜任。
clip_image003

通过对串行进位加法器研究可得:运算的延迟是由于进位的延迟。基于此,减小进位的延迟对提高运算速度非常有效。下图是减少了进位延迟的一种实现方法。 可见,将迭代关系去掉,则各位彼此独立,进位传播不复存在。因此,总的延迟是两级门的延迟,其高速也就自不待言。

clip_image004

2实现代码(VHDL):

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_arith.all;

use ieee.std_logic_unsigned.all;

entity add is

port(a,b:in std_logic_vector(3 downto 0);

cin:in std_logic;

s:out std_logic_vector(3 downto 0);

cout:out std_logic);

end add;

architecture beh of add is

begin

process(a,b,cin)

variable x:std_logic_vector(3 downto 0);

variable m,n,l:integer;

begin

m:=conv_integer(a);

n:=conv_integer(b);

l:=m+n+conv_integer(cin);

x:=conv_std_logic_vector(l,4);

s<=x(3 downto 0);

cout<=x(3);

end process;

end beh;

clip_image006

Ø 总结

设计总结:

在本次课题程序设计中,我学到了很多东西,通过本次课题程序设计,无论在理论上还是在实践中,我的计算机应用水平得到了很大的提升,这对于今后的工作和学习都是一种巨大的财富。也使我明白,在以后的学习中,要不断的完善自己的知识体系结构,注意理论与实践的结合,学知识关键是要学活,而不能死记死搬书本上的知识,关键是要会灵活应用,这样所学到的东西才真正的学以致用,才达到了学习的真正目的!

参考文献:

王永军、李景华《数字逻辑与数字系统(第3版)》电子工业出版社

陈书开、王毅等《计算机组成与系统结构》武汉:武汉大学出版社,2005.8

王毓银、陈鸽、杨静、赵亦松《数字电路逻辑设计》北京:高等教育出版社,2006

罗克露、单立军、刘辉、俸志刚《计算机组成原理》电子工业出版社