FPGA课程设计报告 1.docx

上传人:b****9 文档编号:26171872 上传时间:2023-06-17 格式:DOCX 页数:40 大小:3.09MB
下载 相关 举报
FPGA课程设计报告 1.docx_第1页
第1页 / 共40页
FPGA课程设计报告 1.docx_第2页
第2页 / 共40页
FPGA课程设计报告 1.docx_第3页
第3页 / 共40页
FPGA课程设计报告 1.docx_第4页
第4页 / 共40页
FPGA课程设计报告 1.docx_第5页
第5页 / 共40页
点击查看更多>>
下载资源
资源描述

FPGA课程设计报告 1.docx

《FPGA课程设计报告 1.docx》由会员分享,可在线阅读,更多相关《FPGA课程设计报告 1.docx(40页珍藏版)》请在冰豆网上搜索。

FPGA课程设计报告 1.docx

FPGA课程设计报告1

F

P

G

A

学部:

信息科学与技术学部

专业:

通信工程

班级:

10级1班

学号:

100103011125

姓名:

万洁

指导老师:

祝宏

合作伙伴:

张紫君2012.12.13

一.《任务书》:

实验一100进制的可逆计数器(11——12周)

实验二交通灯控制系统(15周)

实验三多功能数字钟系统(14-15周)

二.实验书写格式:

一:

题目要求

二:

程序代码

三:

操作步骤及运行结果截图

四:

心得体会

三.实验附录:

一:

老师提供的资源

二:

关于实验所用EP4CE115F29板的简介

 

实验一100进制的可逆计数器

一、设计一个可控的100进制可逆计数器,要求用实验箱下载。

(1)计数器的时钟输入信号周期为200ns。

(2)以十进制形式显示。

(3)有一个复位端clr和两个控制端plus和minus,在这些控制信号的作用下,计数器具有复位、增或减计数、暂停功能。

clr

plus

minus

功能

0

×

×

复位为0

1

1

0

递增计数

1

0

1

递减计数

1

1

1

暂停计数

二、程序如下:

modulekeni100(CLR,CLK,PLUS,MINUS,OUT);//100进制的可逆计数器

inputCLR,PLUS,MINUS,CLK;

output[7:

0]OUT;

reg[7:

0]OUT;

always@(posedgeCLK)

begin

if(!

CLR)//如果CLR为零,输出为零;反之,运行else程序

OUT[7:

0]<=0;

else

begin

if(PLUS==0&&MINUS==1)//100进制的递减计数

begin

if(OUT[3:

0]==0)

begin

OUT[3:

0]<=9;

if(OUT[7:

4]==0)OUT[7:

4]<=9;

else

OUT[7:

4]<=OUT[7:

4]-1;

end

elseOUT[3:

0]<=OUT[3:

0]-1;

end

if(PLUS==1&&MINUS==0)//100进制的递增计数

begin

if(OUT[3:

0]==9)

begin

OUT[3:

0]<=0;

if(OUT[7:

4]==9)OUT[7:

4]<=0;

else

OUT[7:

4]<=OUT[7:

4]+1;

end

elseOUT[3:

0]<=OUT[3:

0]+1;

end

if(PLUS==1&&MINUS==1)OUT<=OUT;//若PLUS和MINUS都为1,暂停计数

if(PLUS==0&&MINUS==0)OUT<=0;//若都为零,输出为零

end

end

endmodule

三、运行程序

1、在quarters

9.1输入程序

打开quarters

界面,点击file→New,在出现的对话框,如图1.1所示,选择TextFile,点击OK.

——图1.1

在出现的输入界面内输入程序,点击file→saveas,在出现的对话框中点击Yes,然后在出现的newprojectWizard对话框中点击next,在Family&DeviceSettings对话框中选择如下图1.2所示的选项,在选择第三方软件的对话框中的选项选为none后点击next,在随后出现的对话框中,点击finish。

设置完成。

——图1.2

2、点击project→SetasTop-LevelEntity,指向所输入的文件。

3、点击Processing→Start→StartAnalysis&Synthesis。

——图1.3

