北邮数字逻辑小学期交通灯控制器_北邮数字逻辑期末

2020-02-28 其他范文 下载本文

北邮数字逻辑小学期交通灯控制器由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“北邮数字逻辑期末”。

实验一交通灯控制器

一、实验目的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中选择:TYPE STATE IS(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源代码 LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY trafficLight IS

PORT(CLR, CLK, URGENT : IN STD_LOGIC;GREEN : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);YELLOW : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);RED : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));

--CLOCK : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END trafficLight;ARCHITECTURE lightARC OF trafficLight IS TYPE STATE IS(S0, S1, S2, S3, S4);SIGNAL currentSTATE, nextSTATE : STATE;SIGNAL CTRL : STD_LOGIC;SIGNAL SWITCH : STD_LOGIC_VECTOR(3 DOWNTO 0);

--切换状态

SIGNAL TIMER : STD_LOGIC_VECTOR(3 DOWNTO 0);

--时钟计时 SIGNAL T1 : INTEGER RANGE 0 TO 999;

--1s SIGNAL T2 : INTEGER RANGE 0 TO 1999;

--2s SIGNAL T3 : INTEGER RANGE 0 TO 4999;

--5s SIGNAL T4 : INTEGER RANGE 0 TO 199;

--0.2s

--SIGNAL T5 : INTEGER RANGE 0 TO 999;

BEGIN PROCESS(CLK, SWITCH)

BEGIN

IF(CLK'event AND CLK = '1')THEN

IF(SWITCH(0)= '0')THEN TIMER(0)

T1

ELSE IF(T1 = 999 AND URGENT = '0')THEN

T1

TIMER(0)

ELSE IF(URGENT = '0')THEN

T1

END IF;END IF;END IF;

IF(SWITCH(1)= '0')THEN TIMER(1)

T2

ELSE IF(T2 = 1999 AND URGENT = '0')THEN

T2

TIMER(1)

ELSE IF(URGENT = '0')THEN

T2

TIMER(1)

END IF;

END IF;

END IF;

IF(SWITCH(2)= '0')THEN

T3

ELSE IF(T3 = 4999 AND URGENT = '0')THEN

T3

ELSE IF(URGENT = '0')THEN

T3

TIMER(2)

END IF;

END IF;

END IF;

END IF;END PROCESS;

CTRL

PROCESS(CLK, SWITCH(3))

BEGIN

IF(CLK'event AND CLK = '1')THEN

IF(T4 = 199 AND SWITCH(3)= '1')THEN

T4

TIMER(3)

ELSIF(SWITCH(3)= '1')THEN

T4

END IF;

END IF;

END PROCESS;

PROCESS(CTRL, CLR)

BEGIN

--倒计时完成IF(CLR = '1')THEN currentSTATE

ELSIF(CTRL'event AND CTRL = '0')THEN currentSTATE

END IF;

END PROCESS;

PROCESS(currentSTATE, URGENT)

BEGIN

IF(URGENT = '1')THEN

--紧急状态,所有方向点亮红灯

GREEN

ELSE

CASE currentSTATE IS

WHEN s0 => SWITCH

GREEN

YELLOW

RED

--CLOCK

WHEN s1 => SWITCH

GREEN

YELLOW

RED

--CLOCK SWITCH

GREEN

YELLOW(3)SWITCH

GREEN

YELLOW

RED

--CLOCK

WHEN s4 => SWITCH

GREEN

YELLOW(3 DOWNTO 2)

YELLOW(1)

RED

END CASE;

END IF;

END PROCESS;

--

PROCESS(CLK, CLOCK)

--

BEGIN----------IF(CLK'event AND CLK = '1')THEN

IF(CLOCK = “0000”)THEN CLOCK

ELSE T5

END IF;--

END IF;

--

END PROCESS;END lightARC;

附件二:调试日志 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周三:

完成交通灯控制器,改正红绿灯显示不合理的地方,在考虑加入倒计时模块未果后,接受验收。

《北邮数字逻辑小学期交通灯控制器.docx》
将本文的Word文档下载,方便收藏和打印
推荐度:
北邮数字逻辑小学期交通灯控制器
点击下载文档
相关专题 北邮数字逻辑期末 交通灯 控制器 逻辑 北邮数字逻辑期末 交通灯 控制器 逻辑
[其他范文]相关推荐
    [其他范文]热门文章
      下载全文