资源描述:
《eda课程设计报告书交通灯》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、《EDA应用实训》课程设计说明书目录1绪论02方案论证12.1程序设计的任务要求12.2方案选择13单元模块53.1程序中使用的信号介绍:53.2子模块功能介绍:54整体电路115仿真及实物图125.2实物图136心得16参考文献16附录17源程序1738《EDA应用实训》课程设计说明书1.绪论EDA课程教会了我们如何运用电脑辅助我们进行数字电路的设计。还教会了我们用于对FPGA进行编程的VHDL语言。我十分喜欢FPGA的编程,也觉得这次课程设计是一次实践的好机会。由于在之前我已经写过一些FPGA的程序,所以在拿到
2、这个题目时我的思路还是比较清晰的。2.方案论证2.1程序设计的任务要求2.1.1初始条件:设计一个交通灯控制器,有一条主干道和一条支干道汇合成十字路口,在每个入口处设置红、黄、绿三色箭头信号灯,红灯亮禁止通行,绿灯亮允许通行,黄灯亮则给行驶中的车辆有时间停在禁行线外。2.1.2要求完成的主要任务:2.1.2.1主干道和支干道构成的十字路口上有车辆交替运行,主干道每次直行通行时间为30s,左转通行时间为25s,支干道每次直行通行时间为20s,左转通行时间为15s。2.1.2.2每次绿灯变红灯时,黄灯先亮5s,才能变换
3、运行车道。上述时间设置可修改。2.1.2.3十字路口有数码管显示灯亮时间,要求灯亮时间以秒为单位进行减计数。2.2方案选择2.2.1方案一38《EDA应用实训》课程设计说明书只使用一个计时器完成所有计时工作,通过计数到不同的数值时发出不同的脉冲信号告诉系统相应的计时值已到。该方案的优势在于占用资源少,只用使用一个计时器就可完成5种不同的计时。但不管是在哪一个状态都会调用该计时器,一旦该计时器出错,整个系统都会受影响,不利于系统的维护和模块化编程的思想。2.2.2方案二使用5个计时器进行计时。在某个状态时,系统会调用
4、相应的计时器开始计时,并且只检测相应计时器的计时完成脉冲信号。该方案的缺点在于占用FPGA资源多,但由于FPGA上资源足够,这个缺陷不影响系统工作。但它的优势是很明显的,它采用模块化编程设计,单个计时器的复杂度远远小于方案一中的计时器,并且5个计时器完全类似,只要完成一个计时器的设计就能轻易完成整个计时模块的设计。因此,我选择方案二进行设计。2.2.3设计思路整个程序设计可以分为4个部分,灯的显示部分、数码管的显示部分、计时部分和按键对倒计数时间的调整部分。灯的显示部分可用状态机实现。由于交通灯的显示状况是有限的几
5、个状态,于是可以用状态机让灯在固定的几个状态中顺次切换。对于这个题目,我将灯的显示分了8个状态:首先,所有交通灯有12个:主干道直行的红黄绿灯,主干道左转的红黄绿灯,次干道直行的红黄绿灯,次干道左转的红黄绿灯。主干道直行绿灯亮、主干道左转红灯亮、次干道直行和左转红灯亮;主干道直行黄灯亮、主干道左转红灯亮、次干道直行和左转红灯亮;主干道直行红灯亮、主干道左转绿灯亮、次干道直行和左转红灯亮;主干道直行红灯亮、主干道左转黄灯亮、次干道直行和左转红灯亮;主干道直行红灯亮、主干道左转红灯亮、次干道直行绿灯亮,次干道左转红灯亮
6、;38《EDA应用实训》课程设计说明书主干道直行红灯亮、主干道左转红灯亮、次干道直行黄灯亮,次干道左转红灯亮;主干道直行红灯亮、主干道左转红灯亮、次干道直行红灯亮,次干道左转绿灯亮;主干道直行红灯亮、主干道左转红灯亮、次干道直行绿灯亮,次干道左转黄灯亮;于是我定义了一个信号STATE用于存储状态机的状态:TYPESTATE_TYPEIS(A,B,C,D,E,F,G,H);SIGNALSTATE:STATE_TYPE:=A;--状态初始化为A数码管的显示部分。设置了5个计时器,分别是30s计时器、25s计时器、20s
7、计时器、15s计时器和5s计时器。每个计时器都有一个使能EN信号,每个状态下只允许一个EN有效,当检测的计时器的EN信号有效时,就会将它的计数数值送到数码管显示。定义了一个常量数组:LED。代码如下:constantLED:data:=("11000000","11111001","10100100","10110000","10011001","10010010","10000010","11111000","10000000","10010000");--储存0~9的数码管显示字符将2位十进制数转化为2个8位二
8、进制数显示的代码为:hh:=current_30s/10;ll:=current_30srem10;LED2<=LED(hh);LED1<=LED(ll);计时部分使用5个计时器,每个计时器由使能信号EN控制启动。由计时完成信号SIN告知系统计时完成。5个计时器结构类似,下面是计时器30S的程序代码:SANs:process(time_1s,stop,pau