4、点击File→New出现上面第一步时出现的对话框,如图1.1,选择VectorWaveformFile。

5、点击View→UtilityWindows→NodeFinder,在出现的对话框中点击List,如下图1.4所示

——图1.4

选择所需要的节点,将其拉到后面的Name栏中,并设置输入数据

6、选择EndTime:

点击Edit→EndTime,设置参数,如下图1.5所示

——图1.5

7、输入参数的数据设置完成后,保存,仿真图形如下图1.6所示:

——图1.6

8.点击Assigment→Settings,在出现的对话框(如图1.7所示)中,选择SimulatorSettings,在Simulationmode中选择Functional,进行功能编译。

——图1.7

8、点击Processing→GenerateFunctionalSimulationNetlist

9、点击Processing→StartSimulation,进行仿真。

四、仿真结果:

——图1.8

如上图1.8所示,当CLR为0时,OUT清零;当CLR为1时,OUT开始输出,当PLUS=1,MINUS=0时,OUT开始递加;

——图1.9

如图1.9所示,当PLUS=1,MINUS=1时,OUT暂停计数;当PLUS=0,MINUS=1时,OUT开始递减。

五、封装

在quartus

11.0中点击file→openproject,在弹出的对话框中选择counter100文件,单击右键选择CreatSymbolFileforCurrentFile

——图1.10

上图1.10为counter100的封装图,在quartus中打开此图,双击,将会看到counter100的程序.

六、试验箱下载

将编好的程序应用于硬件上进行验证,所用的电路板子是:

EP4CE115F29C7外观如下图1.11所示:

——图1.11

1.安装硬件

在安装向导中选择如下图1.12所示的安装路径,点击确定。

——图1.12

2、硬件安装完毕后,在quartus11.0中封装图连接,如下图图1.13

——图1.13

封装模块div和decode4_7是辅助模块,div是分频模块,decode4_7是译码部分。

(相关程序在报告后面的附件)

3、图形连接完毕后,单击File→Saveas,确定,修改设置,如下图图1.14所示:

——图1.14

4、单击Processing→StartCompilation,进行编译,没有错误后进行下一步。

编译结果如下图1.15所示。

——图1.15

5、单击Tools→Programmer,在弹出的对话框中,单击Hardware

弹出一个对话框,选择USB-Blaster[USB-0],如下图1.16所示

6、点击Start,开始运行。

——图1.16

七、硬件部分照片截图

——图1.17

如图1.17所示Clk(sw[3])与Clr(sw[0])置为1时,将Plus(sw[1])置为1,Minus(sw[2])置为0,开始从0递增,图为到99时,将Plus与Minus都置为1,暂停计数为99;

——图1.18

如图1.18,1.19所示,下一时刻,数码管显示为0,重新开始递增计数;

——图.1.19

将Plus(sw[1])置为0,Minus(sw[2])置为1,开始从99递减计数。

 

八.实验总结:

此次实验,花费的时间有些长,主要是因为代码的编写方面以及封装及连接图方面的不太的熟练,在他人的指导及自己的反复操作练习下,终于完整的完成了第一个实验,很开心。

这次实验,我收获的是对FPGA软件的运用和熟练,也收获了代码编写的积累与熟悉,充分感受到了代码与软件运用,与硬件器件所展现的知识与实践的相统一,体味到了实验的趣味性。

 

实验二交通灯控制系统

一、交通灯控制系统,要求用实验箱下载。

(1)设计一个十字路口交通信号灯的定时控制电路。

要求红、绿灯按一定的规律亮和灭,绿灯亮时,表示该车道允许通行;红灯亮时,该车道禁止通行。

并在亮灯期间进行倒计时,并将运行时间用数码管显示出来。

(2)要求主干道每次通行时间为40秒,支干道每次通行时间为30秒。

每次变换运行车道前绿灯闪烁,持续时间为5秒。

即车道要由主干道转换为支干道时,主干道在通行时间只剩5秒钟时,绿灯闪烁5秒显示,支干道仍为红灯,以便主干道上已过停车线的车继续通行,未过停车线的车停止通行。

