资源描述
可编程逻辑器件和VHDL课程设计
基于VHDL交通灯设计
班 级 : 08级通信(1)班
姓 名 :
学 号 :
指导老师姓名: 杨泽霖
摘要:伴伴随社会发展和人类生活水平提升,汽车数量在不停增加,交通事业得以蓬勃发展,而随之引发安全问题已经不容忽略。EDA技术发展和应用领域也在不停扩大和深入,机械、电子、通信、航空航天、化工、矿产、生物、医学、军事等各个领域关键性日益突出。为了确保十字路口行人和车辆顺利,通畅经过,往往采取电子控制交通信号来进行指挥。利用EDA技术设计交通灯来完成这个需求就显愈加迫切,一样也是很实用和合理。
关键字:VHDL语言、交通灯、QuartusⅡ软件、
正文:
一、系统分析和总体方案
1系统分析
经过分析能够知道,所要设计十字路口交通灯控制电路要能够使南北方向有左转、直行各三个灯(红、黄、绿),东西方向有左转、直行各三个灯(红、黄、绿),三个灯能够按次序依次亮灭。而且要求绿灯亮转黄灯亮然后其它时间为红灯,红灯亮能够直接转绿灯(三种灯循环次序图2.1所表示)。还要求三种灯点亮时间能够以倒计时形式显示出来。能够用VHDL语言合理设计系统功效,使红黄绿灯转换有一个正确时间间隔和转换次序。
绿灯
黄灯
红灯
黄灯
红灯
图2.1三种灯循环次序
2 设计思绪
1 时间脉冲能够直接给予得到。
2 10s、5s、40s、30s定时信号用倒计时,计时起始信号由控制步骤电路给出,每当计满所需时间,即向控制电路输出“时间到”信号,并使计数器清零,由控制电路启、闭三色信号灯。
3 主控电路是关键,这是一个时序电路,其输入信号为东西、南北方向:
10s、5s、40s、30s定时信号,其输出状态控制对应三色灯。
4 三种灯转换状态表:
时间|S
10
5
40
5
10
5
30
5
东西左转
绿
黄
红
红
红
红
红
红
东西直行
红
红
绿
黄
红
红
红
红
南北左转
红
红
红
红
绿
黄
红
红
南北直行
红
红
红
红
红
红
绿
黄
3 设计方案
依据设计要求和系统所含有功效,并参考相关文件资料经行方案设计画出以下所表示十字路口交通灯控制器系统框图,及为设计总体方案,框图以下图2.2所表示:
CLK
交通灯控制及计时模块
扫描显示模块
LED显示
图2.2 系统框图
电路设计
1控制器电路设计
步骤控制器作用是依据计数器计数值控制各方向上发光二极管亮、灭,当计时时间抵达,状态控制器就响应,自动跳转到下一个状态。另外,当检测到特殊情况(urgen =‘1’)发生时,无条件点亮红灯二极管(抢救灯按下urgen ='1',则东西南北全部亮红灯,在这种状态下原来状态必需保持,即东西南北方向定时时间保持不变。抢救灯未按下或按下后恢复,则继续计时(计时经过计数器count),同时恢复东西南北原来灯状态)。具体实物模块图3.1所表示:
图3.1控制器模块
程序实现以下:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY ledcontrol IS
PORT(
reset,clk,urgen : IN STD_LOGIC;
state : OUT STD_LOGIC_VECTOR(2 DOWNTO 0);
sub,set1,set2,set3,set4 : OUT STD_LOGIC);
END ledcontrol;
ARCHITECTURE a OF ledcontrol IS
SIGNAL count : STD_LOGIC_VECTOR(6 DOWNTO 0);
SIGNAL subtemp: STD_LOGIC;
BEGIN
sub<=subtemp AND (NOT clk) ; --将电平型信号变为脉冲型,即高电平时输出一个脉冲
statelabel:
PROCESS (reset,clk)
BEGIN
IF reset='1' THEN --――系统复位
count<="0000000";
state<="000";
set2<='1';set4<='1';
ELSIF clk'event AND clk='1' THEN
IF urgen='0' THEN count<=count+1;subtemp<='1';ELSE subtemp<='0';END IF;--――经过脉冲电平变换后,使得正常状态时,正常减计数,紧急状态下停止计数
IF count=0
then state<="000";set1<='1';set2<='1';set3<='1';set4<='1';
ELSIF count=10 then state<="001";set1<='1';
ELSIF count=15 THEN state<="010";set1<='1';set2<='1';
ELSIF count=55 THEN state<="011";set2<='1';
ELSIF count=60 THEN state<="100";set2<='1';set3<='1';
elsif count=70 THEN state<="101";set3<='1';
elsif count=75 THEN state<="110";set3<='1';set4<='1';
elsif count=105 THEN state<="111";set4<='1';
ELSIF count=110 THEN count<="0000000"; ELSE set1<='0'; set2<='0';set3<='0';set4<='0';END IF;
END IF; -- ――控制步骤
END PROCESS statelabel;
END a;
2输出显示电路设计
依据状态控制器所控制状态和计数器计时时间,选择目前状态下显示器,使显示器输出目前状态下数码管亮、灭指令,其中数码管显示采取动态扫描显示。具体实物模块图:
图3.2译码显示电路模块
程序实现以下:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY ledshow IS
PORT(clk,urgen : IN STD_LOGIC;
state : IN STD_LOGIC_VECTOR(2 DOWNTO 0);
sub,set1,set2,set3,set4 : IN STD_LOGIC;
eg1,ey1,er1,edg2,edy2,edr2,ng1,ny1,nr1,ndg2,ndy2,ndr2 : OUT STD_LOGIC;
led1,led2 : OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
END ledshow;
ARCHITECTURE a OF ledshow IS
SIGNAL count1,count2,count3,count4 : STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL setstate1,setstate2,setstate3,setstate4 : STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL etg1,ety1,etr1,edirr1,edirg1,ediry1,norg2,nory2,norr2,nordirg2,nordiry2,nordirr2 : STD_LOGIC;
BEGIN
led1<="00000000" WHEN urgen='1' AND clk='0' ELSE --显示东西向行和停
count1 WHEN state="000" ELSE
count1 WHEN state="001" ELSE
count2 WHEN state="010" ELSE
count2 WHEN state="011" ELSE
count2;
led2<="00000000" WHEN urgen='1' AND clk='0' ELSE
count3 WHEN state="000" ELSE
count3 WHEN state="001" ELSE
count3 WHEN state="010" ELSE
count3 WHEN state="011" ELSE
count3 WHEN state="100" ELSE
count3 WHEN state="101" ELSE
count4 WHEN state="110" ELSE
count4;
etg1<='1' WHEN state="000" AND urgen='0' ELSE '0';
ety1<='1' WHEN state="001" AND urgen='0' ELSE '0';
etr1<='1' WHEN state="010" or urgen='1' OR state="011" OR state="100" OR state="101" OR state="110" OR state="111" ELSE '0';
edirg1<='1' WHEN state="010" and urgen='0' ELSE '0';
ediry1<='1' WHEN state="011" and urgen='0' ELSE '0';
edirr1<='1' WHEN state="000" OR urgen='1' OR state="001" OR state="100" OR state="101" OR state="110" OR state="111" ELSE '0';
norg2<='1' WHEN state="100" AND urgen='0' ELSE '0';
nory2<='1' WHEN state="101" and urgen='0' ELSE '0';
norr2<='1' WHEN state="000" OR state="001" OR state="010" OR state="011" OR state="110" OR state="111" OR urgen='1' ELSE '0';
nordirg2<='1' WHEN state="110" AND urgen='0' ELSE '0';
nordiry2<='1' WHEN state="111" and urgen='0' ELSE '0';
nordirr2<='1' WHEN state="000" OR state="001" OR state="010" OR state="011" OR state="100" OR urgen='1' OR state="101" ELSE '0';
setstate1<= "00010000" WHEN state="000" ELSE
"00000101" WHEN state="001" ELSE
"10010101" ;
setstate2<= "00010101" WHEN state="000" ELSE
--"00000101" WHEN state="001" ELSE
"01000000" WHEN state="010" ELSE
"00000101" WHEN state="011" ELSE
"01010000" ;
setstate3<= "01100000" WHEN state="000" ELSE
"00010000" WHEN state="100" ELSE
"00000101" WHEN state="101" ELSE
"00110101" ;
setstate4<= "01110101" WHEN state="000" ELSE
"00110000" WHEN state="110" ELSE
"00000101" ;
label4: ----南北直行
PROCESS (sub)
BEGIN
IF sub'event AND sub='1' THEN
IF set4='1' THEN
count4<=setstate4;
elsif count4(3 downto 0)="0000" then count4<=count4-7;
ELSE count4<=count4-1;
END IF;
ndy2<=nordiry2;
ndg2<=nordirg2; ndr2<=nordirr2;
END IF;
END PROCESS label4;
label3: ----南北左行
PROCESS (sub)
BEGIN
IF sub'event AND sub='1' THEN
IF set3='1' THEN
count3<=setstate3;
elsif count3(3 downto 0)="0000" then count3<=count3-7;
ELSE count3<=count3-1;
END IF;
ng1<=norg2;
ny1<=nory2;
nr1<=norr2;
END IF;
END PROCESS label3;
label2: ---东西直行
PROCESS (sub)
BEGIN
IF sub'event AND sub='1' THEN
IF set2='1' THEN
count2<=setstate2;
elsif count2(3 downto 0)="0000" then count2<=count2-7;
ELSE count2<=count2-1; END IF;
edg2<=edirg1;
edy2<=ediry1;
edr2<=edirr1;
END IF;
END PROCESS label2;
label1: --东西左行
PROCESS (sub)
BEGIN
IF sub'event AND sub='1' THEN
IF set1='1' THEN
count1<=setstate1;
elsif count1(3 downto 0)="0000" then count1<=count1-7;
ELSE count1<=count1-1;
END IF;
eg1<=etg1;
er1<=etr1;
ey1<=ety1;
END IF;
END PROCESS label1;
END a;
程序仿真和分析
1 仿真结果
利用Quartus II软件对本程序进行编译,生成了能够进行仿真定时分析和下载到可编程器件相关文件。仿真结果图5.1所表示:
图5.1 仿真结果
2 仿真结果分析
经过设定clk值和reset和urgen初值,就能够得到如上所表示仿真波形图。由仿真波形图能够看出波形是由reset初值信号触发而显示出各个状态。Urgen高电平信号输入时,全部交通灯全部变为红灯状态。由仿真波形图还能够清楚看出各时间段每个交通灯状态。
要得到正确仿真波形图就不许设定适宜时间信号clk值。假如clk值设置太小则交通灯状态改变得太快无法分辨,假如clk值设置得太大则交通灯状态转换缓慢,效果不显著。其次,要设定reset初值,假如没有设定reset初值就不可能触发而得到仿真图。最终,就是要设置一Urgen高电平信号来检测紧急情况下交通灯状态。
心得体会
经过此次课程设计,使我对EDA程序设计有了深入学习,深入认识;在程序设计,程序调试方面全部学到了很多东西,这是第一次编写EDA大程序,很有成就感。在这几天课设时间里,试验室气氛对我们影响很大,大家一起努力,这也是我们能完成课设动力。在编程中出现问题时,一定要戒骄戒躁,脚扎实地,认真看书,仔细分析,仔细调试,就一定会发觉错误,克服困难,我们也是这么做,这在课设中十分关键。从这次课程设计中,我真真正正意识到,在以后学习中,要理论联络实际,把我们所学理论知识用到实际当中,学习EDA更是如此,程序只有在常常写和读过程中才能提升,加深了我对Quartus II软件应用熟悉了此软件具体操作,这就是我在这次课程设计中最大收获。
生活就是这么,汗水预示着结果也见证着收获。劳动是人类生存生活永恒不变话题。即使我这次做课程设计不是很复杂,但在设计和仿真过程中,碰到了不少困难,回首整个过程,却受益匪浅。
对我而言,知识上收获关键,精神上丰收愈加可喜。让我知道了学无止境道理。我们每一个人永远不能满足于现有成就,人生就像在爬山,一座山峰后面还有更高山峰在等着你。挫折是一份财富,经历是一份拥有。这次课程设计必将成为我人生旅途上一个很美好回想!
参考文件
[1] 阎石 主编,《数字电子技术基础》,高等教育出版社,1998
[2] 谭会生等主编,《EDA技术及应用》,西安电子科技大学出版社,
[3] 廖裕评等主编,《CPLD数字电路设计——使用MAX+plusⅡ入门篇》,清华大学出版社,
[4] 冯涛等主编,《可编程逻辑器件开发技术:MAX+plusⅡ入门和提升》,人民邮电出版社,
[5] 杨崇志,《特殊新型电子元件手册》,辽宁科学技术出版社,1999
[6] 彭介华,《电子技术课程设计指导》高等教育出版社.出版.
[7] Mark Zwolinski, Digital System Design with VHDL, 电子工业出版社,
[8] Alan B. Marcovitz Introduction to logic Design, 电子工业出版社,
展开阅读全文