HDL课程设计交通灯控制电路设计精品Word下载.docx
《HDL课程设计交通灯控制电路设计精品Word下载.docx》由会员分享,可在线阅读,更多相关《HDL课程设计交通灯控制电路设计精品Word下载.docx(18页珍藏版)》请在冰豆网上搜索。
系统设计
一、交通灯控制电路设计目标要求:
(1)设计一个十字路口的交通灯控制电路,每条路配有红、黄、绿交通信号灯,通过电路对十字路口的两组交通灯的状态实现自动循环控制;
(2)实现东西车道和南北车道上的车辆交替运行,每次通行时间为20秒;
(3)要求黄灯亮3秒后,红灯才能转为绿灯,黄灯亮时要每秒闪亮一次;
(4)东西车道和南北车道每次通行的时间不同且可调;
(选作)
二、方案的对比分析与确定:
方案一:
要将南北方向的红灯的计时设为17,黄灯为3,两者之和为东西方向的绿灯亮的时间相同;
红17s黄3s
东西方向:
绿20s
南北方向:
方案二:
红绿时间相同,均为20秒,在红灯的最后3秒加入黄灯闪烁。
相比之下,后者的程序较简单,不用过多注意时间的变化。
倒数20秒的最后3秒总有一方的黄灯要闪烁,并且两方交替进行。
红17s红黄3s
分析:
红灯在黄灯闪烁3秒后才转变成绿灯,起先的思路是红灯亮17秒之后有黄灯闪烁3秒后转成绿灯,为了是程序较简单,在设计时改成了红灯亮了20秒,且最后3秒黄灯也闪烁,之后黄灯不亮,红灯转绿灯。
即采用这思路实现设计要求。
三、电路方框图及说明:
交通灯控制器的系统框图如图1.1所示
东西方向EW南北方向NS
GYRGYR
系统控制电路
≥20s
图1.1交通灯控制器系统框图
工作原理如下:
图中设南北方向的红、黄、绿灯分别为NSR、NSY、NSG东西方向的红、黄、绿灯分别为EWK、EWY、EWG。
东西为红至17秒时,南北为绿17秒;
东西为黄3秒时,南北仍为绿;
东西为绿20秒时,南北为先红17秒时黄灯闪3秒,红灯也还继续发亮。
南北、东西方向红、黄、绿时间分别为20秒、3秒、20秒,一次循环40秒。
4、电路设计:
将设计要求按找条件,分成多个模块,分别对齐进行程序编写。
1、倒计时模块:
always@(posedgeclk1ornegedgereset)//clk1用于倒计时
begin
if(!
reset)
count<
=0;
else
begin
N<
=N+1;
if(count==0)
=20;
ge<
=count%10;
shi<
=count/10;
if(flash==0)
beginred1<
=1;
green1<
red2<
green2<
flash<
end
elsebeginred1<
end
end
else
if(N==0)
begin
=count-1;
ge<
//黄灯闪烁程序
if((count<
=3)&
&
(flash==0)&
(count>
0))yellow1<
=~yellow1;
(flash==1)&
0))yellow2<
=~yellow2;
2、数码管显示的编程:
always@(num)
case(num)
0:
duan=8'
b1100_0000;
1:
b1111_1001;
2:
b1010_0100;
3:
b1011_0000;
4:
b1001_1001;
5:
b1001_0010;
6:
b1000_0010;
7:
b1111_1000;
8:
b1000_0000;
9:
b1001_0000;
default:
duan=8'
endcase
结果与讨论
一、调试过程:
1、建立工程:
运行QuatrusII软件,建立工程,File→NewProjectWizad。
点击NewProjectWizard后弹出指定工程名的对话框,在Diectory,Name,Top-LevelEntity并填写,按Next按钮,出现添加工程文件的对话框,直接按Next进行下一步,选择FPGA器件的型号,在Family下拉框中,我们选择Cyclone系列FPGA,然后在“Availabledevices:
”中根据核心板的FPGA型号选择FPGA型号,注意在Filters一栏选上“ShowAdvancedDevices”以显示所有的器件型号。
一直按Next进行,最后按Finish按钮即建立一个空项目。
2、建立文本文件:
选File→New,选择VerilogHDLFile,并输入程序,并保存。
3、分配管脚:
为芯片分配管脚可以用QuartusII软件里的“Assignments→Pins”菜单,也可以用tcl脚本文件。
本文介绍用tcl的方法。
在工程目录下建立一个name为Setup.tcl的file。
File→New,选择otherfiles页面:
有关tcl文件的更详尽内容可参考QuartusII的帮助文档。
在实际项目中,
该文件也可以根据具体管脚分配要求来改写。
对应核心板,设计管脚,保存到工程目录下,并注意在保存对话框选上“Addfiletocurrentproject”选项。
然后打开Tools->
TclScripts,选中刚才编辑的Script文件:
Setup,并点击Run。
4、编译:
按主工具栏上的编译按钮即开始编译,QuartusII下面的Message窗口会显示一些编译信息。
5、仿真:
建立波形仿真文件。
File→New,选择otherfiles页面。
在波形图的右处空白处点击鼠标右键,选择InsertNodeorBus,插入管脚。
在弹出的对话框中,选择NodeFinder(如图5.11所示)。
在NodeFinder中,先点击list,出现要仿真的管脚,然后点击〉〉,将所有管脚选到右框内,点击ok。
以下是该程序仿真图:
二、出现的现象及问题:
程序中的一个单词不同则会出现分析无法通过,显示出错误;
又是编译正常,可是却无法连接到实验装置,导致无试验结果;
有时也可能文件中缺少sof类型文件,最终也没有结果;
在QuartusII软件上进行仿真时,发现不能得到预期的效果,分析得知由于分频过大的原因,软件仿真得不到预期结果。
三、解决方案:
在输入程序时只能多多谨慎,检查用词是否一致,begin是否有对应的end,module是否有endmodule,这样可减少错误的发生。
无法连接到实验装置可能有多方面,一:
插头没有正确插入;
二:
装置本身就是有问题的,应换实验装置;
三:
电脑中没有与实验装置一致的下载装置接头。
实验室应该多多加强设备的完整,定时检查器备的运行是否正常,更改完善设备,保证实验中减少不必要的检查器件正常的过程;
四:
省去时钟信号的分频操作,但是在硬件验证过程中加入分频操作,可以解决。
对于Verilog语言的编程方面,特别在对变量给予初值时,完全不同于C语言编程,我们在对许多变量进行了初值设置,此后编译每每都不通过,在认真思考后,查阅了课本,发现在HDL编程中,不能对变量初值。
我们恍然大悟,在以后的编程中我们牢记住了这一点。
心得体会
通过本实验再一次的体验到了细心对一个编程者的重要性,和程序的规范性对于程序的重要性,这些平时我们忽略的问题,其实有时候关乎着我们编程的成功率;
再者,在verilog语言中,我们必须注意其与C语言的异同,比如格式和变量定义,还有模块的调用,和时钟信号的应用。
在刚开始的倒计时时,感想就是假使用JAVA或C语言可能会较容易。
还有对verilogHDL设计语言还比较陌生,但它是一门很好的硬件描述语言,可以直白的描述实际的电路,实际的系统模型,易懂而且易于实现,我觉得在以后多加练习,可以对以后的学习和工作带来莫大的帮助。
这次刚开学就分配的实验课程设计就是对我们的一次考核,也可以说是一次考验,在平时做题目比较简单,这次课程设计综合考核了我们对上一学期的学习结果。
课程设计培养了学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程。
然而从理论到实践,我在做课程设计的几天里,使我对有了更进一步的认识和了解,要想学好它要重在实践,要通过不断的实际操作才能更好地学习它,但是学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在本上所没有学到过的知识。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,从而提高自己的实际动手能力和独立思考的能力。
在设计过程中遇到问题,可以说得是困难重重,遇到了各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知解得不够深刻,掌握得不够牢固,在边编学程序的过程中我几乎是重新复习课本上的知识,但这还是没能让我完成这次课程设计,通过询问同学、到网上查询资料慢慢的完善这次做业才勉强完成。
对这次实验总的评价就是自己知道了QuartusII和ModelSim的好处,虽然有些地方还是不方便,也没有真正的理解清楚,但是它们的基本使用还是掌握了。
在本次设计中,或多或少有课一些进步,唯一遗憾的是没有请教老师,把不会的好好弄清楚。
同时也深深体会了团队精神的重要,队友之间的相互帮助和鼓励在工作中是十分重要的。
参考文献
1、《VerilogHDL数字设计教程》作者:
贺敬凯西安电子科技大学出版社
出版日期:
2010年4月
2、《FPGA设计及应用(第二版)》作者:
褚振勇齐亮田红心高楷娟
西安电子科技大学出版社出版日期:
2006年12月
3、《基于CPLD/FPGA的数字通信系统建模与设计》作者:
段吉海黄智伟
电子工业出版社出版日期:
2004年8月
附录
设计程序:
moduletraffic_light(clk,clk1,clk2,reset,red1,yellow1,green1,red2,yellow2,green2,duan,wei,N);
inputreset,clk;
outputred1=0,yellow1=0,green1=0,red2=0,yellow2=0,green2=0,duan,wei,clk1,clk2,N;
reg[4:
0]count=0;
reg[3:
0]num;
reg[5:
0]shi,ge;
regM,N,flash;
regred1,yellow1,green1,red2,yellow2,green2;
reg[7:
0]duan;
0]wei;
regclk1,clk2;
reg[24:
0]count_clk1;
reg[13:
0]count_clk2;
always@(posedgeclk)
if(count_clk1<
12500000)
count_clk1<
=count_clk1+1;
clk1<
=~clk1;
if(count_clk2<
12500)
count_clk2<
=count_clk2+1;
clk2<
=~clk2;
if(flash==0)//闪烁程序
if(N==0)//计数
always@(posedgeclk2)
wei<
=4'
b0000;
elseif(M==1'
b1)
M<
=1'
b0;
=M+1'
b1;
case(M)
1'
b0:
beginwei<
b0111;
num<
=shi;
b1:
b1011;
=ge;
wei<
case(num)
endmodule
实验图:
引脚配置: