Booth乘法器实验报告Word下载.doc
《Booth乘法器实验报告Word下载.doc》由会员分享,可在线阅读,更多相关《Booth乘法器实验报告Word下载.doc(3页珍藏版)》请在冰豆网上搜索。
(1)根据当前为和其右边的位,做如下操作:
00:
0的中间,无任何操作;
01:
1的结束,将被乘数加到积的左半部分;
10:
1的开始,积的左半部分减去被乘数;
11:
1的中间,无任何操作。
(2)将积寄存器右移1位。
因为Booth算法是有符号数的乘法,因此积寄存器移位的时候,为了保留符号位,进行算术右移。
同时如果乘数或者被乘数为负数,则其输入为该数的补码,若积为负数,则输出结果同样为该数的补码。
三、实验步骤
(1)打开QuartusII
(2)将子板上的JTAG端口和PC机的并行口用下载电缆连接,打开试验台电源。
(3)执行Tools→Programmer命令,将booth_multiplier.sof下载到FPGA中。
(4)在实验台上通过模式开关选择FPGA-CPU独立调试模式010.
(5)将开关CLKSEL拨到0,将短路子DZ3短接且短路子DZ4断开,使FPGA-CPU所需要的时钟使用正单脉冲时钟。
四、实验现象
实验结果见下表:
重复
步骤
被乘数(md)
积(p)
被乘数是(-7)10
乘数是(8)10
初始值
1001
000001100
1
1:
00->
nop
2:
积右移一位
000000110
2
10->
积=积-被乘数
011100110
001110011
3
11->
000111001
4
01->
积=积+被乘数
101011001
110101100
被乘数是(-4)10
乘数是(-5)10
1100
000010110
010010110
001001011
000100101
110100101
111010010
001010010
000101001
五、具体代码实现
端口声明:
port
(clk:
instd_logic;
md:
instd_logic_vector(3downto0);
mr:
p:
outstd_logic_vector(8downto0);
final:
outstd_logic);
信号量声明:
signalp_s:
std_logic_vector(8downto0);
signalcounter:
std_logic_vector(3downto0):
="
0000"
;
--counter
具体算法实现如下:
process(clk)is
begin
if(clk'
eventandclk='
1'
)then--时钟沿到来
if(counter="
)then
p_s(8downto0)<
&
mr(3downto0)&
"
0"
--进行初始化操作
elsif(counter(0)='
0'
=p_s(8)&
p_s(8downto1);
--计数为偶数时进行移位操作
)then--计数位奇数是进行加或减操作
--由于计算过程中会进行移位操作,所以p_s(1downto0)始终表示当前位和当前位的右边--一位
if(p_s(1downto0)="
10"
)then
p_s(8downto5)<
=p_s(8downto5)+((notmd)+"
0001"
);
--减法操作
elsif(p_s(1downto0)="
01"
=p_s(8downto5)+md(3downto0);
--加法操作
endif;
endif;
if(counter<
1001"
)then--计数器counter及final输出的操作
counter<
=counter+"
elsif(counter="
final<
='
else
endif;
p<
=p_s;
endif;
endprocess;
--进程结束