booth乘法器原理
2024-10-03 04:28:19
在微处理器芯片中,乘法器是进行数字信号处理的核心,同一时候也是微处理器中进行数据处理的wd=%E5%85%B3%E9%94%AE%E9%83%A8%E4%BB%B6&hl_tag=textlink&tn=SE_hldp01350_v6v6zkg6" rel="nofollow">关键部件。乘法器完毕一次操作的周期基本上决定了wd=%E5%BE%AE%E5%A4%84%E7%90%86%E5%99%A8&hl_tag=textlink&tn=SE_hldp01350_v6v6zkg6" rel="nofollow">微处理器的主频。wd=%E4%B9%98%E6%B3%95%E5%99%A8&hl_tag=textlink&tn=SE_hldp01350_v6v6zkg6" rel="nofollow">乘法器的速度和面积优化对于整个CPU的性能来说是非常重要的。 为了加快乘wd=%E6%B3%95%E5%99%A8&hl_tag=textlink&tn=SE_hldp01350_v6v6zkg6" rel="nofollow">法器的运行速度。降低乘法器的面积。有必要对乘法器的算法、结构及电路的详细实现做深入的研究。 wd=Booth%E7%AE%97%E6%B3%95&hl_tag=textlink&tn=SE_hldp01350_v6v6zkg6" rel="nofollow">Booth算法与乘法器的一般结构
乘法器工作的基本原理是首先生成部分积。再将这些部分积相加得到乘积。在眼下的乘法器设计中,基4Booth算法是部分积生成过程中普遍採用的算法。 对于N位wd=%E6%9C%89%E7%AC%A6%E5%8F%B7%E6%95%B0&hl_tag=textlink&tn=SE_hldp01350_v6v6zkg6" rel="nofollow">有符号数乘法A×B来说,常规的乘法运算会产生N个部分积。假设对乘数B进行基4Booth编码。每次需考虑3位:相邻高位、本位和相邻低位,编码后产生部分积的个数能够降低到[(N+1)/2]?? ([X]取值为不大于X的整数),确定运算量0、±1A、±2A。 对于2A的实现。仅仅须要将A左移一位。因此,对于符号数乘法而言。基4 wd=Booth%E7%AE%97%E6%B3%95&hl_tag=textlink&tn=SE_hldp01350_v6v6zkg6" rel="nofollow">Booth算法既方便又快捷。而对于无符号数来说,仅仅需对其高位作0扩展。而其它处理方法同样。尽管扩展后可能导致部分积的个数比有符号数乘法多1,可是这样的算法非常好地保证了硬件上的一致性。有利于实现。对于32位乘法来说。结合指令集的设计,通常情况下须要相加的部分积不超过18个
booth乘法器是一种位操作乘法器。与传统乘法器不同的是直接操作位。传统乘法器依靠加法,不断累加。在这里就不说了。 ------------------------------------------------------------------------------------------------------------------------------------------------------------ booth乘法器有个重要的加码运算。来看一下 B[-1]就是B的零位右边的位。是假想的位。如0010 0 B[-1]就是0。 做booth乘法器又引入了p空间。上图的左移一位或者右移一位指的是p空间。什么是p空间呢?我们以7(0111)和2(0010)相乘为例。他们位数n均为4位。所以p空间大小为n*2+1=9。p空间是怎样做乘法运算的呢?代码例如以下:module product
(
input CLK,
input RSTn, input Start_Sig,
input [7:0]A,
input [7:0]B, output Done_Sig,
output [15:0]Product, output [7:0]SQ_a,
output [7:0]SQ_s,
output [16:0]SQ_p
); /*************************/ reg [3:0]i;
reg [7:0]a; // a的寄存器
reg [7:0]s; // a的补码加1 a非
reg [16:0]p; // p空间存储器
reg [3:0]X; //操作次数
reg isDone; always @ ( posedge CLK or negedge RSTn )
if( !RSTn )
begin
i <= 4'd0;
a <= 8'd0;
s <= 8'd0;
p <= 17'd0;
X <= 4'd0;
isDone <= 1'b0;
end
else if( Start_Sig )
case( i )
0:
begin a <= A; s <= ( ~A + 1'b1 ); p <= { 8'd0 , B , 1'b0 }; i <= i + 1'b1; end
1:
if( X == 8 ) begin X <= 4'd0; i <= i + 4'd2; end
else if( p[1:0] == 2'b01 ) begin p <= { p[16:9] + a , p[8:0] }; i <= i + 1'b1; end
else if( p[1:0] == 2'b10 ) begin p <= { p[16:9] + s , p[8:0] }; i <= i + 1'b1; end
else i <= i + 1'b1;
2:
begin p <= { p[16] , p[16:1] }; X <= X + 1'b1; i <= i - 1'b1; end
3:
begin isDone <= 1'b1; i <= i + 1'b1; end
4:
begin isDone <= 1'b0; i <= 4'd0; end
endcase /*************************/ assign Done_Sig = isDone;
assign Product = p[16:1]; /*************************/ assign SQ_a = a;
assign SQ_s = s;
assign SQ_p = p;
/**************************/
endmodule
最新文章
- Angular初学
- 项目里的jquery.min.js错误
- Adobe After Effects工程使用aep格式来存储
- DBA-mysql-字符集
- OpenResty(nginx+lua) 入门
- Linux上安装php
- R语言之中文分词:实例
- 【BZOJ-1797】Mincut 最小割 最大流 + Tarjan + 缩点
- C#远程共享文件路径访问
- hdu----(1466)计算直线的交点数(dp)
- 改用二进制启动Moses translation model提示Can&#39;t read ~/working/binarised-model/reordering-table
- NHibernate的简单例子
- UVa297 Quadtrees
- Chrome 控制台实用指南【转】
- hdu_5695_Gym Class(拓扑排序)
- Django的Form
- linux内核参数注释与优化
- views.py视图函
- pytorch基础
- 008-docker-安装-tomcat:8.5.38-jre8