交通信号控制器的VHDL的设计说明.docx
《交通信号控制器的VHDL的设计说明.docx》由会员分享,可在线阅读,更多相关《交通信号控制器的VHDL的设计说明.docx(14页珍藏版)》请在冰点文库上搜索。
交通信号控制器的VHDL的设计说明
EDA课程设计报告
交通信号控制器的VHDL设计
班级:
2009级通信工程一班
姓名:
陈洁
学号:
2009550606
指导老师:
刘奇能
交通信号控制器的VHDL的设计
一、设计任务
模拟十字路口交通信号灯的工作过程,利用实验板上的两组红、黄、绿LED作为交通信号灯,设计一个交通信号灯控制器。
能达到的要求:
(1)交通灯从绿变红时,有4秒黄灯亮的间隔时间;
(2)交通灯红变绿是直接进行的,没有间隔时间;
(3)主干道上的绿灯时间为40秒,支干道的绿灯时间为20秒;
(4)在任意时间,显示每个状态到该状态结束所需的时间。
支干道
主干道
图1路口交通管理示意图
A
B
C
D
主干道交通灯
绿(40秒)
黄(4秒)
红(20秒)
红(4秒)
支干道交通灯
红
红
绿
黄
表1交通信号灯的4种状态
二、设计原理
1、设计目的:
学习DEA开发软件和Quartus
的使用方法,熟悉可编程逻辑器件的使用。
通过制作来了解交通灯控制系统,交通灯控制系统主要是实现城市十字交叉路口红绿灯的控制
2、设计说明
(1)第一模块:
clk时钟秒脉冲发生电路
在红绿灯交通信号系统中,大多数情况是通过自动控制的方式指挥交通的。
因此为了避免意外事件的发生,电路必须给一个稳定的时钟(clock)才能让系统正常运作。
模块说明:
系统输入信号:
Clk:
由外接信号发生器提供256的时钟信号;
系统输出信号:
full:
产生每秒一个脉冲的信号;
(2)第二模块:
计数秒数选择电路
计数电路最主要的功能就是记数负责显示倒数的计数值,对下一个模块提供状态转换信号。
模块说明:
系统输入:
full:
接收由clk电路的提供的1hz的时钟脉冲信号;
系统输出信号:
tai:
产生显示电路状态转换信号
gw:
倒计数值秒数个位变化控制信号
sw:
倒计数值秒数十位变化控制信号
sgw:
次倒计数值秒数个位变化控制信号;
ssw:
次倒计数值秒数十位变化控制信号;
(3)第三模块:
红绿灯状态转换电路
本电路负责红绿灯的转换。
模块说明:
系统输入信号:
full:
接收由clk电路的提供的1hz的时钟脉冲信号;
tai:
接收计数秒数选择电路状态转换信号;
系统输出信号:
zhuangtai:
负责红绿灯的状态显示。
(4)第四模块:
时间显示电路
本电路负责红绿灯的计数时间的显示。
模块说明:
系统输入信号:
gw:
倒计数值秒数个位变化控制信号;
sw:
倒计数值秒数十位变化控制信号;
sgw:
次倒计数值秒数个位变化控制信号;
ssw:
次倒计数值秒数十位变化控制信号;
系统输出信号:
led7gw:
负责主红绿灯的显示秒数个位。
led7sw:
负责主红绿灯的显示秒数十位。
sled7gw:
负责支干红绿灯的显示秒数个位。
sled7sw:
负责支干红绿灯的显示秒数十位。
三、设计方案
时间显示数据输出
红黄绿灯信号输出
图2交通信号灯控制器的原理框图
采用VHDL语言输入的方式实现交通信号灯控制器
CLK
时间显示数据输出
信号灯输出
图3交通信号灯控制器程序原理框图
该程序由7个进程组成,进程P1和P2将CLK信号分频后产生1秒信号,进程P3、P4、P5构成两个带有预置数功能的十进制计数器,其中P4产生允许十位计数器计数的控制信号。
进程P6实现状态转换和产生状态转换的控制信号,进程P7产生次态信号和信号灯输出信号,以及每一个状态的时间值。
四、VHDL程序:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYchenjieIS
PORT(clk:
instd_logic;
led7gw:
outstd_logic_vector(6downto0);
led7sw:
outstd_logic_vector(6downto0);
sled7gw:
outstd_logic_vector(6downto0);
sled7sw:
outstd_logic_vector(6downto0);
zhuangtai:
outstd_logic_vector(5downto0));
END;
ARCHITECTUREoneOFchenjieIS
TYPEtaiIS(s0,s1,s2,s3);
SIgnalxiantai,citai:
tai;
SIGNALgw:
STD_LOGIC_VECTOR(6DOWNTO0);
SIGNALsw:
STD_LOGIC_VECTOR(1DOWNTO0);
SIGNALsgw:
STD_LOGIC_VECTOR(6DOWNTO0);
SIGNALssw:
STD_LOGIC_VECTOR(2DOWNTO0);
SIGNALtm:
STD_LOGIC_VECTOR(6DOWNTO0);
SIGNALts:
STD_LOGIC_VECTOR(6DOWNTO0);
SIGNALTIME:
STD_LOGIC_VECTOR(6DOWNTO0);
BEGIN
PROCESS(clk)
BEGIN
IFclk'EVENTANDclk='1'THEN
IFTIME<"1000011"THEN
TIME<=TIME+1;
ELSeTIME<="0000000";
ENDIF;
ENDIF;
ENDPROCESS;
REG:
process(clk,xiantai)
BEGIN
IFclk='1'ANDclk'EVENTTHEN
xiantai<=citai;
ENDIF;
ENDprocess;
COM:
process(xiantai,time)
begin
casexiantaiis
whens0=>zhuangtai<="001100";tm<=39-time;ts<=43-time;
iftime=39thencitai<=s1;
elsecitai<=s0;
endif;
whens1=>zhuangtai<="010100";tm<=43-time;ts<=43-time;
iftime=43thencitai<=s2;
elsecitai<=s1;
endif;
whens2=>zhuangtai<="100010";tm<=67-time;ts<=63-time;
iftime=63thencitai<=s3;
elsecitai<=s2;
endif;
whens3=>zhuangtai<="100001";tm<=67-time;ts<=67-time;
iftime=67thencitai<=s0;
elsecitai<=s3;
endif;
endcase;
endprocess;
PROCESS(tm)
BEGIN
IFtm>=30THENsw<="11";gw<=tm-30;
ELSIFtm>=20THENsw<="10";gw<=tm-20;
ELSIFtm>=10THENsw<="01";gw<=tm-10;
ELSEsw<="00";gw<=tm;
ENDIF;
ENDPROCESS;
PROCESS(ts)
BEGIN
IFts>=40THENssw<="100";sgw<=ts-40;
ELSIFts>=30THENssw<="011";sgw<=ts-30;
ELSIFts>=20THENssw<="010";sgw<=ts-20;
ELSIFts>=10THENssw<="001";sgw<=ts-10;
ELSEssw<="000";sgw<=ts;
ENDIF;
ENDPROCESS;
process(sw,gw)
begin
caseswis
when"00"=>led7sw<="0111111";
when"01"=>led7sw<="0000110";
when"10"=>led7sw<="1011011";
when"11"=>led7sw<="1001111";
whenothers=>null;
endcase;
casegwis
when"0000000"=>led7gw<="0111111";
when"0000001"=>led7gw<="0000110";
when"0000010"=>led7gw<="1011011";
when"0000011"=>led7gw<="1001111";
when"0000100"=>led7gw<="1100110";
when"0000101"=>led7gw<="1101101";
when"0000110"=>led7gw<="1111101";
when"0000111"=>led7gw<="0000111";
when"0001000"=>led7gw<="1111111";
when"0001001"=>led7gw<="1101111";
whenothers=>null;
endcase;
endprocess;
process(ssw,sgw)
begin
casesswis
when"000"=>sled7sw<="0111111";
when"001"=>sled7sw<="0000110";
when"010"=>sled7sw<="1011011";
when"011"=>sled7sw<="1001111";
when"100"=>sled7sw<="1001111";
whenothers=>null;
endcase;
casesgwis
when"0000000"=>sled7gw<="0111111";
when"0000001"=>sled7gw<="0000110";
when"0000010"=>sled7gw<="1011011";
when"0000011"=>sled7gw<="1001111";
when"0000100"=>sled7gw<="1100110";
when"0000101"=>sled7gw<="1101101";
when"0000110"=>sled7gw<="1111101";
when"0000111"=>sled7gw<="0000111";
when"0001000"=>sled7gw<="1111111";
when"0001001"=>sled7gw<="1101111";
whenothers=>null;
endcase;
endprocess;
end;
五、仿真结果(如下图)
未修改的程序
程序修改后图A
B
C
D
E
六引脚设置
选择的引脚锁定方法如下图所示。
将未使用的管脚设置为三态输入
七、实验心得体会
通过这次课程设计,我进一步加深了对电子设计自动化的了解。
并进一步熟练了对QuartusII软件的操作。
在编写程序的过程中,遇到了很多问题,使我发现自己以前学习上存在的不足。
通过与同学探讨,终于把问题都解决了,并加深了对交通灯原理和设计思路的了解。
同时也掌握了做课程设计的一般流程,为以后的设计积累了一定的经验。
做课程设计时,先查阅相关知识,把原理吃透,确定一个大的设计方向,在按照这个方向分模块的把要实现的功能用流程图的形式展示。
最后参照每个模块把输入和输出引脚设定,运用我们所学的VHDL语言进行编程。
总之,通过这次的设计,进一步了解了EDA技术,收获很大,对软件编程、排错调试、相关仪器设备的使用技能等方面得到较全面的锻炼和提高。
课程设计不仅是对前面所学知识的一种检验,而且也是对自己能力的一种提高。
在前几次的模电、数电、单片机课程设计中,我就有了相当丰富的收获和体会,所以对于这次EDA的课程设计我也是相当重视。
下面我对整个毕业设计的过程做一下简单的心得:
在接到题目后要进行的是选题工作,在本次设计可选的4个题目中,我经过反复比较,结合自己的兴趣、对知识掌握的侧重方面、以及感觉设计的实用性,选择了这次设计的交通灯设计。
开始我在网上查到了部分资料,于是参照资料,得到了一个简单易懂的实验程序。
在程序测试通过后,就进入了实验室进行与实验箱的连接,本次试验与以往不容的是不需要焊接电路板,所以工作量少了很多,由于已经有很久没有接触过实验箱了,所以再次对实验箱各种模式接口进行了研究,在研究过程中,发现曾经在做EDA实验时很多没有弄懂的地方都清晰了,理解了各种接口的对应关系,以及改变接口会得到怎样不同的效果。
下载程序到实验箱后,结果顺利,系统正常运行,得到了理想的效果,各对应灯和秒数都能正确现实。
但老师检查后,说这个程序写得不好。
于是我在接下来的时间里,重新省察了这篇程序。
我发现了这个程序有一个重大的错误。
根本没有实现所谓的主干道和支干道亮灯规律,于是,我参照旧实验程序,在自己的理解下,重新写了实验程序,在写程序的过程中,我拿起书本,复习了曾经学习过的知识。
在写实验程序的过程中,我觉得自己提高很多,能够分析程序实现需要的模块,一步一步的学习,一步一步的完善自己写的程序,等到在软件上运行,又改出了许多错误,这才是真正的学习啊,我体会到。
平时学习觉得很难领悟,现在可以在解决问题的过程中清晰的知道各个进程实现的功能。
还要做到心思缜密,不容出错。
在波形仿真的过程中,我仔细比对各个状态跳变是否和程序一致,这也检测出了几个错误,比如程序中数码管显示程序错误,导致波形不正常。
通过本次设计实验,我收获颇多,不仅仅是对专业知识有了又一次的回顾和温习,动手能力得到提高,更重要的是学会了怎样去发现问题和处理问题,怎样在挫折中使自己冷静思考,既要从根本和基础去查找,也要敢于怀疑是仪器出了问题。
在实验中,很多以前对VHDL语言不懂的地方都得到了清晰,特别是对实验箱模式和接口得到了彻底理解。
很感激老师的严格要求,提醒我重新学习写出程序,运行出正确的结果,让我知道了探索学习,精益求精。
通过这次课程设计,我感受到了通过知识设计和制造成果的兴奋,在不断的失败和改进中,感受到了对科学研究所需的不懈毅力和得到结果成就感。