16位超前进位加法器文档格式.docx
《16位超前进位加法器文档格式.docx》由会员分享,可在线阅读,更多相关《16位超前进位加法器文档格式.docx(10页珍藏版)》请在冰豆网上搜索。
加法器的位数越宽,进位链越长,计算延迟越大。
串行进位加法器的计算函数如下
S=a异或b异或c
C=p+qc
P=ab
q=a+b
串行进位加法器的进位链是串行的,进位链的长度直接与加法器的位宽有关。
所以当加法器位宽很大时,进位计算的延迟也将随之变得很大。
1.2.2超前进位加法器
超前进位加法器,不同于串行进位加法器,对于每一位的结果是否有进位,不需要等前一位的进位结果计算出来,而是只要输入AB到来就可以经过一些列的逻辑运算同时计算出各位是否有进位。
理论上讲无论多少位的加法器都可以设计成为超前进位加法器,但是当位数很大的时候,超前进位加法器的逻辑会变得异常复杂,而失去了使用的意义,所以大多数超前进位加法器做到4位,而多于4位的要求,就用多个超前进位加法器级联实现所以在大多数有时间限制的加法器一般选用超前进位加法器。
2主要内容
1.1设计原理
将n个全加器相连可得n位加法器,但是加法时间较长。
解决的方法之一是采用“超前进位产生电路”来同时形成各位进位,从而实现快速加法。
超前进位产生电路是根据各位进位的形成条件来实现的。
四位超前进位加法器的设计:
首先做两个传递函数;
进位产生函数Pi和进位传送函数Qi
Pi=AiBi
Qi=Ai+Bi
则第0级进位的进位端C0就是电路的进位输入Ci
第1级,C1=P1+Q1C0
第2级C2=P2+Q2C1=P2+Q2(P1+Q1C0)=P2+Q2P1+Q2Q1C0
第3级C3=P3+Q3C2=P3+P2Q3+P1Q3Q2+Q3Q2Q1C0
第4级C4=P4+Q4C3=P4+Q4P3+Q4Q3P2+Q4Q3Q2P1+Q4Q3Q2Q1C0
这样经过函数Pi和函数Qi产生一级时间延迟,经过计算C产生一级时延迟,则A,B输入一旦产生即可算出结果
2.2设计思路
进行16位超前进位加法器设计时由于位数太多如果采用全部超前进位则电路的逻辑结构极其复杂并且电路的规模会很大可以考虑用4个4位超前进位加法器来实现16位超前进位加法器的设计。
3设计思想
为了避免过于复杂的逻辑电路采用4个4位的超前进位加法器来实现,若4个4位超级进位加法器串联也可以实现功能但是仍要等4个进位的逐次产生所以本次实验采用了另一种方法
将4个超前进位模块进一步组合,使当A,B及Ci信号到来的时候可以进一步计算出各位间的进位信息。
该模块
设置中间变量值QXi和PXi其中
QXi=Q4Q3Q2Q1
PXi=P4+Q4P3+Q4Q3P2+Q4Q3Q2P1
其中PX,QX为下一级进位计算的输入
QX1=Q4Q3Q2Q1
QX2=Q8Q7Q6Q5
QX3=Q12Q11Q10Q9
QX4=Q16Q15Q14Q13
PX1=P4+Q4P3+Q4Q3P2+Q4Q3Q2P1
PX2=P8+Q8P7+Q8Q7P6+Q8Q7Q6P5
PX3=P12+Q12P11+Q12Q11P10+Q12Q11Q10P9
PX4=P16+Q16P15+Q16Q15P14+Q16Q15Q14P13
C4=PX1+QX1C0
C8=PX2+QX2C4=PX2+QX2(PX1+QX1C0)
=PX2+QX2PX1+QX2QX1C0
同理
C12=PX3+QX3PX2+QX3QX2PX1+QX3QX2QX1C0
C16=PX4+QX4PX3+QX4QX3PX2+QX4QX3QX2PX1+QX4QX3QX2QX1C0
原理图如下
4实现方法
4.1顶层方案图的设计与实现
顶层方案图主要实现16位全加器的逻辑功能,采用VERILOG代码输入方式完成,超前进位加法器电路的是实现基于ASK2CB_110705开发板设计。
在完成代码的功能设计后,经过检测调试,把输入/输出信号通过引脚编号安排到FPGA指定的引脚上去,最终实现芯片的引脚锁定。
4.1.1顶层方案的整体设计
顶层图形文件主要由4个四位超前进位加法器构成,总共33位输入,17位输出。
顶层图形文件由quartus2软件编辑得到相应的模块,顶层图形的整体设计如下图所示:
4.1.2元器件选择和引脚锁定
(1)元器件选择
由于在设计的过程中,硬件设计环境是基于ASK2CB_110705实验板,故采用的目标芯片为alteraep2c8Q2C8芯片
(2)引脚定义
在quartus2上面完成软件的设计之后,把顶层图形文件中的输入/输出信号用引脚编号安排到lteraep2c8Q2C8芯片指定的引脚上去,从而实现芯片的设计电路的引脚锁定,各信号及lteraep2c8Q2C8
4.2功能模块的设计与实现
4.2.1设计描述
将4个超前进位模块进一步组合,使当A,B及Ci信号到来的时候可以进一步计算出各位间的进位信息。
得到的4个4位超前进位加法器的进位端再一次进行超前这样可以大大减少处理时间
为了能够使用有限的实验板资源我们在计算器的前后级加上寄存器串行输入数据并行输出数据。
使用一个控制模块产生控制信号
4.2.2创建RTL代码并得到电路图
重要代码如下
jishuji(clk,set9,jiout);
controlcont(jiout,conout);
regin32regin(fin4,clk,conout[3],conout[2],out32);
add16sadd16(out32[15:
0],out32[31:
16],cin,s1);
reg16reg166(clk,s1,reggout,conout[0]);
regout16regout16(clk,conout[3],conout[1],reggout,out8);
assignfout8=out8;
4.3功能仿真
对于所创建的VERILOG代码进行仿真以便检查其正确性输入为A0-A15B0-B15进位CIN输出S0-S15输出进位C
仿真结果如下
时间输入输入输出和初始进位输出进位
0a=2,b=3,s=5,cin=0,co=0
100a=2,b=3,s=6,cin=1,co=0
200a=2,b=3,s=6,cin=1,co=0
300a=32768,b=32768,s=1,cin=1,co=1
400a=32768,b=32768,s=0,cin=0,co=1
经过功能仿真可以看出代码的逻辑是正确的
4.4编程与下载
在设计完程序后,经过modelsim软件检查没有语法与逻辑错误之后,就可以利用quartus2仿真软件的测试综合与布局布线和编程下载功能,将得到RTL代码文件下载到实验板上得可编程逻辑芯片中。
若电路不能下载则从新修改所需要的代码文件直到能够下载为止。
4.5硬件仿真结果
时序结果如下
时钟频率为15MHZ
Anlysis&
synthesis结果如下
本次设计规模共使用了119个逻辑块寄存器68个逻辑块
5小结
在这次的课程设计中可以发现单纯的进行功能仿真并不能满足现实中的需要,在设计过程中进行硬件测试时会产生很多意外的信号毛刺等。
同时在有些设计中时序不满足的时候可以考虑加上适当的寄存器可以克服时序不满足的情况
参考文献
[1]王爱英.计算机组成与结构(第4版)[M].北京:
清华大学出版社,2006
[2]王冠.VerilogHDL与数字电路设计[M].北京:
机械工业出版社,2005
[3]江国强.EAD技术习题与实验[M].北京:
电子工业出版社,2005
[4]MICHAELJOHNSEBASHIANSMITH专用集成电路北京电子工业出版社20
附录
moduleadd16s(input[15:
0]a,input[15:
0]b,inputcin,output[15:
0]s,outputco);
wire[15:
0]c_tmp;
wire[15:
0]q;
0]p;
wire[3:
0]px,qx;
wirec3,c7,c11,c15;
assignco=c15;
assignp[0]=a[0]&
b[0],p[1]=a[1]&
b[1],p[2]=a[2]&
b[2],p[3]=a[3]&
b[3];
assignp[4]=a[4]&
b[4],p[5]=a[5]&
b[5],p[6]=a[6]&
b[6],p[7]=a[7]&
b[7];
assignp[8]=a[8]&
b[8],p[9]=a[9]&
b[9],p[10]=a[10]&
b[10],p[11]=a[11]&
b[11];
assignp[12]=a[12]&
b[12],p[13]=a[13]&
b[13],p[14]=a[14]&
b[14],p[15]=a[15]&
b[15];
assignq[0]=a[0]|b[0],q[1]=a[1]|b[1],q[2]=a[2]|b[2],q[3]=a[3]|b[3];
assignq[4]=a[4]|b[4],q[5]=a[5]|b[5],q[6]=a[6]|b[6],q[7]=a[7]|b[7];
assignq[8]=a[8]|b[8],q[9]=a[9]|b[9],q[10]=a[10]|b[10],q[11]=a[11]|b[11];
assignq[12]=a[12]|b[12],q[13]=a[13]|b[13],q[14]=a[14]|b[14],q[15]=a[15]|b[15];
assignqx[0]=q[0]&
q[1]&
q[2]&
q[3],qx[1]=q[4]&
q[5]&
q[6]&
q[7],
qx[2]=q[8]&
q[9]&
q[10]&
q[11],qx[3]=q[12]&
q[13]&
q[14]&
q[15];
assignpx[0]=p[3]|(q[3]&
p[2])|(q[3]&
p[1])|(q[3]&
p[0]),
px[1]=p[7]|(q[7]&
p[6])|(q[7]&
p[5])|(q[7]&
p[4]),
px[2]=p[11]|(q[11]&
p[10])|(q[11]&
p[9])|(q[11]&
p[8]),
px[3]=p[15]|(q[15]&
p[14])|(q[15]&
p[13])|(q[15]&
p[12]);
assignc3=px[0]|(qx[0]&
cin),
c7=px[1]|(qx[1]&
px[0])|(qx[1]&
q[0]&
c11=px[2]|(qx[2]&
px[1])|(qx[2]&
qx[1]&
px[0])|(qx[2]&
qx[0]&
c15=px[3]|(qx[3]&
px[2])|(qx[3]&
qx[2]&
px[1])|(qx[3]&
px[0])|(qx[3]&
cin);
assignc_tmp[0]=p[0]|(q[0]&
cin),
c_tmp[1]=p[1]|(q[1]&
p[0])|(q[1]&
q[0]&
cin),
c_tmp[2]=p[2]|(q[2]&
p[1])|(q[2]&
q[1]&
p[0])|(q[2]&
c_tmp[3]=p[3]|(q[3]&
p[2])|(q[3]&
q[2]&
p[1])|(q[3]&
p[0])|(q[3]&
cin);
assigns[3:
0]=a[3:
0]^b[3:
0]^{c_tmp[2:
0],cin};
assignc_tmp[4]=p[4]|(q[4]&
c3),
c_tmp[5]=p[5]|(q[5]&
p[4])|(q[5]&
q[4]&
c_tmp[6]=p[6]|(q[6]&
p[5])|(q[6]&
q[5]&
p[4])|(q[6]&
c_tmp[7]=p[7]|(q[7]&
p[6])|(q[7]&
q[6]&
p[5])|(q[7]&
p[4])|(q[7]&
c3);
assigns[7:
4]=a[7:
4]^b[7:
4]^{c_tmp[6:
4],c3};
assignc_tmp[8]=p[8]|(q[8]&
c7),
c_tmp[9]=p[9]|(q[9]&
p[8])|(q[9]&
q[8]&
c_tmp[10]=p[10]|(q[10]&
p[9])|(q[10]&
q[9]&
p[8])|(q[10]&
c_tmp[11]=p[11]|(q[11]&
p[10])|(q[11]&
q[10]&
p[9])|(q[11]&
p[8])|(q[11]&
c7);
assigns[11:
8]=a[11:
8]^b[11:
8]^{c_tmp[10:
8],c7};
assignc_tmp[12]=p[12]|(q[12]&
c11),
c_tmp[13]=p[13]|(q[13]&
p[12])|(q[13]&
q[12]&
c_tmp[14]=p[14]|(q[14]&
p[13])|(q[14]&
q[13]&
p[12])|(q[14]&
c_tmp[15]=p[15]|(q[15]&
p[14])|(q[15]&
q[14]&
p[13])|(q[15]&
p[12])|(q[15]&
c11);
assigns[15:
12]=a[15:
12]^b[15:
12]^{c_tmp[14:
12],c11};
endmodule