FPGA课程设计实验报告

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

合肥工业大学大学

实验报告

课程名称: FPGA设计

实验名称:移位乘法器设计 & 8位Booth乘法器设计*名:**

学号: ********

班级:电子科学与技术11-1班

指导教师:**

合肥工业大学电子科学与应用物理学院制

移位乘法器

一、实验原理

移位和相加乘法原理,乘法通过逐项移位相加原理来实现,从被乘数的最低位开始,若为1,则乘数右移后与上一次的和相加;若为0,左移后以全零相加,直至被乘数的最高位。

移位乘法器工作流程图

二、实验步骤

算法主程序

module MUL(A,B,data

);

input [7:0] A;

input [7:0] B;

output [15:0] data;

wire [15:0] data;

reg [7:0] D;

reg [7:0] A1;

reg [7:0] B1;

reg C;

always @(A or B)

begin

A1 = A;

B1 = B;

D = 0;

C = 0;

repeat(8)

begin

if(A1[0]==1)

{C,D} = D + B1;

else

{C,D} = D + 0;

{C,D,A1} = {C,D,A1} >> 1;

end

end

assign data = {D,A1};

endmodule

移位乘法器测试文件

module test;

reg [7:0] A;

reg [7:0] B;

// Outputs

wire [15:0] data;

// Instantiate the Unit Under Test (UUT) MUL uut (

.A(A),

.B(B),

.data(data)

);

initial begin

// Initialize Inputs

A = 0;

B = 0;

// Wait 100 ns for global reset to finish

#20;

A = 8'b0000_0010;

B = 8'b0000_1101;

// Add stimulus here

end

endmodule

三、实验结果及分析

2进制输入输出结果

10进制输入输出结果

四、体会

通过移位乘法器的设计,简单的了解了ISE软件的基本功能,主要菜单选项,以及如何建立一个工程,如何在工程里面写程序和进行编译和综合等。

总体来说最困难的部分就是把这个移位乘法器的算法弄明白。可能我们平常自己算乘法没有任何困难,但是要通过编码的形式,让计算机能够了解整个算法的流程却不是一件容易的事情。在整个编写移位乘法器的过程中,看懂整个流程图花费了我很长的时间。

了解整个算法的流程之后编程自然顺理成章了。所以,我在之后做自己的课题“booth乘法器”的时候我也花费了很长的时间通过上网查询,详细了解这个算法的确切含义。

虽然花费了很长的时间在研究算法上,但是我觉得是值得的,因为那是最根本的地方。最后结果也如愿出来了。

所以,我觉得以后在编程的时候,了解你要编写模块的作用以及通过什么算法来实现是一件很重要的事情。

8位booth乘法器设计

一、实验原理

Booth算法是一种十分有效的计算有符号数乘法的算法。算法的新型之处在于减法也可用于计算乘积。Booth发现加法和减法可以得到同样的结果。因为在当时移位比加法快得多,所以Booth发现了这个算法,Booth算法的关键在于把1分类为开始、中间、结束三种,如下图所示

当然一串0或者1的时候不操作,所以Booth算法可以归类为以下四种情况:

Booth算法根据乘数的相邻2位来决定操作,第一步根据相邻2位的4中情况来进行加或减操作,第二部仍然是将积寄存器右移,算法描述如下:

(1)根据当前为和其右边的位,做如下操作:

00: 0的中间,无任何操作;

01: 1的结束,将被乘数加到积的左半部分;

10:1的开始,积的左半部分减去被乘数;

11: 1的中间,无任何操作。

(2)将积寄存器右移1位。

因为Booth算法是有符号数的乘法,因此积寄存器移位的时候,为了保留符号位,进行算术右移。同时如果乘数或者被乘数为负数,则其输入为该数的补码,若积为负数,则输出结果同样为该数的补码。

二、实验步骤

主程序代码:

module booth8(data_on,data_out);

input data_on;

wire [15:0] data_on;

output [19:0] data_out;

wire [19:0] data_out;

reg [7:0] R0,R1,R2;

reg c1,p;

reg [4:0] i;

reg [3:0] tmp;

reg [19:0] data;

always@(data_on)

begin

R0=0;

R1=data_on[7:0];

R2=data_on[15:8];

p=0;

repeat(8)

begin

case({R2[0],p})

2'b00: R0=R0;

2'b01: R0=R0+R1;

2'b10: R0=R0-R1;

2'b11: R0=R0;

相关文档
最新文档