同理,当车道由支干道转换为主干道时,支干道绿灯闪烁显示5秒钟,主干道仍为红灯。

(3)定时器要求采用递减计时方式进行计时。

注:

TimeH、TimeL分别表示计数器的高位和低位

HG、HR分别表示主干道的绿灯和红灯

CG、CR分别表示支干道的绿灯和红灯

两个定时时间:

绿灯闪烁和绿灯停止闪烁

4个状态:

S0:

主干道绿灯亮,支干道红灯亮。

S1:

主干道绿灯闪烁,支干道红灯亮。

S2:

支干道绿灯亮,主干道红灯亮。

S3:

支干道绿灯闪烁,主干道红灯亮。

二.程序如下:

moduletraffic00(clk,en,lampar,fag,lampbr,fbg,numa,numb);

inputclk,en;

output[7:

0]numa,numb;

reg[7:

0]numa,numb;//计时显示

outputfag,fbg,lampar,lampbr;//fag:

flashagreen

reglampar,lampag,lampbr,lampbg;//表示主路?

路共四个灯

regtempa,tempb;//装入计数

reg[2:

0]counta,countb;//灯亮的顺序

reg[7:

0]ared,agreen,bred,bgreen;

always@(en)

if(!

en)

begin//设置各种灯的预置数

ared<=8'b00110000;

agreen<=8'b01000000;

bred<=8'b01000000;

bgreen<=8'b00110000;

end

always@(posedgeclk)

begin

if(en)

begin

if(!

tempa)

begintempa<=1;

case(counta)//控制灯亮的顺序

0:

beginnuma<=agreen;lampag<=1;lampar<=0;counta<=1;end

1:

beginnuma<=ared;lampag<=0;lampar<=1;counta<=0;end

default:

lampar<=1;

endcase

end

elsebegin//倒计时

if(numa>8'b00000001)

beginif(numa[3:

0]==0)

beginnuma[3:

0]<=4'b1001;numa[7:

4]<=numa[7:

4]-1;end

elsenuma[3:

0]<=numa[3:

0]-1;

end

