抄作业_verilog_实现64bits乘法器-3.9

芳纶头盔抄作业_verilog_实现64bits乘法器-3.9
抄⼀个Verilog⼤作业。
题⽬描述:⽤VerilogHDL设计实现64bit⼆进制整数乘法器
基本功能:
1.底层乘法器使⽤16*16\8*8\8*32\8*16⼩位宽乘法器来实现,底层乘法器可以使⽤FPGA内部IP实现;
2.基于modelsim仿真软件对电路进⾏功能验证;
3.基于Quartus平台对代码进⾏综合及综合后仿真,芯⽚型号不限;
4.电路综合后的⼯作频率不低于50MHz。
第 1 章电路的设计思想
1.1 不作优化的乘法器结构
对于⼀个乘法来说,它的计算步骤是⽤乘数的每⼀位以从低到⾼的顺序与被乘数相乘再错位相加。那么,
如果把64位因数与64位因数相乘的结果展开以后会发现,错位相加的那些加数是可以⽤16×16位乘法器或者8×64位乘法器的错位相加的加数来凑⼀起的。我可以通过把四个
黑刚玉磨料3×3位乘法器的运算结果进⾏移位和相加以后,可以实现⼀个6×6位乘法器的运算结果。在上图中,因为乘法器是要调⽤3×3位乘法器,所以需要把两个因数分别切割成两个3位来调⽤乘法器。所以需要2×2=4个乘法器。根据题⽬所给出的允许调⽤的乘法器⾥,为了使调⽤的乘法器个数最⼩,我的⼦乘法器选择的范围将聚焦在16×16位乘法器和8×32位乘法器。不论调⽤这⾥⾯那个乘法器,最终都是需要16个乘法器的。16个乘法器并⾏运算同时送出数据。
若调⽤16位乘法器设计电路,⽆优化的情况下需要调⽤16个乘法器,8×32位乘法器同理。此外,64位电路的设计的移位设计有着极强的规律,在电路的设计中,这种规律性会体现在电路结构的相似性。
调⽤8×32位乘法器的设计的分析思路与⽅法与上⽂类似。
1.2  乘法器结构的折叠优化
不论采⽤8×32位还是16位的⼦乘法器来设计64位乘法器,如果⽤⼗六个乘法器并⾏运算,然后再对结果进⾏移位和相加。为了保证并⾏计算的延续性在电路的右端还需要放置⾄少16个寄存器以及15个加法器。这些模块凑⼀起将会导致电路的规模巨⼤。但是,在并形64位乘法器的设计⾥,电路的相乘以
及移位的步骤是⼀样的,在设计出来的电路中这些16个乘法器以及后⾯的移位的单元的结构都是⼀致的。因此我们可以对这⼀部分采⽤时分复⽤的⽅式进⾏优化。这种反复使⽤某个结构(部件)的过程也被称作折叠。[2]折叠可以使得相同的N个结构优化到⼀个结构,代价是本来⼀个时钟周期可以处理的过程需要在若⼲个(N个左右)时钟周期完成。因此电路的吞吐率会下降到以下。铜编织线
由于本次作业要求所设计的乘法器的⾯积与性能等指标的均衡,采⽤结构折叠可中和16个16位乘法所造成的很好的性能与很差的⾯积之间的⽭盾。
调⽤8×32位乘法器的电路的设计与优化与上⽂雷同。
1.3  64位乘法器的多种设计思路
1.3.1  16个⼦乘法器的全并⾏思路
以调⽤16位⼦乘法器的设计为例。根据1.1节的结论,16个16位⼦乘法器先并⾏计算,然后按照(1.3)式来分配每⼀个乘法器后边的128位移位寄存器,再把128位移位寄存器移位后存贮的数值加起来输出。
为了减少加法器的延时,可把加法器改为树形结构,即采⽤四级8421的加法器的结构。
其次,再乘法器设计⾥的加法器模块,因为位宽⾄少也是16位的,所以加法器可采⽤进位旁路加法器来减少管⼦的数量。⽆论怎么,加法器电路的管⼦数量是随着位宽的增加⽽增加的。如果寄存器直接采⽤128位,则加法器的位宽也应该是128位的。所以减⼩加法器的位宽可以从先减少寄存器的位宽再减⼩加法器的位宽⼊⼿。⽐如,第⼀级加法器的输⼊采⽤32位寄存器,使得有移位要求的数据可以移位。第⼆级加法器的输⼊增加4个64寄存器,第三级和第四级⼀共增加3个128寄存器。加法器的位宽四级下来也会减⼩。这样优化下来,寄存器的总⾯积和加法器的总⾯积都会减⼩。
如1.1节所⽰,这种设计思路即使优化后仍然存在性能显著与⾯积冗余的⽭盾。因此,在设计中会继续采⽤1.2节的思路对其优化。
1.3.2  1个⼦乘法器的全串⾏思路
现在,考虑采⽤1.2节的优化⽅法下最极端的思路,即仅采⽤⼀个⼦乘法器进⾏设计。电路框图如下:
如上图,将两个64位的因数分别切成16位数据,由时钟驱动选择器在不同时刻选择不同的数据组合并在乘法器中相乘。然后把相乘的结果移位以后并与寄存器⾥的数据相加,然后当累加次数够了以后把累加结果作为64位乘法器的结果输出。关于电路还有如下⼏点说明。
时钟驱动选择器选择数据是通过计数器实现的,⽐如时钟要驱动⼀个四选⼀的多路选择器,那么需要
在时钟和选择器之间加上⼀个四进制计数器,然后时钟每跳⼀下计数器加⼀位。当计数器的计数结果连接到选择器的使能端上时,可实现乘法器的乘数随着时钟的跳变⽽转换。
选择器MUX1在跳转时,要固定选择器MUX2⾥⼀个数保持不变,直⾄MUX1⾥所有的数都循环结束。因此MUX1的时钟信号的频率应该是MUX2频率的4倍,同样道理,因为最终的结果需要移位累加4次才能出结果,所以最后⼀个寄存器的时钟频率应当是MUX2频率的0.25。
如果采⽤多个时钟信号对于这种⼩模块来说是很浪费的,那么可以考虑给控制选择使能端的两个计数器添加进位输出并级联。这样可以使⽤⼀个全局时钟。
为了提⾼数据的吞吐率,电路中多加了⼏级流⽔线。
采⽤8×32位寄存器设计与上述思路雷同,⽆⾮是选择器分别使⽤⼆选⼀选择器与四选⼀选择器。时钟的进位也不⼀样。
1.4  最终的乘法器结构设计⽅案
1.4.1    X个(1
在1.3节我分别列出来了两种极端情况下的电路设计情况,为了协调电路⾯积、性能、功耗三者的关
系,我采⽤两种措施来保证电路的设计。⾸先是采⽤串并混合的电路,根据作者本⼈的粗略估计,并⾏的乘法器为四个16位乘法器的时候电路的⾯积和性能会有⼀个均衡。其次是为保证在前者情况下功耗的最优,电路设计的顺序结构应为先并⾏再串⾏。如果采⽤先串⾏再并⾏,那么在串⾏的时候电路⾥有不产⽣结果的时钟周期,⽽这种时钟周期在并⾏以后依然不产⽣结果,会造成时钟的浪费。对于有把握的地⽅,可分割的组合逻辑模块可在中间插⼊流⽔线分割组合逻辑电路来提⾼性能,但是这样会降低芯⽚的响应速度。如果假设乘法器的应⽤场景为⼤串的乘法连续计算,那就尽量加上。最后要算好延时等时序问题,保证在正确的时刻把正确的积进⾏输出 (由计数器控制)。
第 2 章电路的实现
4个16×16位乘法器实现64位乘法器所组成的64位乘法器的电路⽰意图如下:
其中,16×64位乘法器的设计参考1.1节的全并⾏乘法器设计;64×64位乘法器的设计调⽤16×64位的乘法器并参考1.2节的串⾏乘法器的设计。下⾯将分别给出16×64位乘法器和64×64位乘法器的设计图并详细说明。
加法器电路2.1  64位乘法器流程图
图2.1  16×64位乘法器电路⽰意图
图2.2  64×64位乘法器电路⽰意图
2.2  64位乘法器设计细节
2.2.1  端⼝的wire连接
为了规避语法问题带来的编译通不过,我将所有的module的端⼝都定义为wire类型。⽽调⽤的IP的乘法器的端⼝也是wire类型,这样实例化这些模块以后的连接就⽐较⽅便。
其中可能会存在需要在敏感事件列表⾥对端⼝进⾏赋值,这时候便定义reg类型的中间变量来参与赋值和运算,最终⽤assign语句将它和端⼝进⾏连接。
2.2.2  选择器的时钟控制
利⽤1.3.2节的思路,⽤时钟驱动计数器⼯作,再⽤计数器的输出作为选择器的输⼊,来选择数据,从⽽实现时钟驱动数据的跳变。
2.2.3  流⽔线插⼊
为了提⾼电路的⼯作频率,我插⼊了⼀些流⽔线,诸如在两级乘法器的移位累加过程中,多级求和过程中。结果的输出过程等。这样有利于
把长路径的组合逻辑电路进⾏分割,以减⼩组合逻辑的延迟,提⾼频率。
流⽔线没有全加,因为加的多了⾯积也会增⼤,⽽且,结果的响应时间也会拉长。
2.2.4  移位累加过程[3]
按照传统的思维,错位相加应该是先把低位来的数据放在寄存器低位,然后寄存器的数据左移,再和次低位来的数据相加,依次循环到最⾼位的结果。我在代码⾥的移位累加过程刚刚反过来。即先把低位来的数据放在最⾼位,然后寄存器数据右移后与次⾼位来的数据相加,最终的效果差不多。
最终的操作步骤是,先把寄存器清零,然后寄存器右移16位,和低位来的数据放最⾼位以后的数据相加并放回寄存器,然后⼀直重复右移,累加,放值的过程
移位累加过程如果在移位和累加过程中间加⼀层流⽔线的话延时可能会显著降低,但是考虑到这⾥的寄存器数量太多,于是放弃。
2.2.5  移位累加过程的控制
雅莱减肥饼干
每⼀个计算周期每⼀步都会通过计数器进⾏标明。所以可以根据计数结果来控制移位累加的过程。
移位累加的过程需要注意到两个问题,⼀个是⼀个计算周期开始的时候,累加的寄存器内数据需要归零并开始计算。如果不归零那寄存器会累加上之前计算的结果。所以我们需要推算出第⼀个16×64位乘法的结果在哪个周期⾸先产⽣,那在这个周期之后的第⼀个上升沿就会发⽣程序的第⼀次移位累加,往前推导⼀下,在这个周期寄存器⾥存放的恰好是上⼀个计算周期的结果,所以,在下⼀个上升沿还需要把寄存器⾥的数据赋出去。
事实上,对于电路时序的确认我的推算还是有⼀些误差,最终在跑仿真的时候检查发现有错位便再进⾏这部分的修改,即对if语句的参数的修改。
2.3    电路的Verilog HDL关键代码及解释
2.3.1  16×64代码及解释
//16×64⼦乘法器模块module mul1664 (clk,reset,a, b, result); input clk; input [15:0] a;//a为16位 input [63:0] b;//b为64位 output [79:0] result; reg [31:0] temp_result1; reg [31:0] temp_result2; reg [31:0] temp_result3; reg [31:0] temp_result4; reg [47:0] temp_sum1; reg [47:0]
temp_sum2; reg [79:0] temp_result; //⾮阻塞赋值,使得程序⾃带流⽔线 initial always@(posedge clk) if(!reset) begin temp_sum1<=0; temp_sum2<=0; temp_result<=0; end else begin //第⼀个时钟上升沿:调⽤四个乘法器同时运算 mul64
submul1(.dataa(a),.datab(b[15:0]),.result(temp_result1) ); mul64 submul2(.dataa(a),.datab(b[31:16]),.result(temp_result2) ); mul64
submul3(.dataa(a),.datab(b[47:32]),.result(temp_result3) ); mul64 submul4(.dataa(a),.datab(b[63:48]),.result(temp_result4) ); //第⼆个时钟上升沿:第⼀层加法同时运算,错位相加 temp_sum1<={temp_result2,16'b0}+{16'b0+temp_result1}; temp_sum2<={temp_result4,16'b0}+ {16'b0+temp_result3}; //第三个时钟上升沿:第⼆层加法同时运算,错位相加 temp_result<={temp_sum1,32'b0}+{temp_sum2,32'b0}; end assign result=temp_result;endmodule//16×16bit乘法器//由IP⽣成,即mul64
氟苯尼考琥珀酸钠2.3.1  64×64代码及解释

本文发布于:2024-09-20 22:34:29,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/4/337608.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:乘法器   电路   设计
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议