FPGA课程设计实验报告DOC文档格式.docx

上传人:b****1 文档编号:3107349 上传时间:2023-05-01 格式:DOCX 页数:14 大小:187.54KB
下载 相关 举报
FPGA课程设计实验报告DOC文档格式.docx_第1页
第1页 / 共14页
FPGA课程设计实验报告DOC文档格式.docx_第2页
第2页 / 共14页
FPGA课程设计实验报告DOC文档格式.docx_第3页
第3页 / 共14页
FPGA课程设计实验报告DOC文档格式.docx_第4页
第4页 / 共14页
FPGA课程设计实验报告DOC文档格式.docx_第5页
第5页 / 共14页
FPGA课程设计实验报告DOC文档格式.docx_第6页
第6页 / 共14页
FPGA课程设计实验报告DOC文档格式.docx_第7页
第7页 / 共14页
FPGA课程设计实验报告DOC文档格式.docx_第8页
第8页 / 共14页
FPGA课程设计实验报告DOC文档格式.docx_第9页
第9页 / 共14页
FPGA课程设计实验报告DOC文档格式.docx_第10页
第10页 / 共14页
FPGA课程设计实验报告DOC文档格式.docx_第11页
第11页 / 共14页
FPGA课程设计实验报告DOC文档格式.docx_第12页
第12页 / 共14页
FPGA课程设计实验报告DOC文档格式.docx_第13页
第13页 / 共14页
FPGA课程设计实验报告DOC文档格式.docx_第14页
第14页 / 共14页
亲,该文档总共14页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

FPGA课程设计实验报告DOC文档格式.docx

《FPGA课程设计实验报告DOC文档格式.docx》由会员分享,可在线阅读,更多相关《FPGA课程设计实验报告DOC文档格式.docx(14页珍藏版)》请在冰点文库上搜索。

FPGA课程设计实验报告DOC文档格式.docx

移位乘法器工作流程图

二、实验步骤

算法主程序

moduleMUL(A,B,data

);

input[7:

0]A;

0]B;

output[15:

0]data;

wire[15:

reg[7:

0]D;

0]A1;

0]B1;

regC;

always@(AorB)

begin

A1=A;

B1=B;

D=0;

C=0;

repeat(8)

if(A1[0]==1)

{C,D}=D+B1;

else

{C,D}=D+0;

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

>

1;

end

assigndata={D,A1};

endmodule

移位乘法器测试文件

moduletest;

reg[7:

//Outputs

wire[15:

//InstantiatetheUnitUnderTest(UUT)

MULuut(

.A(A),

.B(B),

.data(data)

initialbegin

//InitializeInputs

A=0;

B=0;

//Wait100nsforglobalresettofinish

#20;

A=8'

b0000_0010;

B=8'

b0000_1101;

//Addstimulushere

end

三、实验结果及分析

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算法是有符号数的乘法,因此积寄存器移位的时候,为了保留符号位,进行算术右移。

同时如果乘数或者被乘数为负数,则其输入为该数的补码,若积为负数,则输出结果同样为该数的补码。

主程序代码:

modulebooth8(data_on,data_out);

inputdata_on;

0]data_on;

output[19:

0]data_out;

wire[19:

0]R0,R1,R2;

regc1,p;

reg[4:

0]i;

reg[3:

0]tmp;

reg[19:

always@(data_on)

R0=0;

R1=data_on[7:

0];

R2=data_on[15:

8];

p=0;

case({R2[0],p})

2'

b00:

R0=R0;

b01:

R0=R0+R1;

b10:

R0=R0-R1;

b11:

endcase

c1=R0[7];

{c1,R0,R2,p}={c1,R0,R2,p}>

1;

data=0;

repeat(16)

repeat(5)

{tmp,data}={tmp,data}<

<

4;

if(tmp>

=5)

tmp=tmp+3;

tmp=tmp;

data[3:

0]=tmp;

{data,R0,R2}={data,R0,R2}<

assigndata_out=data;

顶层模块:

moduletop(

clk,rst,data_out,data_in);

inputclk,rst;

output[19:

output[15:

0]data_in;

reg[2:

0]addra,ct;

regclk1;

always@(posedgeclkornegedgerst)

begin

if(rst==0)

ct<

=0;

clk1<

elseif(ct==7)

=~clk1;

else

ct<

=ct+1;

booth8U1(

.data_out(data_out),

.data_on(data_in)

);

romU2(

.clka(clk1),//inputclka

.addra(addra),//input[2:

0]addra

.douta(data_in)//output[15:

0]douta

always@(posedgeclk1ornegedgerst)

if(rst==0)

addra<

=0;

=addra+1;

测试模块:

//Inputs

regclk;

regrst;

wire[19:

topuut(

.clk(clk),

.rst(rst),

.data_out(data_out),

.data_in(data_in)

clk=0;

rst=1;

#10rst=0;

#10rst=1;

#800$stop;

always#5clk=~clk;

COE文件,输入的8组数据

cdc输出结果:

A:

乘数B:

被乘数data_booth:

BCD输出积

十进制输出积

测试波形

经过两个礼拜的不懈努力,终于把最后的实验结果按要求完成了。

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

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

虽然团队只有三个人,但是我们互相协助,各司其职,每个人分派自己的任务,并且每天按时按量完成;

虽然我们三个人的基础不是很好,但是我们齐心协力,把劣势变成优势,把压力当成动力,每天在实验室忙完了还会主动的在寝室把没有做完的模块继续完善,或者把不了解的部分通过网上查资料、查课本、问同学等方式逐渐弄明白。

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

在此,特别向课程设计过程中那些帮助过我们的人表示我诚挚的谢意!

虽然两个礼拜时间不是很长,但那种做项目时沉心静气的心态以后值得继续保持!

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2