FPGA课程设计报告.docx
《FPGA课程设计报告.docx》由会员分享,可在线阅读,更多相关《FPGA课程设计报告.docx(40页珍藏版)》请在冰豆网上搜索。
FPGA课程设计报告
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;
else