1. 一位全加器
2. 二进制加法原理
两个N位二进制补码相加,为防止溢出时导致计算结果错误,可将这两个加数先进行符号位扩展,变为N+1位二进制数,然后相加,结果亦取N+1位,可保证运算结果正确。
根据多位加法器原理可知,对于两个N bit二进制补码数相加,可利用N个一位全加器搭建而成。
当control为0时,执行A+B;当control为1时,执行A-B。
采用HDL描述多位加法器或多位减法器时,并不需要先构造一个全加器,再按照上述电路图搭建,而是符号位扩展后直接用“+”或“-”即可。
通常情况下,用Vivado综合,加法器会用查找表、进位链等资源实现,但可通过设置综合属性USE_DSP48使得加法器用DSP48实现。
reg sout <= (!op)? (ain+bin):(ain-bin);
3. 复数加法
在某些场合需要执行复数加法运算。复数加法的原理很简单,实部和实部相加得到和的实部;虚部和虚部相加得到和的虚部。
(a)采用了两个加法器,并行执行实部和虚部的加法
(b)采用一个加法器,通过分时复用,分别求和。显然,前者在速度上有优势,后者在资源上有优势。
4. 加法树和加法链
在很多应用场合都会涉及多个数相加求和。
s = a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9
左图是一个三级加法树,每级加法器的位宽依次增加,防止溢出导致计算错误。全流水,从输入到输出需要三个时钟周期。显然将此结构推广,如果要求N个数的和,则需要ceil(log2(N))级加法树。
右图是加法链结构,为了正确相加,从输入到输出需要7个时钟周期(Latency)。相较于加法树,此结构时序稍显复杂,但结构中每个加法器的等级是一致的。