娜娜eda交通灯.docx
- 文档编号:9192844
- 上传时间:2023-05-17
- 格式:DOCX
- 页数:14
- 大小:105.77KB
娜娜eda交通灯.docx
《娜娜eda交通灯.docx》由会员分享,可在线阅读,更多相关《娜娜eda交通灯.docx(14页珍藏版)》请在冰点文库上搜索。
娜娜eda交通灯
前言
伴随着社会的发展以及人类生活水平的提高,汽车的数量在增加的EDA技术的发展和应用领域的扩大与深入,EDA技术在电子信息,通信,自动,控制及计算机应用等领域的重要性日益突出。
随着技术市场与人才市场对EDA的不断的增加交通的问题日益突出,单单依靠人力来指挥交通已经不可行了,所以,设计交通灯来完成这个需求就显的越加迫切了.为了确保十字路口的行人和车辆顺利、畅通地通过,往往采用电子控制的交通信号来进行指挥。
以下就是运用数字电子设计出的交通灯:
其中红灯亮,表示该条路禁止通行;黄灯亮表示停车;绿灯亮表示允许通行。
1.1设计的目的
本次课程设计的目的是通过设计交通灯控制器,了解EDA技术,了解并掌握VHDL硬件描述语言的设计方法和思想,巩固和综合运用所学过的计算机组成原理知识,提高分析、解决计算机技术实际问题的独立工作能力。
1.2设计的基本内容
交通灯的显示有很多方式,如十字路口、丁字路口等,而对于同一个路口又有很多不同的显示要求,比如十字路口,车辆如果只要东西和南北方向通行就很简单,而如果车子可以左右转弯的通行就比较复杂,本实验仅针对最简单的南北和东西直行的情况。
这次课程设计的题目是交通灯控制器的设计。
设计了主干道的交叉路口交通信号灯无人自动管理的控制系统。
将路口红绿灯的各种亮灯情况定义不同的状态,路口状况定义为触发条件,组成有限状态机。
基于此模型的交通信号灯控制系统可充分利用现有交通资源,缓解城市交通压力。
要完成本实验,首先必须了解交通路灯的燃灭规律。
本实验需要用到实验箱上交通灯模块中的发光二极管,即红、黄、绿各三个。
依人们的交通常规,“红灯停,绿灯行,黄灯提醒”。
其交通灯的燃灭规律为:
初始态是两个路口的红灯全亮,之后,东西路口的绿灯亮,南北路口的红灯亮,东西方向通车,延时一段时间后,东西路口绿灯灭,黄灯开始闪烁。
闪烁若干次后,东西路口红灯亮,而同时南北路口的绿灯亮,南北方向开始通车,延时一段时间后,南北路口的绿灯灭,黄灯开始闪烁。
闪烁若干次后,再切换到东西路口方向,重复上述过程。
在实验中使用8个七段码管中的任意两个数码管显示时间。
东西路和南北路的通车时间均设定为20s。
数码管的时间总是显示为19、18、17…0、3、2、1、0、9、8…0。
在显示时间小于4秒的时候,通车方向的黄灯闪烁
2交通灯控制器设计
2.1交通灯控制器应具备的功能
本实验要完成任务就是设计一个简单的交通灯控制器,交通灯显示用实验箱的交通灯模块和七段码管中的任意两个来显示。
系统时钟选择时钟模块的1KHz时钟,黄灯闪烁时钟要求为2Hz,七段码管的时间显示为1Hz脉冲,即每1s中递减一次,在显示时间小于3秒的时候,通车方向的黄灯以2Hz的频率闪烁。
系统中用S1按键进行复位。
从题目中计数值与交通灯的亮灭的关系如图1所示:
支干道
主干道
图1路口交通管理示意图
A
B
C
D
主干道交通灯
绿(20秒)
黄(4秒)
红
红
支干道交通灯
红
红
绿(20秒)
黄(4秒)
表1交通信号灯的4种状态
2.3交通灯控制器系统设计思路与实现
根据题目要求的功能,可以把整体设计分为三个模块:
分频模块,把1kHz的频率分成1Hz,1Hz用于倒计时计数的时钟信号,而1kHz则可以用于数码管扫描显示的片选时钟信号;交通灯控制及倒计时模块;数码管译码扫描显示模块。
根据上面的思路分析最终得到的顶层文件原理图如下:
图2顶层文件仿真图
3硬件电路设计
3.1分频器的设计
分频器实现的是将高频时钟信号转换成低频的时钟信号,用于触发控制器和计数器。
该分频器实现的是一千分频,将一千赫兹的时钟信号分频成一赫兹的时钟信号。
生成的Symbol文件如图3和仿真波形如图4所示。
图3
VHDL源程序:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitydivis
port(clk:
instd_logic;
Clk1Hz:
outstd_logic);
enddiv;
architecturebehaveofdivis
signalClk_Count1:
std_logic_vector(9downto0);
begin
process(Clk)
begin
if(Clk'eventandClk='1')then
if(Clk_Count1<1000)then
Clk_Count1<=Clk_Count1+1;
else
Clk_Count1<="0000000001";
Clk1Hz<=Clk_Count1(9);
endif;
endif;
endprocess;
endbehave;
图4
3.2控制器的设计
控制器的作用是根据计数器的计数值及t1的输入数据控制发光二极管的亮、灭,
以及输出正计时数值给七段数码管的分位译码电路。
本控制器是利用时钟沿的下降沿读取前级计数器的计数值,然后作出反应;
图5
VHDL源程序:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitydisplayis
port(Clk1Hz,Rst:
instd_logic;
Dir_Flag:
bufferstd_logic;
SEC1,SEC10:
bufferintegerrange0to9;
R1,R2,G1,G2,Y1,Y2:
outstd_logic);
enddisplay;
architecturethreeofdisplayis
signalDirection:
integerrange0to15;
begin
process(Clk1Hz,Rst)
begin
if(Rst='0')then
SEC1<=0;
SEC10<=2;
Dir_Flag<='0';
elsif(Clk1Hz'eventandClk1Hz='1')then
if(SEC1=0)then
SEC1<=9;
if(SEC10=0)then
SEC10<=1;
else
SEC10<=SEC10-1;
endif;
else
SEC1<=SEC1-1;
endif;
if(SEC1<=0andSEC10<=0)then
Dir_Flag<=notDir_Flag;
endif;
endif;
endprocess;
process(Clk1Hz,Rst)
begin
ifClk1hz'eventandClk1hz='1'then
ifRst='0'then
R1<='1';
G1<='0';
R2<='1';
G2<='0';
else--正常运行
if(SEC10>0orSEC1>3)then
if(Dir_Flag='0')then--横向通行
R1<='0';
G1<='1';
R2<='1';
G2<='0';
else
R1<='1';
G1<='0';
R2<='0';
G2<='1';
endif;
else
if(Dir_Flag='0')then--横向通行
R1<='0';
G1<='0';
R2<='1';
G2<='0';
else
R1<='1';
G1<='0';
R2<='0';
G2<='0';
endif;
endif;
endif;
endif;
endprocess;
process(Clk1Hz)
begin
if(SEC10>0orSEC1>3)then
Y1<='0';
Y2<='0';
elsif(Dir_Flag='0')then
Y1<=Clk1Hz;
Y2<='0';
else
Y1<='0';
Y2<=Clk1Hz;
endif;
endprocess;
process(Dir_Flag)
begin
if(Dir_Flag='0')then--横向
Direction<=10;
else--纵向
Direction<=11;
endif;
endprocess;
endthree;
图6
3.2显示模块
此模块中含有七段数码管译码和扫描显示两个部分。
七段译码可以使用case语句,将数码管要显示的数译成对应的七位二进制数,用来控制数码管的a、b、c、d、e、f、g的导通。
八个数码管分别显示方向和计数数字,且是四位一体的,则要使用扫描显示的方法:
设计一个000到111循环计数的计数器,而且计数的时钟要比较大,选用输入的1KHz的时钟信号;当计数器计数为000,001时,选通第一个和第二个数码管,显示方向,当计数器计数为010时,选通第三个数码管,给它主干道倒计时十位的七段译码,当计数器计数为011时,选通第四个数码管,给它支主干道倒计时个位的七段译码,当计数器计数为100和101时,选通第四个和第五个数码管,显示通行方向,当计数器计数为110和111分别显示支路的十位个位,并以此循环扫描显示,达到人眼看上去四个数码管全显示的效果。
图7
VHDL源程序:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entityshuxianis
port(SEC1,SEC10:
inintegerrange0to9;
CLK:
instd_logic;
SEG_SEL:
bufferstd_logic_vector(2downto0);
Display:
outstd_logic_vector(7downto0));
endshuxian;
architecturebehaveofshuxianis
signalDisp_Temp:
integerrange0to15;
signalDisp_Decode:
std_logic_vector(7downto0);
signalDirection:
integerrange0to15;
begin
process(SEG_SEL)
begin
case(SEG_SEL+1)is
when"000"=>Disp_Temp<=Direction;
when"001"=>Disp_Temp<=Direction;
when"010"=>Disp_Temp<=SEC10;
when"011"=>Disp_Temp<=SEC1;
when"100"=>Disp_Temp<=Direction;
when"101"=>Disp_Temp<=Direction;
when"110"=>Disp_Temp<=SEC10;
when"111"=>Disp_Temp<=SEC1;
endcase;
endprocess;
process(Clk)
begin
if(Clk'eventandClk='1')then--扫描累加
SEG_SEL<=SEG_SEL+1;
Display<=Disp_Decode;
endif;
endprocess;
process(Disp_Temp)--显示转换
begin
caseDisp_Tempis
when0=>Disp_Decode<="00111111";--'0'
when1=>Disp_Decode<="00000110";--'1'
when2=>Disp_Decode<="01011011";--'2'
when3=>Disp_Decode<="01001111";--'3'
when4=>Disp_Decode<="01100110";--'4'
when5=>Disp_Decode<="01101101";--'5'
when6=>Disp_Decode<="01111101";--'6'
when7=>Disp_Decode<="00000111";--'7'
when8=>Disp_Decode<="01111111";--'8'
when9=>Disp_Decode<="01101111";--'9'
when10=>Disp_Decode<="01001000";--'='
when11=>Disp_Decode<="00010100";--'||'
whenothers=>Disp_Decode<="00000000";--全灭
endcase;
endprocess;
endbehave;
图8显示模块波形仿真图
4硬件实验方案及实验结果
4.1硬件实验方案
把整个程序输入好后,设置好顶层文件,然后编译,编译结束后,经行引脚绑定,绑定后保存并再次编译,最后配置文件下载。
引脚绑定如图9
图9
4.2实验结果
接好硬件,下载好程序,开始时把rst置为低电平,即表示支干道没有车来时,主干道亮红灯,支干道亮红灯,四个倒计时数码管都是灭的。
当把rst置为高电平并不变后,首先南北亮绿灯,东西方向为红灯,当倒计时为03时南北亮闪黄灯,东西继续亮到00时红灯,南北亮红灯东西亮绿灯,倒计时为03时东西方向黄灯开始闪南北方向继续亮红灯直到计时器从新赋值。
如此循环下去。
5心得体会
为期两周的EDA课程设计,使我对EDA的认识有提高了一个层次,现在能够熟练的使用QuartsII,能够用VHDL语言编写简单的、实用的小程序,这次EDA课程设计重点学习了交通灯部分程序的编写、调试、还有硬件下载、操作等过程。
在整个课程设计的过程中,我查阅了大量的关于EDA的资料,特别是在网上和图书馆我找到了大量的关于硬件编程的资料。
另外,在课程设计的过程中我认为调试程序是很重要的,要有耐心。
我在第一次编译时有三十几个错误,其中有输入错误、语法错误,如:
工程名和实体名不一致,少了分号或者少了ENDIF等错误。
发现错误之后就要一遍一遍的仔细查错,直到没有错误,然后可以进行波型仿真了。
在这两周的时间里得到了单老师、李老师悉心的指导和关怀,我在这里表示深深的感谢!
同时老师严谨的治学态度和踏实的工作作风使我终身受益
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 娜娜 eda 交通灯