资源描述
目 录
1.设计原理 1
1.1设计任务 1
1.2方案构思 1
1.2.1该交通灯控制器应具备的功能 1
1.2.2实现方案 1
2.程序设计 3
3. 编译/仿真 4
3.1编译过程 4
3.1.1 建立顶层设计文件夹TRAFFIC_CTROL 4
3.1.2 TRAFFIC_CTROL.VHD模块设计 4
3.1.3 TRAFFIC_CTROL.SCf波形文件设计 5
3.2仿真结果 5
4.心得体会 6
参考文献 7
附录A VHDL源程序代码 8
附录B 仿真时序波形图 10
交通灯控制器设计
1.设计原理
1.1设计任务
设计一个十字路口的交通灯控制系统,用实验平台上的LED发光二极管显示车辆通过的方向(东西和南北各一组),用数码管显示该方向的剩余时间。
1.2方案构思
1.2.1该交通灯控制器应具备的功能
设东西和南北方向的车流量大致相同,因此红、黄、绿灯的时长也相同,定为红灯35sec,黄灯5sec,绿灯30sec,同时用数码管指示当前状态(红、黄、绿)剩余时间。另外,设计一个紧急状态,当紧急状态出现时,两个方向都禁止通行,指示红灯。紧急状态解除后,重新计数并指示时间。
1.2.2实现方案
交通灯控制器是状态机的一个典型应用,除了计数器是状态机外,还有东西、南北方向的不同状态组合(红绿、红黄、绿红、黄红4个状态),如表1.1所示。
表1.1 交通灯的4种可能亮灯状态
状 态
东 西 方 向
南 北 方 向
红
黄
绿
红
黄
绿
1
1
0
0
0
0
1
2
1
0
0
0
1
0
3
0
0
1
1
0
0
4
0
1
0
1
0
00
我们可以简单的将其看成两个(东西、南北)减1计数器,通过检测两个方向的计数值,可以检测红、黄、绿灯组合的跳变。这样使一个较复杂的状态机设计变成一个较简单的计数器设计。
本例假设东西方向和南北方向的黄灯时间均为5sec,在设计交通灯控制器时,可在简单计数器的基础上增加一些状态检测,即可通过检测两个方向的计数值判断交通灯应处于4种状态中的哪个状态。
本交通灯控制器外部接口如图1.1所示。在表1.2中列出了需检测的状态跳变点,从中可以看出,有两种情况出现了东西和南北方向计数值均为1的情况,因此在检查跳变点时还应同时判断当前是处于状态2还是状态4,这样就可以决定次状态是状态3还是状态1。对于紧急状态,只需设计一个异步时序电路即可解决。
图1.1交通灯控制器方框图
表1.2 交通灯设计设计中的状态跳变点
交通灯
现状态
计数器计数值
交通灯
次状态
计数器计数值
东西方向
计数值
南北方向
计数值
东西方向
计数值
南北方向
计数值
1
6
1
2
5
5
2
1
1
3
30
35
3
1
6
4
5
5
4
1
1
1
35
30
程序中还应防止出现非法状态,即程序运行后应判断东西方向和南北方向的计数值是否超出范围。此电路仅在电路启动运行时有效,因为一旦两个方向的计数值正确后,就可能再计数到非法状态。
2.程序设计
该交通灯控制器的源程序TRAFFIC_CTROL.VHD
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY TRAFFIC_CTROL IS
PORT(clk,urgency: IN STD_LOGIC;
led: BUFFER STD_LOGIC_VECTOR(7 DOWNTO 0);
East_West,South_North:BUFFER STD_LOGIC_VECTOR(7 DOWNTO 0));
END TRAFFIC_CTROL;
ARCHITECTURE A OF TRAFFIC_CTROL IS
BEGIN
PROCESS(clk,urgency)
BEGIN
IF urgency='0' THEN
led<="10000001";
East_West<="00000000";
South_North<="00000000";
ELSIF clk'event AND clk='1' THEN
IF East_West>"00110110" OR South_North>"00110110"THEN
East_West<="00110101";
South_North<="00110000";
led<="10000100";
ELSIF East_West="00000110"AND South_North="00000001" THEN
East_West<="00000101";
South_North<="00000101";
led<="10000010";
ELSIF East_West="00000001"AND South_North="00000001" AND led="10000010" THEN
East_West<="00110000";
South_North<="00110101";
led<="00100001";
ELSIF East_West="00000001"AND South_North="00000110" THEN
East_West<="00000101";
South_North<="00000101";
led<="01000001";
ELSIF East_West="00000001"AND South_North="00000001" AND led="01000001" THEN
East_West<="00110101";
South_North<="00110000";
led<="10000100";
ELSIF East_West(3 DOWNTO 0)=0 THEN
East_West<=East_West-7;
South_North<=South_North-1;
ELSIF South_North(3 DOWNTO 0)=0 THEN
East_West<=East_West-1;
South_North<=South_North-7;
ELSE
East_West<=East_West-1;
South_North<=South_North-1;
END IF;
END IF;
END PROCESS;
END A;
3. 编译/仿真
3.1编译过程
3.1.1 建立顶层设计文件夹TRAFFIC_CTROL
在硬盘适当位置建立TRAFFIC_CTROL文件夹。注意:该文件夹的路径中不能包含汉字。路径中的所有目录和子目录的名称都必须符合VHDL语言的语法规则。
3.1.2 TRAFFIC_CTROL.VHD模块设计
新建一个.VHD格式文件,输入TRAFFIC_CTROL.VHD源程序后保存在顶层设计文件夹中,并进行语法查错、编译。
3.1.3 TRAFFIC_CTROL.SCf波形文件设计
新建一个.SCF格式文件,输入时钟及紧急状态波形后保存文件,此后即可仿真。
3.2仿真结果
仿真结果如图3.1所示。图中LED[7..0]以自然二进制表示,EAST_WEST[7..4]、EAST_WEST[3..0]、SOUTH_NORTH[7..4]、SOUTH_NORTH[3..0]为十进制表示。
图3.1 交通灯控制器功能与时序仿真结果
4.心得体会
EDA课程设计就要结束了,这次课程设计历时近一个星期,通过这一个星期的学习,发现了自己的很多不足,发现了很多知识上的漏洞。同时也看到了自己的实践经验还是比较缺乏,理论联系实际的能力还急需提高。这次课程设计让我学到了很多,不仅是巩固了先前学的EDA技术的理论知识,而且也培养了我的动手能力,更令我的创造性思维得到拓展。在课程设计中一个人的力量是远远不够的,真正的完成任务需要共同的智慧与劳动,团结协作是我们成功的一项非常重要的保证。在这个过程中,我也曾经因为实践经验的缺乏失落过,也曾经仿真成功而热情高涨。
还有一点是我们做任何事情都无法缺少的,那就是细心认真。此次设计我们就深深地体会到了,由于编程的时候没有做到足够的细心,导致一串代码弄混了。但是密密麻麻的英文字母混在一起,我始终没有发现。最终在调试的时候,就出现了问题。只知道出现了问题,就是不知道到问题的根源在哪里,好长时间都没有找出问题的所在。这也让我真正的明白了,科学的严谨性,它不允许出半点差错,否则后果会是比较麻烦的。做其他事情也一样,都需要我们付出足够的认真去对待,才能顺利的完成。
生活就是这样,汗水预示着结果也见证着收获。劳动是人类生存生活永恒不变的话题。虽然我这次做的课程设计不是非常的复杂,但在设计和仿真的过程中,我们也遇到了不少的困难,回首整个过程,却受益匪浅。
对我而言,知识上的收获重要,精神上的丰收更加可喜。让我知道了学无止境的道理。我们每一个人永远不能满足于现有的成就,人生就像在爬山,一座山峰的后面还有更高的山峰在等着你。挫折是一份财富,经历是一份拥有。这次课程设计必将成为我人生旅途上一个非常美好的回忆!
参考文献
[1] 阎石 主编,《数字电子技术基础》,高等教育出版社,1998
[2] 谭会生 主编,《EDA技术及应用》,西安电子科技大学出版社,2001
[3] 廖裕评 主编,《CPLD数字电路设计——使用MAX+plusⅡ入门篇》,清华大学出版,2001
[4] 冯涛 主编,《可编程逻辑器件开发技术:MAX+plusⅡ入门与提高》,人民邮电出版社,2002
[5] 杨崇志,《特殊新型电子元件手册》,辽宁科学技术出版社,1999
[6] 彭介华,《电子技术课程设计指导》高等教育出版社.2000年出版.
[7] Mark Zwolinski, Digital System Design with VHDL, 电子工业出版社,2002
[8] Alan B. Marcovitz Introduction to logic Design, 电子工业出版社,2002
附录A VHDL源程序代码
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY TRAFFIC_CTROL IS
PORT(clk,urgency: IN STD_LOGIC;
led: BUFFER STD_LOGIC_VECTOR(7 DOWNTO 0);
East_West,South_North:BUFFER STD_LOGIC_VECTOR(7 DOWNTO 0));
END TRAFFIC_CTROL;
ARCHITECTURE A OF TRAFFIC_CTROL IS
BEGIN
PROCESS(clk,urgency)
BEGIN
IF urgency='0' THEN
led<="10000001";
East_West<="00000000";
South_North<="00000000";
ELSIF clk'event AND clk='1' THEN
IF East_West>"00110110" OR South_North>"00110110"THEN
East_West<="00110101";
South_North<="00110000";
led<="10000100";
ELSIF East_West="00000110"AND South_North="00000001" THEN
East_West<="00000101";
South_North<="00000101";
led<="10000010";
ELSIF East_West="00000001"AND South_North="00000001" AND led="10000010" THEN
East_West<="00110000";
South_North<="00110101";
led<="00100001";
ELSIF East_West="00000001"AND South_North="00000110" THEN
East_West<="00000101";
South_North<="00000101";
led<="01000001";
ELSIF East_West="00000001"AND South_North="00000001" AND led="01000001" THEN
East_West<="00110101";
South_North<="00110000";
led<="10000100";
ELSIF East_West(3 DOWNTO 0)=0 THEN
East_West<=East_West-7;
South_North<=South_North-1;
ELSIF South_North(3 DOWNTO 0)=0 THEN
East_West<=East_West-1;
South_North<=South_North-7;
ELSE
East_West<=East_West-1;
South_North<=South_North-1;
END IF;
END IF;
END PROCESS;
END A;
附录B 仿真时序波形图
展开阅读全文