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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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])

相关文档
最新文档