您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 交通运输 > 基于VHDL的交通灯数电课程设计报告
湖南大学电气与信息工程学院本科生课程设计题目:交通信号灯控制器设计课程:数字电子技术课程设计专业:电气工程及其自动化班级:电自1104学号:姓名:指导老师:苏娟、何洪英、周冰航、曾文海设计时间:2014.4-5月数电课程设计——byZY1目录1课题概述..........................................21.1设计任务及要求................................21.2设计方案......................................32系统模块划分和源程序..............................42.1分频模块......................................42.2交通灯控制模块................................52.3BCD码转换模块................................72.4接口模块.....................................102.5LCD显示模块.................................142.6其他模块.....................................153逻辑原理图及仿真.................................163.1逻辑原理图...................................163.2波形仿真.....................................164实验板下载及运行结果.............................204.1约束文件.....................................204.2可下载的原理图...............................204.3运行效果图及说明.............................215心得体会........................................226答辩老师提问....................................237参考文献........................................24数电课程设计——byZY21.课题概述1.1设计任务及要求1.运用《电子技术基础·数字部分》所学内容,使用Altiumdesigner进行设计,使用vhdl编写模块,制作原理图进行仿真,并通过老师提供的接口模块下载到Nanoboard开发板上运行;2.由主干道A和支干道的汇合点形成十字交叉路口,在交叉路口的每个入口处设置有红、绿、黄三色信号灯。红灯亮禁止通行;绿灯亮允许通行,黄灯亮则使行驶到路口的车辆有时间行驶到禁止线之外;3.用红、绿、黄三色发光二极管作信号灯,主干道A为东西向,设红、绿、黄三色灯为AR、AG、AY;支干道B为南北向,设红、绿、黄三色灯为BR、BG、BY;4.主干道车辆较多,所以亮绿灯的时间设为50秒,支干道亮绿灯的时间设为30秒。当主干道允许通行亮绿灯时则支干道亮红灯;相反,支干道允许通行亮绿灯时则主干道亮红灯。每次由绿灯转变为红灯时,其间要亮5秒的黄灯作为过渡,以便行驶的车辆有时间行驶到禁止线外;5.交通灯正常运行时,用LCD显示屏显示主干道和支干道的倒计时时间,交通灯状态。即在LCD上按格式显示交通灯的2个2位BCD码,红绿黄灯。输入:EW[7..0]、SN[7..0]为东西、南北向的2个2位BCD码,EWRYG[2..0]、SNRYG[2..0]东西南北的红绿灯信号,顺序为红黄绿;6.具有一定的扩展功能,它能实现特殊状态的功能显示,用开关S作为特殊信号传感器,S为1时进入特殊状态并实现下列特殊状态功能:(1)显示器数字部分闪烁,即在全0和当前计时时间中交替显示;(2)计数器停止计数并保持原来的时间数据;(3)东西,南北方向的三色灯全显红色状态;(4)特殊状态解除后能继续返回正常工作状态。LCD显示屏显示格式如下:数电课程设计——byZY31.2设计方案状态图如下:真值表如下,时间在0-90s循环:时间(s)EWSNRYGRYG0-5000110051-5501010056-8510000186-90100010总体方案:所要设计的红绿灯EW、SN方向各有红、黄、绿三种灯,两路口时间不相同,红灯直接切换为绿灯,绿灯则需要先亮5秒黄灯再变为红灯。根据设计要求,除了需要正确的点亮灯以外,还需要将计时的数转换为8421码送入LCD显示屏显示为数字,另外由于需要红绿灯有保持显示和闪烁功能。综上,本人决定把控制器分为以下几个模块:分频器、交通灯控制模块、BCD转换模块。其中闪烁功能本人决定通过控制器的一个特定输出控制一个一分频(即为分频)的分频器的使能端来控制闪烁。数电课程设计——byZY42.模块划分和源程序2.1分频模块本次设计输入的脉冲为10MHz,而红绿灯控制器的计数要求一秒变换一次,即需要得到1Hz的脉冲。因此经计算需要分频5000000次。模块如下,其中10MHz脉冲从clkin输入,分频后输出为clkout。源代码如下:libraryieee;useieee.std_logic_1164.all;entitydivider1isport(clkin:instd_logic;--时钟信号输入clkout:outstd_logic);--时钟信号输出enddivider1;architecturearcdivider1ofdivider1issignaldata:integerrange0to5000000;signalQ:std_logic:='0';beginprocess(clkin)beginifrising_edge(clkin)thenif(data=5000000)then--想要的分频比data=0;Q=notQ;elsedata=data+1;endif;endif;clkout=Q;endprocess;endarcdivider1;数电课程设计——byZY5另外由于需要实现闪烁功能,因此通过控制器的一个特定输出控制一个一分频(即为分频)的分频器的使能端来控制闪烁。其中输入为分频后的1Hz脉冲,en为使能信号,由灯控制器的flash输出口输入en(后面会详细说明),若en为1,输出为1Hz脉冲。源代码如下:libraryieee;useieee.std_logic_1164.all;entityclk1isport(clkin,en:instd_logic;--时钟信号输入clkout:outstd_logic);--时钟信号输出endclk1;architecturearcclk1ofclk1issignalQ:std_logic:='0';beginprocess(clkin)beginifrising_edge(clkin)thenifen='0'thenQ='0';elseQ=notQ;endif;endif;clkout=Q;endprocess;endarcclk1;2.2交通灯控制模块本次设计的核心模块,控制器的作用是通过一个变量在0-90间进行循环计数,在clock输入的脉冲作用下,每一个上升沿计数值加1,同时numa[7..0],numb[7..0]分别输出东西、南北向的倒计时值。当计数为不同的区间时,EWRYG[2..0],SNRYG[2..0]输出红绿灯代表的数数电课程设计——byZY6字。若reset为1,红绿灯重新开始计数,即从东西向为绿灯,南北向为红灯开始。若hold为1,输出numa[7..0],numb[7..0]保持不变,EWRYG[2..0],SNRYG[2..0]输出为4(红灯)flash为1,通过一个分频器的使能让BCD转换模块在0和当前数值之间变化,从而达到闪烁的效果。源代码如下:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entitycontrollerisport(clock,reset,hold:instd_logic;flash:outstd_logic;numa,numb:outSTD_LOGIC_VECTOR(7DOWNTO0);EWRYG,SNRYG:outSTD_LOGIC_VECTOR(2DOWNTO0));endcontroller;architecturearccontrollerofcontrollerissignalcountnum:integerrange0to90:=0;beginprocess(clock)beginifreset='1'thencountnum=0;elsifrising_edge(clock)thenifhold='1'thenflash='1';elseflash='0';ifcountnum=89thencountnum=0;elsecountnum=countnum+1;endif;数电课程设计——byZY7endif;endif;endprocess;process(clock)beginifrising_edge(clock)thenifhold='1'thenEWRYG=100;SNRYG=100;elseifcountnum=49then--49numa=00110010-countnum;EWRYG=001;elsifcountnum=54then--54numa=00110111-countnum;EWRYG=010;elsenuma=01011010-countnum;EWRYG=100;endif;ifcountnum=54then--54numb=00110111-countnum;SNRYG=100;elsifcountnum=84then--84numb=01010101-countnum;SNRYG=001;elsenumb=01011010-countnum;SNRYG=010;endif;endif;endif;endprocess;endarccontroller;2.3BCD码转换模块需要将控制器输出的numa[7..0],numb[7..0]转换为8421码送入LCD显示屏显示为数字,由于vhdl语言的功能和实验所用板的限制,本人目前未找到用算式可以正确、及时转化BCD码并能成功下载到板子的源程序,只能运用case语句穷举。输入为七位二进制,输出为转换好的BCD码,reset为1时,输出为0。数电课程设计——byZY8源代码如下:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityTOBCDisport(D:inSTD_LOGIC_VECTOR(7DOWNTO0);reset:instd_logic;SEG:outSTD_LOGIC_VECTOR(7DOWNTO0));endTOBCD;architectureARCTOBCDofTOBCDisbeginprocess(reset,D)beginifreset='1'thenSEG=00000000;elsecaseDiswhen00000000=SEG=00000000;when00000001=SEG=00000001;when00000010=SEG=00000010;when00000011=SEG=00000011;when00000100=SEG=00000100;when00000101=SEG=00000101;when00000110=SEG=00000110;when00000111=SE
本文标题:基于VHDL的交通灯数电课程设计报告
链接地址:https://www.777doc.com/doc-6342148 .html