当前位置:文档之家› 16位乘法器芯片设计 3月9日

16位乘法器芯片设计 3月9日

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])
begin
yout<=yout+a;
end
b<=b>>1;
a<=a<<1;
end
else begin
done<=1’b1;
end
end
end
end
end
endmodule。

相关主题