北邮数字逻辑小学期交通灯控制器.docx
- 文档编号:23828107
- 上传时间:2023-05-21
- 格式:DOCX
- 页数:14
- 大小:954.54KB
北邮数字逻辑小学期交通灯控制器.docx
《北邮数字逻辑小学期交通灯控制器.docx》由会员分享,可在线阅读,更多相关《北邮数字逻辑小学期交通灯控制器.docx(14页珍藏版)》请在冰豆网上搜索。
北邮数字逻辑小学期交通灯控制器
实验一交通灯控制器
一、实验目的
a)熟练掌握 VHDL语言和QuartusII软件的使用。
b)用VHDL进行较复杂逻辑电路的设计和调试。
c)熟练掌握isp期间的下载方法。
d)理解状态机的工作原理和设计方法。
二、实验所用设备和环境
a)实验设备:
TEC-8实验箱一个、EPM7128SLC84-15芯片一个
b)实验环境:
WinXP+QuartusII
三、实验任务及功能介绍
在十字路口,每条道路各有一组红、黄、绿灯,用以指挥车辆和行人有序的通行。
其中红灯亮表示禁止通行,黄灯亮表示停车,绿灯亮表示可以通行。
设计一交通灯控制器用于自动控制十字路口的交通灯,指挥各种车辆和行人安全通行。
a)东西和南北方向各有一组绿、黄、红等用于指挥交通,绿灯、黄灯和红灯的持续时间分别为5s,1s和6s。
其中初始状态为东西南北四个方向红黄绿灯全亮,持续1秒。
后东西方向绿灯,南北方向红灯,持5秒。
后东西方向黄灯闪烁,南北方向持续红灯,维持1秒。
后东西、南北方向交换。
b)有紧急状况时,如有消防车、救护车或者其他需要优先放行的车辆时,各方向上均是红灯亮。
当紧急状况解除时,回复原来的状态,继续正常运行。
c)当复位开关置1时,切换到初始状态,即四个方向红黄绿灯全亮。
四、课题分析及流程图:
一共六个状态:
S0,S1,S2,S3,S4,紧急状态。
五、设计思路
a)本题主要是红黄绿灯时间的计时(即分频),和状态的切换。
由于外部时钟信号CLK信号为1kHz,而我们需要1Hz,因此需要分频。
b)对于计时,采用计数器方式,根据外部时钟信号CLK,在上升沿时,将计数器加一,分别定义T1,T1,T3,T4的整型数,范围分别是0~999,0~1999,0~4999和0~199,分别表示1秒、2秒、5秒和0.2秒,其中0.2秒用于黄灯闪烁。
引入TIMER数组来表示该进行何种时间的计数,每一位依次表示红黄绿灯,为分频后信号。
c)设计六个状态:
S0,S1,S2,S3,S4和紧急状态。
对于状态切换,引入currentSTATE和nextSTATE两个状态变量,取值在STATE中选择:
TYPESTATEIS(S0,S1,S2,S3,S4);
d)东西南北方向灯的表示:
有三个4位二进制数,RED、YELLOW和GREEN进行输出,从高位到地位依次表示东西南北四个方向的灯的状态,1亮,0灭。
e)为了得知什么时候切换状态,需引入数组SWITCH,4位二进制数,每一位依次表示红黄绿灯计时器是否计时结束,若结束则置1,各位相或,得到CTRL信号若有效,则需要切换状态,反之则不用。
f)对于紧急状态信号URGENT和复位信号CLR,则由开关控制,若置1,则有效,立即切换到紧急状态或初始状态S0。
六、详细设计
a)交通灯控制器实体
b)arc中信号
c)分频进程,以计数器形式得出T1,T2,T3,T4四种时间。
d)判断何时切换状态
e)控制黄灯闪烁进程,每0.2s闪烁一次
f)六种状态的表现形式及紧急状态的切换
七、心得体会
这次虽然小学期有两周,但时间仍然是非常紧张。
我由于身体原因在上学期期末申请了缓考,所以在小学期的同时还要准备6门缓考考试,显得非常忙碌,能够分给小学期的时间也不多。
所以在第一天老师布置课题后,我们小组经过讨论,让我选择了简单一些的交通灯控制器。
在最开始的时候,显得无从下手。
虽然我们编写过LED灯显示和各种译码器,但都只是很简单的一个进程,如今要自己设计整个控制器,觉得有点不知所措。
后来用编写C++等程序的经验,我仔细分析题目,将它分解成更小的模块,来分别实现,最后再整合在一起。
状态切换和显示部分的编码还比较简单,但是分频部分又有点不知所云,查阅了网上的例子和书籍后,感觉看不太懂他们的分频方式,询问同学,同学们也还不太清楚。
后来借到第一天老师课上说的参考书,发现上面的分频方式是以计数器的形式,利用外部时钟,来一个上升沿计数器加一,简单容易理解,所以采用了。
每一次编写大作业的时候我都喜欢全部编写完毕后再编译、测试,但是这样就造成错误过多而引起不知道从何下手。
因此我这一次采取的是逐部分编译、测试的方式。
但是由于对VHDL已经一个多学期没有碰过,生疏了很多,语法错误非常多。
而且编译通过后还经常不能运行。
再反复完善代码却不能运行的时候,询问下同学,发现自己的管脚接的大有问题。
是我自己忽略了有特殊指向的管脚,导致我的外部时钟CLK没有输入进去,程序无法继续进行。
并且也发生了没有改代码,但是换了个实验箱就运行不了的情况,检查了很久发现是模式控制没有打到硬布线模式,影响了整体程序的运行,这些都是不通过自己调试、检验无法学习到的。
这两周的时间,我将自己的效率放大到最大,但是仍然因时间问题无法完成交通灯倒计时显示部分,也是小学期的一个遗憾。
不过这两周,我不但又一次加深理解了自己动手操作的重要性,也对于芯片的设计思路有了更好的理解。
由于交通灯控制器是一个简单一些的程序,因此我没有分模块实现,没有用到原理图,也没有遇到芯片的逻辑块溢出的问题,但是在每天的最后,小组讨论时,我们都会讨论解决这些问题,也让我从中学到了很多。
总体来说,这一次的小学期算是收获颇丰。
附件一:
VHDL源代码
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYtrafficLightIS
PORT(
CLR,CLK,URGENT:
INSTD_LOGIC;
GREEN:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
YELLOW:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
RED:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));
--CLOCK:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));
ENDtrafficLight;
ARCHITECTURElightARCOFtrafficLightIS
TYPESTATEIS(S0,S1,S2,S3,S4);
SIGNALcurrentSTATE,nextSTATE:
STATE;
SIGNALCTRL:
STD_LOGIC;
SIGNALSWITCH:
STD_LOGIC_VECTOR(3DOWNTO0);--切换状态
SIGNALTIMER:
STD_LOGIC_VECTOR(3DOWNTO0);--时钟计时
SIGNALT1:
INTEGERRANGE0TO999;--1s
SIGNALT2:
INTEGERRANGE0TO1999;--2s
SIGNALT3:
INTEGERRANGE0TO4999;--5s
SIGNALT4:
INTEGERRANGE0TO199;--0.2s
--SIGNALT5:
INTEGERRANGE0TO999;
BEGIN
PROCESS(CLK,SWITCH)
BEGIN
IF(CLK'eventANDCLK='1')THEN
IF(SWITCH(0)='0')THEN
TIMER(0)<='0';
T1<=0;
ELSEIF(T1=999ANDURGENT='0')THEN
T1<=0;
TIMER(0)<='1';
ELSEIF(URGENT='0')THEN
T1<=T1+1;
TIMER(0)<='0';
ENDIF;
ENDIF;
ENDIF;
IF(SWITCH
(1)='0')THEN
TIMER
(1)<='0';
T2<=0;
ELSEIF(T2=1999ANDURGENT='0')THEN
T2<=0;
TIMER
(1)<='1';
ELSEIF(URGENT='0')THEN
T2<=T2+1;
TIMER
(1)<='0';
ENDIF;
ENDIF;
ENDIF;
IF(SWITCH
(2)='0')THEN
T3<=0;
TIMER
(2)<='0';
ELSEIF(T3=4999ANDURGENT='0')THEN
T3<=0;
TIMER
(2)<='1';
ELSEIF(URGENT='0')THEN
T3<=T3+1;
TIMER
(2)<='0';
ENDIF;
ENDIF;
ENDIF;
ENDIF;
ENDPROCESS;
CTRL<=TIMER(0)ORTIMER
(1)ORTIMER
(2);--倒计时完成切换状态
PROCESS(CLK,SWITCH(3))
BEGIN
IF(CLK'eventANDCLK='1')THEN
IF(T4=199ANDSWITCH(3)='1')THEN
T4<=0;
TIMER(3)<=NOTTIMER(3);
ELSIF(SWITCH(3)='1')THEN
T4<=T4+1;
ENDIF;
ENDIF;
ENDPROCESS;
PROCESS(CTRL,CLR)
BEGIN
IF(CLR='1')THENcurrentSTATE<=s0;
ELSIF(CTRL'eventANDCTRL='0')THENcurrentSTATE<=nextSTATE;
ENDIF;
ENDPROCESS;
PROCESS(currentSTATE,URGENT)
BEGIN
IF(URGENT='1')THEN--紧急状态,所有方向点亮红灯
GREEN<="0000";
YELLOW<="0000";
RED<="1111";
ELSE
CASEcurrentSTATEIS
WHENs0=>SWITCH<="0001";
GREEN<="1111";
YELLOW<="1111";
RED<="1111";
--CLOCK<="0000";
nextSTATE<=s1;
WHENs1=>SWITCH<="0100";
GREEN<="1100";
YELLOW<="0000";
RED<="0011";
--CLOCK<="0110";
nextSTATE<=s2;
WHENs2=>SWITCH<="1010";
GREEN<="0000";
YELLOW(3)<=TIMER(3);--闪烁
YELLOW
(2)<=TIMER(3);
YELLOW(1DOWNTO0)<="00";
nextSTATE<=s3;
WHENs3=>SWITCH<="0100";
GREEN<="0011";
YELLOW<="0000";
RED<="1100";
--CLOCK<="0110";
nextSTATE<=s4;
WHENs4=>SWITCH<="1010";
GREEN<="0000";
YELLOW(3DOWNTO2)<="00";
YELLOW
(1)<=TIMER(3);--闪烁
YELLOW(0)<=TIMER(3);
RED<="1100";
nextSTATE<=s1;
ENDCASE;
ENDIF;
ENDPROCESS;
--PROCESS(CLK,CLOCK)
--BEGIN
--IF(CLK'eventANDCLK='1')THEN
--IF(CLOCK="0000")THENCLOCK<="0110";
--ELSECLOCK<=CLOCK-1;
--ENDIF;
--IF(T5=999)THENT5<=0;
--ELSET5<=T5+1;
--ENDIF;
--ENDIF;
--ENDPROCESS;
ENDlightARC;
附件二:
调试日志
2015/9/8周二:
复习VHDL基础知识及语法,了解交通灯大致编写思路。
2015/9/9周三:
分解交通灯控制器:
分频部分,状态切换部分,显示部分
今日计划:
初步完成分频部分,考虑程序流程和各个进程间的配合。
学习时钟分频的方式:
途径:
去图书馆借书查阅《VHDL数字电路设计与应用实践教程》,采用计数器的方式,针对外部时钟所给的1kHz分成1Hz,从而得到想要的5s、1s、0.2s等时间。
遇到问题:
能够得到时间,但不知道该怎么将时间运用到状态切换中。
解决方案:
上网查阅资料。
2015/9/10周四:
今日计划:
完成状态切换部分和显示部分,考虑如何将分频好的时钟信号用在状态切换部分。
遇到问题:
切换状态部分和显示部分比较简单,只是需要注意if-else语句使用,因为VHDL语法不熟悉导致语法报错很多。
定义的状态太多,重复性大。
解决方案:
开始在状态切换时,没想好要几个状态,零零散散分了很多个,导致很多状态其实根本是重合的,删减后得到最精简的6个状态。
对于分频时钟,引入TIMER数组记录时钟是否计时完毕,若完毕则需要切换状态,将分频部分与其他部分串接在一起。
2015/9/11周五:
今日计划:
完成程序,在TEC-8上进行初步调试。
遇到问题:
忘记如何下载芯片,询问同学后解决。
成功下载芯片后发现不能运行,灯的显示也是乱的。
解决方案:
回头看代码,发现在TIMER信号表示出计时完毕后,并没有给激励进行状态切换,引入CTRL信号给予激励,当CTRL有效时切换状态,为了方便观察CTRL信号的变化,将其连接到灯上。
遇到问题:
下载芯片后仍旧不能继续运行,但CTRL信号有改变。
2015/9/14周一:
今日计划:
完善程序,在TEC-8上运行成功。
遇到问题:
下载芯片后仍旧不能继续运行,但CTRL信号有改变。
解决方案:
能够判断计时结束,能够给激励改变状态,却没有改变状态。
发现没有信号表示红黄绿灯的切换,用S0~S4来判断状态并切换,但发现红黄绿灯有对称,而S2和S4、S1和S3对于计时器来说没有任何区别,不需要重复判断,因此引入SWITCH数组,每一位代表一种灯,使得能够判断计时结束后切换到何种状态,减少重复。
修改编译报错。
2015/9/15周二:
今日计划:
完成程序,并在TEC-8上正确运行。
遇到问题:
下载芯片后仍旧不能运行。
发现管脚配置有问题。
解决方案:
按照老师给的ppt上的管脚配置,CLK接57管脚,CLR、URGENT分别接81,80开关上。
RED,YELLOW,GREEN按顺序接到20到34的红黄绿灯上。
(开始将CLR接到1号管脚上,发现必须一直按着CLR才可以运行程序,后将CLR改接开关上。
)
遇到问题:
在上午运行成功后,下午换了一台电脑,发现下载芯片后程序不动了。
解决方案:
在完全没有改代码的情况下只能检查实验箱是否有误碰情况。
排除灯显示问题后,确定是外部时钟没有走,发现开关置于独立而非硬布线模式,导致程序无法运行。
拨回独立后运行正常。
2015/9/16周三:
完成交通灯控制器,改正红绿灯显示不合理的地方,在考虑加入倒计时模块未果后,接受验收。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字 逻辑 小学 交通灯 控制器
![提示](https://static.bdocx.com/images/bang_tan.gif)