您好,欢迎来到意榕旅游网。
搜索
您的当前位置:首页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. 时序逻辑实现

流程图如下:

开始载入被乘数A和乘数B,乘积结果D复位清零否B的最低位b0为0?是否D=D+AD=DA=A<<1b0为B的最高位?是B=B>>1结束

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’ end

end

end

end

end

endmodule

b1;

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- yrrf.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务