16位移位相加乘法器设计.docx
《16位移位相加乘法器设计.docx》由会员分享,可在线阅读,更多相关《16位移位相加乘法器设计.docx(37页珍藏版)》请在冰豆网上搜索。
16位移位相加乘法器设计
16×16位移位相加乘法器设计(总40页)
本科学生毕业论文
论文题目:
16×16位移位相加乘法器设计
学院:
电子工程学院
年级:
2009级
专业:
集成电路设计与集成系统
姓名:
于昊
学号:
指导教师:
曹贝
2012年6月13日
摘要
随着集成电路设计技术的不断进步,乘法器的芯片设计实现的研究与应用越来越广泛,对乘法器进行ASIC芯片设计,具有设计实现过程简单、所用到的EDA工具完善而且成熟、硬件开销小、易于在VLSI电路或系统级芯片中集成。
通常,数字电路设计的流程对于芯片的实现而言,需要RTL级的HDL描述,并要对各层次的设计进行功能仿真验证,在验证电路能按预期设计功能工作后,即可对RTL级的HDL描述进行综合、优化,形成门级网表。
整个设计流程可称为数字电路的前端设计。
本课题基于移位相加算法的研究,设计16位移位相加乘法器,并在功能仿真通过后,将所设计的VerilogRTL级代码进行综合,采用Synopsys公司DesignCompilerEDA工具进行电路综合,获得16位移位相加乘法器的门级网表与电路实现。
关键词
数字电路设计;移位相加乘法器;综合;
Abstract
Abstractabstractabstractabstractabstractabstractabstractabstractabstractabstractabstractabstractabstractabstractabstractabstractabstractabstractabstractabstractabstractabstractabstractabstractabstractabstractabstractabstractabstractabstractabstractabstractabstract.(英文摘要内容必须与中文摘要完全对应。
英文摘要采用TimesNewRoman小四号字书写,毕业论文、毕业设计行与行之间、段落和层次标题以及各段落之间均为倍行距。
)
Keywords
Keywords;keywords;keywords(英文关键词内容必须与中文关键词完全对应。
英文关键词采用TimesNewRoman小四号字书写,毕业论文、毕业设计行与行之间、段落和层次标题以及各段落之间均为倍行距。
关键词与关键词之间用“;”隔开)
第一章乘法器研究的背景与意义
数字信号处理中需要频繁进行大数据量的乘法运算。
乘法器作为数字信号处理器的重要部件,它的速度直接决定了整个处理器的性能。
本课题采用verilogHDL设计了一个16位移位相加乘法器。
首先介绍了移位相加乘法器的算法以及比较移位相加乘法器,Booth乘法器,WallaceTree乘法器各自的特点。
介绍了本课题在综合时需用到的DesignCompiler(DC)综合工具。
随后提出了自己的乘法器设计架构设计了一个16位移位相加乘法器。
并用DesignCompiler(DC)进行了优化。
所设计的乘法器是16×16位,基于Altera公司的Modelsim平台上用Verilog_HDL软件进行功能仿真,验证了功能正确,达到了预期的目标。
微处理器的发展随着集成电路的迅猛发展而日新月异。
在微处理器芯片中乘法器是进行数字信号处理的核心同时也是微处理器中进行数据处理的关键部件,它已经是现代计算机必不可少的一部分。
乘法器的算法也有很多种,例如移位相加算法、布斯(Booth)算法、华莱士树(WallaceTree)算法等。
其中移位相加算法是乘法器最基础的算法,其它的算法都是在它的基础上为了压缩和优化这种算法延伸出来的算法,目的是提高乘法器的运算速度以及实现更多的乘法器功能。
虽然不断有关于32位、64位乘法器的研究出现,但由于大量的媒体信号处理只需16位运算就能胜任,因此对16位乘法器的研究仍有着相当的应用价值。
乘法器的发展现状
过去的十年中,研究者扩展了Booth编码算法的空间,提高了乘法器的性能;改进了部分积压缩技术,使乘法器结构更加规则;以传输管逻辑、多路选择器和动态技术为基础的各种电路实现方法也持续刷新高性能乘法器的实现记录;与此同时,与物理实现紧密相关的乘法器拓扑结构的研究也硕果累累。
但不断提高的高性能运算需求使得高性能乘法器的设计和实现仍然是当前的热门话题。
国内乘法器现状
乘法器的设计与应用在国内研究领域也取得了很好的成绩,1993年中科院声学研究所应用于18位乘法器,实现工作频率38MHZ.。
随着应用要求的领域与性能不断提高,1997年国防科技大学完成应用于数字神经处理的16位乘法器,频率30MHZ。
2001年西安微电子技术中心于敦山实现了32位定/浮点乘法器延时56/76ns。
进入新世纪以来,集成电路工艺水平不断提升,2002年西安交通大学袁寿财实现了下延时40ns。
2003年中科院计算研究所周旭采用的工艺实现54位浮点乘法器384MHZ。
2004年复旦大学武新宇采用的工艺实现64位乘法器延时。
2005年上海大学王田采用的工艺实现32位乘法器延时。
2007年东南大学王定采用FPGA设计24位乘法器延时。
乘法器的设计一直是集成电路设计研究领域的一个热点,也有着广泛的应用。
国外乘法器现状
理论方面乘法器研究上的里程碑应该从BoothAD在1951年提出的Booth编码方法和Wallace的树型压缩开始。
随后出现了Booth2算法、压缩器(进位保留加法)、延迟平衡树等各种算法结构。
国外乘法器在电路方面的发展同样迅猛,1995年Ohkubo基于传输管逻辑实现了4.4ns54位乘法器,同时提出了新的4:
2压缩单元结构和进位选择加法器结构。
1996年Hanawa实现了4.3nS的54位乘法器,同一年,Makino实现了8.8ns54位冗余二进制编码乘法器。
1997年Inoue提出了符号选择Booth解码和改进的4:
2压缩单元结构,实现了4.1ns的54位乘法器。
1998年Hagihara基于动态技术和传输管逻辑实现了2.7ns的54位乘法器。
同年Carlson介绍了6.0ns的64位乘法器实现方法。
2001年Itoh实现了一个600MHz的两级流水线的54位乘法器。
2003年Cho基于标准单元库实现了一个3.25ns的54位乘法器,并提出了改进的进位选择加法器结构。
乘法器概述
乘法器在当今数字信号处理以及其他诸多应用领域中起着十分重要的作用。
随着科学技术的发展,许多研究人员已经开始试图设计一类拥有更高速率和低功耗,布局规律占用面积小,集成度高的乘法器。
这样,就能让它们更加适用于高速率,低功耗的大规模集成电路的应用当中。
通常的乘法计算方法是添加和位移的算法。
在并行乘法器当中,相加的部分乘积的数量是主要的参数。
它决定了乘法器的性能。
为了减少相加的部分乘积的数量,修正的Booth算法是最常用的一类算法。
为了实现速度的提高Wallace树算法可以用来减少序列增加阶段的数量。
我们进一步结合修正的booth算法和Wallace树算法,可以看到将它们集成到一块乘法器上的诸多优势。
但是,随着并行化的增多,大量的部分乘积和中间求和的增加,会导致运行速度的下降。
不规则的结构会增加硅板的面积,并且由于路由复杂而导致中间连接过程的增多继而导致功耗的增大。
另一方面串并行乘法器牺牲了运行速度来获得更好的性能和功耗。
因此,选择一款并行或串行乘法器实际上取决于它的应用性质。
在本文中,我们将介绍乘法算法以及在应用结构方面的速度比较,占用面积,功率和这些情况的组合绩效指标。
乘运算
考虑两个没有符号的二进制数X和Y,分别为M位宽和N位宽。
为了说明乘法运算,可以用二进制形式来表示X和Y:
。
于是乘法运算定义如下:
执行一个乘法运算最简单的方法是采用一个两输入的加法器。
对于M和N位宽的输入,乘法采用一个N位加法器时需要M个周期。
这个乘法的移位相加算法把M个部分积(partialproduct)加在一起。
每一个部分积是通过将被乘数与乘数的一位相乘(这本质上是一个“与”操作),然后将结果移位到这个乘数的位置得到的。
实现乘法的一个更快的办法是采用类似于手工计算乘法的方法。
所有的部分积同时产生并组成一个列阵。
运用多操作数相加来计算最终的积。
这一方法如图所示。
这一组操作可以直接映射到硬件。
所形成的结构称为阵列乘法器(arraymultiplier),它结合下面三个功能:
产生部分积、累加部分积和最终相加。
二进制乘法的例子
乘法器结构
乘法器的结构种类很多,在此我只介绍一种乘法器结构供接下来设计移位相加乘法器结构的设计做参考。
浮点数包括尾数和指数两部分,尾数部分进行的是乘法运算,指数部分进行的是加法运算,并依据尾数运算结果进行指数调整。
图2-1乘法器结构
尾数处理部分主要进行尾数扩展和一些数据正负的判断以及负数的生成,以备在进行Booth编码的时候使用。
部分积的产生采用修正的Booth算法产生6个部分积,然后采用3:
2和4:
2压缩器将结构压缩为两个,高速相加得到结果。
之后通过符号修正、尾数舍入、规格化等操作对指数进行调整即可完成乘法功能。
乘法器端口定义
通常,根据乘法器的功能计算要求定义乘法器的端口如下:
ain:
16位乘数输入
bin:
16位被乘数输入
clk:
工作时钟输入
res_n:
复位信号输入
start:
开始位
done:
结束位
yout:
乘积输出
第二章移位相加乘法器设计的基本原理
移位相加乘法器实现起来比较简单,它的设计思想就是根据乘数的每一位是否为1进行计算,若为1则将被乘数移位相加。
一个乘法器只需要一个移位寄存器和一个加法器就能组成。
移位相加乘法器设计基础
.1移位相加算法
移位相加算法是乘法器最基础的算法,下面以一个例子说明移位相加法实现M×N。
手动乘法运算举例:
1101
×1011
1101
1101
0000
﹢1101
10001111
计算机实现方案1:
部分积左移:
1101
×1011
1101
﹢1101
100111
﹢0000
100111
﹢1101
10001111
计算机实现方案2:
部分积之和右移:
1101
×1011
1101第一次部分积
1101部分积之和右移1位
﹢1101第二次部分积
100111部分积之和
100111部分积之和右移1位
﹢0000第三次部分积
100111部分积之和
100111部分积之和右移1位
﹢1101第四次部分积
10001111部分积之和
10001111部分积之和右移1位
.2乘法器设计原理
乘法器基本工作原理大体分为三个步骤:
(1)先将二进制的被乘数与乘数的每一位分别相乘,得到与乘数的位数相同个数的部分积;
(2)将得到的部分积按权值错位相加,进行部分积压缩;(3)一级加法,通常采用一个超前进位加法器模块。
对乘法器的设计自然集中在各模块的性能优化上,以达到速度快、面积小的目的。
移位相加乘法器原理
从手算的经验可知执行一个乘法运算最简单的方法就是采用一个两输入的加法器,进行部分积的累加,得到最终结果。
对于N位的乘数与N位的被乘数的输入,实现乘法运算需要N个加法器与2N个寄存器,乘法的移位和相加把N个部分积加在一起,部分积是通过被乘数与乘数移位后末位相与操作得到,然后将结果与存放在寄存器中的前次运算得到的结果进行相加,并将结果仍然存放在寄存器中,如此反复。
这样的操作在硬件实现上就是移位相加乘法器。
移位相加乘法器的中间结果需要用寄存器保存的。
其中时钟信号可以使用系统时钟信号。
许多加法器结构都是应乘法器设计要求而生,如CPA(carry2propagateadder)、CSA(carry2saveadder)[7]和Wallacetree[8]等。
移位相加乘法器优点是占用资源少。
在第一个时钟来的时候,把乘数的最低位与被乘数相与,当第二个时钟到来时,仍然可以用刚才的与门来进行相与。
这样,即使乘数有多少位,都是用相同的与门:
缺点是运算速度慢,每次时钟乘数输入一位,假设乘数有4位,就需要4个时钟周期才可以把结果输出。
图3-1移位相加乘法器
第三章16×16位移位相加乘法器设计与仿真
16位移位相加乘法器的设计
位移和添加乘法器的一般结构如下图所示,对于32比特的数乘运算,根据乘数最低有效位的数值,被乘数的数值被相加并累积。
在每一个时钟循环周期内,乘数被左移一个比特,并且它的位值被测试,如果位值是0,则只进行一次位移操作。
如果位值是1,则被加数被放入累加器中,并且左移一位。
当所有乘数的比特值被测试完之后,结果就在累加器当中。
累加器最初是N位,相加之后变成2N位,最低有效位包涵了乘数。
延迟是N个最大循环周期。
16位移位相加乘法器Verilog文件设计
完整的16×16位移位相加乘法器的Verilog文件设计和激励测试文件将会在附件中给出,下面我只对本乘法器的重要部分做下说明。
modulemux_16
(
clk,rst_n,
start,ain,bin,yout,done
);
reg[15:
0]areg;
reg[15:
0]breg;
reg[31:
0]yreg;
regdone_r;
reg[4:
0]i;
这部分是我定义了一个时钟clk,一个复位键rst_n,一个开始键start,输入乘数ain,输入被乘数bin,输出yout,和结束位done。
以及定义了两个16位寄存器areg,breg,一个32位寄存器yerg,一个1位寄存器done_r,一个5位寄存器i。
always@(posedgeclkornegedgerst_n)
if(!
rst_n)i<=5'd0;
elseif(start&&i<5'd17)i<=i+1'b1;
elseif(!
start)i<=5'd0;
always@(posedgeclkornegedgerst_n)
if(!
rst_n)done_r<=1'd0;
elseif(i==5'd16)done_r<=1'b1;
elseif(i==5'd17)done_r<=1'b0;
assigndone=done_r;
这部分主要对开始位start和终止位done的约束。
always@(posedgeclkornegedgerst_n)
begin
if(!
rst_n)
begin
areg<=16'h0000;
breg<=16'h0000;
yreg<=32'h00000000;
end
elseif(start)
begin
if(i==5'd0)
begin
areg<=ain;
breg<=bin;
end
elseif(i>5'd0&&i<5'd16)
begin
if(areg[i-1])yreg<={1'b0,yout[30:
15]+breg,yreg[14:
1]};
elseyreg<=yreg>>1;
end
elseif(i==5'd16&&areg[15])yreg<=yreg[31:
16]+breg;
end
这部分是移位相加乘法器的运算方法。
16×16位移位相加乘法器Modelsim仿真
Modelsim仿真工具是Model公司开发的,它支持Verilog、VHDL以及他们的混合仿真。
它可以将整个程序分步执行,使设计者直接看到他的程序下一步要执行的语句,而且在程序执行的任何步骤任何时刻都可以查看任意变量的当前值,可以在Dataflow窗口查看某一单元或模块的输入输出的连续变化等。
比Quartus自带的仿真器功能强大的多,是目前业界最通用的仿真器之一。
在采用Modelsim开始仿真之前我们首先应该搭建一个仿真测试的平台,即为即将进行的测试文件编写一个测试激励(Testbench)。
一个测试平台文件就是一个Verilog模型,可以用来验证所设计的硬件模型的正确性。
测试平台就是为所测试的元件提供一个测试激励,仿真结果可以以波形的方式显示或存储测试结果到文件中。
激励信号可以直接集成在测试平台文件中,也可以外部文件加载,在这里我们采用集成在测试平台中如图5-1。
图3-2仿真测试平台
仿真模拟文件是采用软件方法模拟一个乘法器,在编写的时候并不考虑硬件情况所以是不可综合的。
它仅仅用于仿真,在相同的测试激励下会产生和待测试文件一样的乘法结果。
但由于它采用的是纯粹的软件的仿真并不关心实际硬件,所以我们可以采用直接使用乘法得出结果,从而大大减小它的编写难度同时能够保证结果的正确性。
如果待测试文件和仿真模拟文件在相同的测试激励下输出相同的结果,那么我们就可以认为设计是正确的。
同时得益于软件仿真的高速性我们可以再完成一组仿真比较之后紧接着自动进入下一组,同时自动改变仿真的数据组合,逐步将16位浮点数据的全部组合进行测试,确保在所有情况下的结果都是正确的。
仿真测试平台提供两个相同的测试激励分别将值给待测试文件和模拟测试文件,然后得到它们的结构进行比较,如果相同说明我们的设计在功能上是正确的,如果不同说明设计存在问题,验证测试马上终止,并给出错误位置和激励信号帮助改正,具体实现代码见附录测试代码部分。
16×16位移位相加乘法器经典数组运算结果
在数字电路设计流程中,在进行电路综合前,必须要确保所设计的电路功能的正确性,本课题针对所设计的16*16位移位相加乘法器的verilog设计进行功能仿真,采用的是Mentor公司的仿真器Modelsim,仿真结果如下。
上图是16位的0×0的功能仿真结果,根据第二节中阐述的二进制乘法的基本原理,对于被乘数与乘数都是16位的运算,可获得32位二进制,由仿真结果,在运算结果正确的同时,位数也保持着正确。
1×1
0×1
16×16位移位相加乘法器一般情况运算结果
89×33
24945×32580
第四章16×16位移位相加乘法器Verilog设计综合
RTL级概念
RTL的全称为寄存器传输级(RegisterTransferLevel),它是对芯片设计的一种层次的抽象描述。
不同于行为级和门级描述,RTL级的重点是寄存器和其间的逻辑。
和行为级相比,RTL级的描述更加规范和严格,可以使用工具转换成门级电路;但比起门级电路,由于抽象层次高,RTL级的描述更清晰,容易理解。
在RTL级,设计被抽象为一系列的寄存器,而信号随着时钟从一个寄存器传递到另一个寄存器,如图4-1所示。
这一模型反映了数字系统的几个要素、寄存器组成的时序逻辑、寄存器之间的组合逻辑以及关键的时钟信号。
虽然还不是具体的电路,但RTL级设计作为描述电路的另一种方法,必须是物理的可实现的。
所以,真正的芯片设计应该是从RTL代码的编写开始的。
具体来说,RTL级设计应该考虑以下因素:
1.可综合性:
RTL级设计完成后的工作就是综合,因此RTL级设计必须是可综合的。
首先,编写代码使用的预言必须是可综合的。
目前,编写RTL代码一般使用VHDL或VerilogHDL语言,这两种语言中,并不是所有的语言成分都是可综合的,可综合的子集取决于综合工具的能力。
但IEEE为这两种语言的综合分别制定了相应的标准,规定了综合工具必须支持的最小集合,分别是针对VHDL的和针对Verilog的.
在此基础上,RTL级设计还应该是“面向综合”的。
因为,即使完全使用可综合的语言成分,不同的代码产生的综合结果也会大不相同。
更高的要求是编写代码时冲分考虑到综合的工作,通过靓号的编码使综合以及此后的其它实现步骤可以顺利地进行,减少反复。
2.可测性:
由于测试在芯片设计中的重要性,现在必须在RTL级就开始考虑测试的问题。
这虽然不是RTL所必须的,但如果不在RTL编码时就为测试作出努力,而是把测试完全交给后端,最后的结果可能是根本无法达到要求的故障覆盖率,而不得不在RTL级进行返工。
3.重用性:
RTL级设计时应考虑到的另一个问题就是代码的可读性和可移植性,这在大型的设计中尤为重要。
今天的百万门级的设计不可能是每个模块从头开始,甚至有可能全部使用IP或现有的模块,这样既缩短了设计的时间,也减少了风险。
这就要求代码的编写者尽可能地完善代码的重要性。
那种几个月后连自己也看不懂的代码是绝对不可取的。
4.其它的考虑:
要实现高质量的RTL级设计还应该考虑到时序收敛、可验证性、可调试性、芯片面积和功耗等问题。
总之,RTL级设计虽然不是设计的最终结果,但它在很大程度上已经决定了设计的功能和性能。
虽然可以通过此后的综合或者布局布线对设计进行一定程度的优化,但优化结果很依赖于RTL级设计。
高质量的RTL设计可以使后端的工作轻松地达到设计目标:
相反,质量差的RTL级设计,可能使后端设计困难重重,甚至无法完成,最终不得不回过头修改RTL级设计。
毫不夸张地说。
在RTL级设计中的一个改进所产生的作用,往往要比这综合或后端设计中的一个改进效果大得多。
这就要求RTL级的设计者不应依赖于后端的工具解决延时、面积、测试等问题,而是应该将注意力集中到RTL级设计中,从一开始就考虑到综合,考虑到最终生成的电路。
RTL级综合结果与分析
以下是在仿真中得到的对设计面积,运行时间,约束时间的报告。
Report:
constraint
-verbose
由上述报告能够看出在电路的约束时间上,要求的时间为,到达的时间为,时间裕量。
此乘法器的对大传输时间为,一般的传输时间为,时间裕量为。
最大电容。
一般电容。
电容裕量。
Report:
timing
-pathfull
-delaymax
-max_paths1
由上述报告能够看出在电路的延时时间上要求延时时间为。
实际到达时间为,时间裕量为,符合要求。
Report:
area
由上述报告能够看出在电路的面积上有68个端口,分别是乘数输入16个端口,被乘数输入16个端口,乘积输出32个端口,开始端口,结束端口,工作时钟输入端口,复位信号输入端口。
有290条连线和217个单元组成。
组合区域面积为立方微米,非组合区域面积为立方微米。
总共单元面积立方微米。
16位移位相加乘法器电路图
所谓的DC即DesignCompiler。
它是十多年来工业界标准的逻辑综合工具,也是Synopsys最核心的产品。
它使IC设计者在最短的时间内最佳的利用硅片完成设计。
它根据设计描述和约束条件并针对特定的工艺库自动综合出一个优化的门级电路。
它可以接受多种输入格式,如硬件描述语言、原理图和网表等,并产生多种性能报告,在缩短设计时间的同时提高设计性能。
所以Synopsys公司DesignCompilerEDA工具在综合时用可以进行RTL级设计综合,得到门级网表。
以下是我通过Synopsys公司DesignCompilerEDA工具在综合时得到的结果。