if(numa==8'b0000010)tempa<=0;

end

end

elsebeginlampar<=1;lampag<=0;counta<=0;tempa<=0;end

End

三.运行程序

步骤与实验一的步骤基本相同,可参照实验一的步骤。

四、仿真结果截图

——图2.1

从上图2.1可以看出,在前35秒,主干道绿灯亮,次干道红灯亮;在最后5秒,主干道绿灯闪烁,次干道红灯亮;下一时刻,开始30进制的递减。

——图2.2

如图2.2所示,在前25秒,次干道绿灯亮,主干道红灯亮;在最后5秒,次干道绿灯闪烁,主干道红灯亮;下一时刻,开始40进制的递减

五、封装

在quartus

11.0中点击file→openproject,在弹出的对话框中选择traffic00文件,单击右键选择CreatSymbolFileforCurrentFile

封装图如下2.3所示。

traffic00的封装图

——图2.3

6、试验箱下载

所用的硬件与实验一是同一个板子,步骤可参考实验一的步骤。

封装图连接如下图2.4所示:

——图2.4

7、硬件部分照片截图

——图2.5

当将en(sw[17])和ncR(sw[16])均置为1时,如图2.5所示,开始40进制的递减计数,主干道绿灯亮,次干道红灯亮。

为零后,开始30进制递减计数,如下图2.6所示此时开始30进制递减计数,主干道红灯亮,次干道绿灯亮;

——图2.6

——图2.7

如图2.7所示,最后五秒绿灯闪烁,为零后,开始40进制递减计数。

八:

实验总结:

此次实验,花费了较长时间在最后的编译上,因为中途出现了很多问题,出现了PC板上,数码管不亮,灯亮,以及数码管显示错误,或是灯显示不亮等问题,以致于在代码上做了几次的改写,但最后还是终于完成了。

总是在把文件置顶,修改硬件参数,封装,连接图上出现一些小错误。

记得最后一次出现的错误竟然是忘了封装管脚,以至于每次都编译运行无错误,可总是下载失败。

在同学的指点下,发现错误,改正后,终于运行成功。

可见,在实验上需要一定的细心与耐心,在每一步中都要一丝不苟的完成好。

实验三多功能数字钟系统

一、多功能数字钟系统(层次化设计),要求用实验箱下载。

(1)基本功能:

60秒—60分—24小时。

(2)扩展功能:

①报时;每小时59分51,53,55,57秒低频报时,59秒高频报时。

②校时校分;

③时段控制;6点—18点输出灯不亮,其它时间灯亮。

④独立设计除上述3种功能以外的扩展功能,可加分。

2、程序如下

1、24进制的程序

modulem24(H,CPH,RD);

output[7:

0]H;

inputCPH,RD;

reg[7:

0]H;

always@(negedgeRDorposedgeCPH)

begin

if(!

RD)H[7:

0]<=0;

else

begin

if((H[7:

4]==2)&&(H[3:

0]==3))//当高位为2,低位为3时,将其赋值为零

begin

H[7:

0]<=0;

end

else//若高位不为2,低位为9时,高位加1

begin

if(H[3:

0]==9)

beginH[3:

0]<=0;

H[7:

4]<=H[7:

4]+1;

end

elseH[3:

0]<=H[3:

0]+1;//若高位不为2,低位不为9时,低位加1

end

end

end

endmodule

2、60进制的程序(分钟和秒程序基本相同):

modulem60(M,CP60M,CPM,RD);

output[7:

0]M;

outputCP60M;

inputCPM;

inputRD;

wireCP60M;

reg[7:

0]M;

always@(negedgeRDorposedgeCPM)

begin

if(!

RD)

beginM[7:

0]<=0;

end

else

begin

if((M[7:

4]==5)&&(M[3:

0]==9))//当高位为5,低位为9时,将其赋值为0

begin

M[7:

0]<=0;

end

else//若低位为9时,低位赋值为0

begin

if(M[3:

0]==9)

beginM[3:

0]<=0;

if(M[7:

4]==5)//若高位为5时,高位赋值为0

beginM[7:

4]<=0;end

elseM[7:

4]<=M[7:

4]+1;//若高位不为5低位为9时,高位加1

end

elseM[3:

0]<=M[3:

0]+1;//若高位不为5低位不为9时,低位加1

end

end

end

assignCP60M=~(M[6]&M[4]&M[3]&M[0]);

endmodule

3、报时的程序:

modulebaoshi(m6,m4,m3,m0,s6,s4,s3,s0,dy,gy,bshi);

inputm6,m4,m3,m0,s6,s4,s3,s0,dy,gy;

outputbshi;

wirebm;

regbshi;

assignbm=m6&m4&m3&m3&m0&s6&s4&s0;

always@(bmors3ordyorgy)

begin

if(bm&s3)

bshi<=gy;

elseif(bm)

bshi<=dy;

else

bshi<=0;

end

endmodule

4、校时的程序:

modulejiaoshi(CPM,CPH,CPS,CP60M,CP60S,SWM,SWH);

outputCPM,CPH;

inputSWM,SWH;

inputCPS,CP60S,CP60M;

regCPM,CPH;

always@(SWMorSWHorCPSorCP60SorCP60M)

begin

case({SWM,SWH})

2'b10:

beginCPM<=CPS;CPH<=CP60M;end//校分

2'b01:

beginCPM<=CP60S;CPH<=CPS;end//校时

default:

beginCPM<=CP60S;CPH<=CP60M;end

endcase

end

endmodule

5、时段控制的程序:

moduleludeng(h,sk);

input[7:

0]h;

outputsk;

regsk;

always@(h)

begin

if((h<=5)||(h>=17))

sk<=1;

else

sk<=0;

end

endmodule

三、运行程序

步骤与实验一的步骤基本相同,可参照实验一的步骤。

4、仿真结果截图

——图3.1

如图3.1所示,为24进制,当高位为2低位为3时,下一时刻,高低位都被赋值为零;

——图3.2

如图3.2所示,为60进制,当高位为5低位为9时,下一时刻,高低位都被赋值为零;

——图3.3

如图3.3所示,为校时校分,SWM(sw[1])为校分,SWH(sw[2])为校时;

-图3.4

如图3.4所示,为整点报时,在每一小时的最后5秒报时,这里用高频闪烁来代替;

——图3.5

如上图3.5所示,为时段控制,在6:

00到18:

00灯灭,在18:

00到第二天6:

00灯亮。

五、封装

在quartus

11.0中点击file→openproject,在弹出的对话框中选择文件,单击右键选择CreatSymbolFileforCurrentFile,封装图如下3.6~3.12所示

24进制模块分钟60进制模块秒60进制模块

——图3.7——图3.8——图3.9

报时模块校时模块时段控制模块

——图3.10——图3.11——图3.12

六、试验箱下载

所用的硬件与实验一是同一个板子,步骤可参考实验一的步骤。

封装图连接如下:

——图3.13

七、硬件部分照片截图

——图3.14

——图3.15

如图3.15,3.14所示,当将ncR(sw[3])置1,开始计时,当s(sw[5])置1时为高频,SWM(sw[1])为校分,SWH(sw[2])为校时,上图为早上5点59分59秒时,绿灯亮;早上,6点时,绿灯灭;

——图3.16

——图3.17

如上图3.16,3.17所示,当到17:

59:

58时,绿灯是灭的,18:

00时,绿灯开始亮,此为时段控制。

八、心得体会

这次FPGA设计中,有很多的不顺利,刚开始没有一点思路,到后来的不断出错误,不断的修改,到最后一点一点修改成功。

其中学到了很多的新东西,并且更深的了解编程的方法,感到充实了自己。

但是在应用在硬件上的时候,又出了许多问题,使我改正了自己在实验时的一些不准确的操作,对我在以后的实验有很大的帮助。

三:

附件

一.老师提供的资源:

1.分频程序

2.译码程序

3.管脚分配图

二.关于实验所用EP4CE115F29板的简介

 

一:

老师提供的资源

1、分频程序

modulediv_zh(f,_500HzOut,_1KHzOut,

ncR,CLOCK_50,s);

inputncR,CLOCK_50,s;

output_500HzOut,_1KHzOut,f;

wire_1HzOut,_5HzOut;

assignf=s?

_5HzOut:

_1HzOut;

divn#(.WIDTH(26),.N(50000000))

u0(.clk(CLOCK_50),

.rst_n(ncR),

.o_clk(_1HzOut)

);

divn#(.WIDTH(17),.N(100000))

u1(.clk(CLOCK_50),

.rst_n(ncR),

.o_clk(_500HzOut)

);

divn#(.WIDTH(16),.N(50000))

u2(.clk(CLOCK_50),

.rst_n(ncR),

.o_clk(_1KHzOut)

);

divn#(.WIDTH(24),.N(10000000))

u3(.clk(CLOCK_50),

.rst_n(ncR),

.o_clk(_5HzOut)

);

endmodule

moduledivn(o_clk,clk,rst_n);

inputclk,rst_n;

outputo_clk;

parameterWIDTH=3;

parameterN=6;

reg[WIDTH-1:

0]cnt_p;

reg[WIDTH-1:

0]cnt_n;

regclk_p;

regclk_n;

assigno_clk=(N==1)?

clk:

(N[0]?

(clk_p|clk_n):

clk_p);

always@(posedgeclkornegedgerst_n)

begin

if(!

rst_n)

cnt_p<=0;

elseif(cnt_p==N-1)

cnt_p<=0;

else

cnt_p<=cnt_p+1;

end

always@(posedgeclkornegedgerst_n)

begin

if(!

rst_n)

clk_p<=0;

elseif(cnt_p<(N>>1))

clk_p<=1;

else

clk_p<=0;

end

always@(negedgeclkornegedgerst_n)

begin

if(!

rst_n)

cnt_n<=0;

elseif(cnt_n==N-1)

cnt_n<=0;

el

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

当前位置:首页 > 外语学习 > 韩语学习

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1