16位乘法器芯片设计 3月9日
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
16位乘法器芯片设计
1.方法
乘法器的设计方法有两种:组合逻辑设计方法和时序逻辑设计方法。
采用组合逻辑设计方法,电路事先将所有的乘积项全部算出来,然后做加法运算。
采用时序逻辑设计方法,电路将部分已经得到的乘积结果右移,然后与乘积项相加并保存和值,反复迭代上述步骤直到计算出最终积。
2.组合逻辑的实现
可以以16*3位的乘法器为例做出如下设想:
A为16位二进制乘数,B为3位二进制乘数,C为A与B相乘的积。则:
C的结果实际上只能为如下值中的一个:
0,A,2A,3A,4A,5A,6A,7A
因为B为3位二进制,则B只能是000,001,010,011,100,101,110,111中的一个。
初步设想符合现实,由于要实现ASIC芯片的生产,所以对各端口定义如下:
reset:芯片复位、清零信号。值为0,芯片复位。
start:芯片使能信号。值为1,芯片读入乘数和被乘数,并将乘积复位清零。
ain:被乘数,16bit。
bin:乘数,3bit。
yout:乘积输出,19bit。
done:芯片输出标志信号,值为1,乘法运算完成,yout端口的数据稳定,得到最终的乘积;值为0,乘法运算未完成,yout端口数据不稳定。
编写的Verilog程序如下:
Module mult16(reset,start,ain,bin,done,yout);
Parameter N=16;
Input reset;
Input start;
Input [N-1:0] ain;
Input [2:0]bin;
Output [N+3:0] yout;
Output done;
Integer aa,ab,ac,temp;
Integer su;
Reg done;
Always @(ain)
Begin
If(start&&!reset)
Begin
aa=ain;
ab=ain+ain;
ac=ab+ab;
temp=aa+ab;
case(bin)
3’b000: su=0;done=1’b1;
3’b001: su<=aa;done=1’b1;
3’b010: su<=ab;done=1’b1;
3’b011: su<=aa+ab;done=1’b1;
3’b100: su<=ac;done=1’b1;
3’b101: su<=aa+ac;done=1’b1;
3’b110: su<=ab+ac;done=1’b1;
3’b111: su<=temp+ac;done=1’b1;
default: su<=0;done=1’b0;
else if (reset)
begin
su=0;
aa=0;
ab=0;
ac=0;
done=1’b0;
end
else if (!start)
begin
su=0;
done=1’b0;
end
end
assign yout=su;
endmodule
基于组合逻辑的乘法器,在程序语言上通俗易懂,思路清晰,但是有致命缺点,当乘数和被乘数位数很多的时候,不可能一一列举各种乘积结果,用case语句就显得很繁琐,所以基于时序逻辑的乘法器的研制在所难免。
3.时序逻辑实现
流程图如下:
1.数据入口定义
clk:时钟。
reset:芯片复位、清零信号。
start:芯片使能信号。
ain:被乘数a。
bin:被乘数b。
2.数据出口定义
yout:乘积输出。
done:芯片输出标志信号。
3.Verilog HDL 描述
module tmult16(clk,reset,start,done,ain,bin,yout); parameter N=16;
input clk, reset, start;
input [N-1:0] ain;
input [N-1:0] bin;
output [2*N-1:0] yout;
output done;
//乘法器的数据寄存器
reg [2*N-1:0] a;
reg [N-1:0] b;
reg [2*N-1:0] yout;
reg done;
//reset的信号下降沿启动复位过程
always @(posedge clk or negedge reset)
begin
if(~reset)
begin
a<=0;
b<=0;
yout<=0;
done<=1’b1;
end
else
begin
if(start)
begin
a<=ain;
b<=bin;
yout<=0;
done<=0;
end
else
begin
if(~done)
begin
if(b!=0)
begin
if(b[0])