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;
endcase
c1=R0[7];
{c1,R0,R2,p}={c1,R0,R2,p}>>1;
end
data=0;
repeat(16)
begin
repeat(5)
begin
{tmp,data}={tmp,data}<<4;
if(tmp>=5)
tmp=tmp+3;
else
tmp=tmp;
data[3:0]=tmp;
end
{data,R0,R2}={data,R0,R2}<<1;
end
end
assign data_out=data;
endmodule
顶层模块:
module top(
clk,rst,data_out,data_in);
input clk,rst;
output [19:0] data_out;
output [15:0] data_in;
wire [15:0] data_in;
reg [2:0] addra,ct;
reg clk1;
always@(posedge clk or negedge rst) begin
if(rst == 0)
begin
ct<=0;
clk1<=0;
end
else if(ct==7)
begin
clk1<=~clk1;
ct<=0;
end
else
ct<=ct+1;
end
booth8 U1(
.data_out(data_out),
.data_on(data_in)
);
rom U2(
.clka(clk1), // input clka
.addra(addra), // input [2 : 0] addra
.douta(data_in) // output [15 : 0] douta );
always@(posedge clk1 or negedge rst) begin
if (rst==0)
addra <= 0;
else
addra <= addra + 1;
end
endmodule
测试模块:
module test;
// Inputs
reg clk;
reg rst;
// Outputs
wire [19:0] data_out;
wire [15:0] data_in;
// Instantiate the Unit Under Test (UUT) top uut (
.clk(clk),
.rst(rst),
.data_out(data_out),
.data_in(data_in)
);
initial begin
// Initialize Inputs
clk = 0;
rst = 1;
#10 rst=0;
#10 rst=1;
// Wait 100 ns for global reset to finish
#800 $stop;
// Add stimulus here
end
always #5 clk=~clk;
endmodule
三、实验结果及分析
COE文件,输入的8组数据
cdc输出结果:
A:乘数B:被乘数data_booth:BCD输出积
A:乘数B:被乘数data_booth:十进制输出积
测试波形
四、体会
经过两个礼拜的不懈努力,终于把最后的实验结果按要求完成了。

从一开始的一头雾水到逐渐明白了方向,了解了该如何操作。

一切都是对未知知识上下求索。

虽然团队只有三个人,但是我们互相协助,各司其职,每个人分派自己的任务,并且每天按时按量完成;虽然我们三个人的基础不是很好,但是我们齐心协力,把劣势变成优势,把压力当成动力,每天在实验室忙完了还会主动的在寝室把没有做完的模块继续完善,或者把不了解的部分通过网上查资料、查课本、问同学等方式逐渐弄明白。

整个课程设计的过程中,老师和研究生学长以及周围的同学也给了我们很大的帮助,对于一些我们不了解的知识他们都无私的分享给我们。

在此,特别向课程设计过程中那些帮助过我们的人表示我诚挚的谢意!
虽然两个礼拜时间不是很长,但那种做项目时沉心静气的心态以后值得继续保持!。

相关文档
最新文档