欢迎来到装配图网! | 帮助中心 装配图网zhuangpeitu.com!
装配图网
ImageVerifierCode 换一换
首页 装配图网 > 资源分类 > DOC文档下载
 

FPGA实验报告交通灯控制器设计

  • 资源ID:32463720       资源大小:279KB        全文页数:16页
  • 资源格式: DOC        下载积分:15积分
快捷下载 游客一键下载
会员登录下载
微信登录下载
三方登录下载: 微信开放平台登录 支付宝登录   QQ登录   微博登录  
二维码
微信扫一扫登录
下载资源需要15积分
邮箱/手机:
温馨提示:
用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
支付方式: 支付宝    微信支付   
验证码:   换一换

 
账号:
密码:
验证码:   换一换
  忘记密码?
    
友情提示
2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

FPGA实验报告交通灯控制器设计

FPGA实验报告 -交通灯控制器设计 院 系: 电子与信息工程系 专 业: 通信工程 班 级: 姓 名: 学 号: 指导教师: 1、 实验任务 1、任务名称:交通灯控制器的设计 2、设计内容与要求: 设计一个十字路口交通信号灯的定时控制电路。要求红、绿灯按一定的规律亮和灭,并在亮灯期间进行倒计时,并将运行时间用数码管/液晶显示出来。 绿灯亮时,为该车道允许通行信号,红灯亮时,为该车道禁止通行信号。要求主干道每次通行时间为99秒,支干道每次通行时间为30秒。每次变换运行车道前绿灯闪烁,持续时间为5秒。即车道要由主干道转换为支干道时,主干道在通行时间只剩下5秒钟时,绿灯闪烁显示,支干道仍为红灯,以便主干道上已过停车线的车继续通行,未过停车线的车停止通行。同理,当车道由支干道转换为主干道时,支干道绿灯闪烁显示5秒钟,主干道仍为红灯。 对红、绿灯的运行时间要能比较方便的进行重新设置。 对器件进行在系统编程和实验验证。 用VHDL语言对设计进行描述,设计一个测试方案,通过ISE对设计进行仿真验证。并能够下载到实验板上调试成功。6 写出设计性实验报告,并打印各层次的源文件和仿真波形,然后作简要说明。 2、补充功能与要求: 1.在主干道和支干道添加左转向灯; 2.各灯亮的时间及最后闪烁时间可调节; 3.紧急路况时,主干道和支干道都为红灯。2、 实验环境1、 ISE软件一套;2、 PC机一台。三、设计思路1、根据题目要求,知道整个交通灯的运行过程是周期的,所以可以设计一个总的计数器,满周期则清零;2、将灯闪烁时间、主干道绿灯亮的时间、主干道转向灯亮的时间、支干道绿灯亮的时间、支干道转向灯亮的时间分别记为变量t0、t1、t2、t3、t4,通过调整它们,实现调节各灯亮的时间;3、将所有需要显示的量由同一个信号表示并最终输出、显示在LCD上。4、 系统设计a)系统框图b)状态转换说明:主干道和支干道永远有且只有一个灯亮,紧急路况时两边红灯亮,其余时候有且只有一个红灯亮;主干道绿灯、主干道转向灯亮、支干道绿灯、支干道转向灯依次亮,在最后t0S(默认为5S)闪烁。c)输入输出及信号设计: Port ( LCD_Clk : in STD_LOGIC;-50mhz时钟 reset : in STD_LOGIC:=0;-复位 sensor:in std_logic :=0;-特殊情况时,两边都是红灯 up:in std_logic :=0 ;-有效时调整时间时增大时间 down:in std_logic :=0;-有效时调整时间时减少时间 choose:in std_logic :=0;-选择调整哪一个时间 control:in std_logic :=0;-有效时可以暂停,调整时间 LCD_RS : out STD_LOGIC; LCD_RW : out STD_LOGIC; LCD_EN : out STD_LOGIC; redax,greenax ,greenay:out std_logic;-主干道的红灯和两个绿灯,greenay为左转灯 redbx,greenbx ,greenby:out std_logic;-支干道的红灯和两个绿灯,greenby为左转灯 data : out STD_LOGIC_VECTOR (3 downto 0); -Lcd显示type istate is(write_instr,write_dataup4,write_datadown4,set_addrup,set_addrdown,ret_homeup,ret_homedown);signal state:istate;signal cnt_clk,clk500:std_logic;-分别为1hz,500hzsignal cnt:integer range 0 to 15:=0;signal cntnumh,cntnuml:integer range 0 to 9;-输入到数码管的数字signal countnum:integer ;-计数器signal reda,greena,greena1,redb,greenb,greenb1:std_logic;-各交通灯对应的信?signal t:integer range 0 to 99;-要输入lcd中的数字d)基本模块设计:1)字符译码函数function putc(data:character) return std_logic_vector is -字符译码函数,将字符显示在lcd上variable result:std_logic_vector(7 downto 0);begincase data iswhen o=>result:=conv_std_logic_vector(111,8);when u=> result:=conv_std_logic_vector(117,8);when C=> result:=conv_std_logic_vector(67,8);when n=> result:=conv_std_logic_vector(110,8);when t=> result:=conv_std_logic_vector(116,8);when e=> result:=conv_std_logic_vector(101,8);when r=> result:=conv_std_logic_vector(114,8);when :=> result:=conv_std_logic_vector(58,8);when others => result:=conv_std_logic_vector(32,8);end case;return result;end putc;2)数字译码函数function putn(num:in integer range 0 to 9) return std_logic_vector is -数字译码函数,将数字显示在lcd上variable fig:std_logic_vector(7 downto 0);begincase num iswhen 0=>fig:="00110000"when 1=> fig:="00110001"when 2=> fig:="00110010"when 3=> fig:="00110011"when 4=> fig:="00110100"when 5=> fig:="00110101"when 6=> fig:="00110110"when 7=> fig:="00110111"when 8=> fig:="00111000"when 9=> fig:="00111001"end case;return fig;end putn;3)分频,由50Mhz得到500hz,驱动lcd process(LCD_Clk)-分频,得到500hz时钟variable n3:integer range 0 to 49999;beginif rising_edge(LCD_Clk) thenif n3<49999 thenn3:=n3+1;elsen3:=0;clk500<=not clk500;end if;end if;end process;4)分频,由500hz得到1hz,作为交通灯控制器输入process(clk500)-分频,得到1hz时钟variable n:integer range 0 to 249;beginif rising_edge(clk500) thenif n<249 thenn:=n+1;elsen:=0;cnt_clk<=not cnt_clk;end if;end if;end process;5)主要功能实现:process(cnt_clk,reset,choose,up,down,control,t)-实现各种要求功能,包括倒计时显示,红绿灯(含左转灯)转换,以及转换时间调整variable m:integer range 0 to 4 ;-m表示转换的是哪一个时间(t0-t4中哪一个)variable count : natural range 0 to 99;-计数器,将正计数转换为倒计数variable t0:integer range 0 to 99 :=5;-绿灯闪烁时间variable t1:integer range 0 to 99 :=79;-主干道绿灯亮的时间variable t2:integer range 0 to 99 :=20;-主干道左转灯亮的时间variable t3:integer range 0 to 99:=20;-支干道绿灯亮的时间variable t4:integer range 0 to 99:=10;-支干道左转灯亮的时间beginif reset=1 then-1-复位,计数器清零,m,t0-t4赋初值 countnum<=0; m:=0; t0:=5; t1:=79; t2:=20; t3:=20; t4:=10;elsif control=1 then-可调节时间或暂停if rising_edge(cnt_clk) then-2if choose =1 then 选择t0-t4中的哪一个 3if m=4 then -4m:=0;-m在0-4之间循环else m:=m+1;end if; -4t<=m;-显示melse -choose为0时调节所选时间 3if up=1 then -tx增大 -4if m =0 then -调整t0,即闪烁时间,上限为7s, 5if t0=7 then -6t0:=5;else t0:=t0+1;end if; -6t<=t0;-显示t0elsif m=1 then-调整t1,上限99sif t1=99 then -6t1:=79;else t1:=t1+1;end if; -6t<=t1;-显示t1elsif m=2 then-调整t2,上限为30sif t2=30 then -6t2:=20;else t2:=t2+1;end if; -6t<=t2;-显示t2elsif m=3 then -调整t3,上限为30sif t3=30 then -6t3:=20;else t3:=t3+1;end if; -6t<=t3;-显示t3elsif m=4 then-调整t4,上限为15sif t4=15 then -6t4:=10;else t4:=t4+1;end if; -6t<=t4;-显示t4end if; -5elsif down=1 then -tx减小 4if m =0 then -调整t0,即闪烁时间,下限为2s, 5if t0=2 then -6t0:=5;else t0:=t0-1;end if; -6t<=t0;-显示t0elsif m=1 then-调整t1,下限为39秒if t1=39 then -6t1:=79;else t1:=t1-1;end if; -6t<=t1;-显示t1elsif m=2 then -调整t2,下限为10sif t2=10 then -6t2:=20;else t2:=t2-1;end if; -6t<=t2;-显示t2elsif m=3 then -调整t3,下限10sif t3=10 then -6t3:=20;else t3:=t3-1; end if;-6t<=t3;-显示t3elsif m=4 then-调整t4,下限8sif t4=8 then -6t4:=10;else t4:=t4-1;end if;-6t<=t4; -显示t4end if; -5end if; -4end if; -3end if; -2elsif rising_edge(cnt_clk) then -此时reset=0if countnum=t1+t2+t3+t4 then -2记数到整周期时,记数器清零countnum<=0;elsecountnum<=countnum+1; -计数器小于整周期时,正常记数end if; -2if sensor=1 then -2 sensor信号有效期间,表示紧急情况两组路灯都为红灯reda<=1;redb<=1;greena<=0;greenb<=0;greena1<=0;greenb1<=0;elseif countnum<=t1-t0 then-3主干道绿灯亮且非闪烁,支干道红灯亮 reda<=0;greena<=1;greena1 <= 0;redb<=1;greenb<=0;greenb1<=0; elsif countnum<=t1 then -主干道绿灯亮且闪烁,支干道红灯亮 reda<=0;greena<=not greena;greena1<= 0;redb<=1;greenb<=0;greenb1<=0;elsif countnum<=t1+t2-t0 then -主干道左转绿灯亮且非闪烁,支干道红灯亮 reda<=0;greena<=0;greena1 <= 1;redb<=1;greenb<=0;greenb1<=0;elsif (countnum<=t1+t2) then -主干道左转绿灯亮且闪烁,支干道红亮reda<=0;greena<=0;greena1 <= not greena1;redb<=1;greenb<=0;greenb1<=0;elsif (countnum<=t1+t2+t3-t0) then -支干道绿灯亮且非闪烁,主干道红灯亮 reda<=1;greena<=0;greena1 <= 0;redb<=0;greenb<=1;greenb1<=0;elsif (countnum<=t1+t2+t3) then -支干道绿灯亮且闪烁,主干道红灯亮 reda<=1;greena<=0;greena1 <= 0;redb<=0;greenb<=not greenb;greenb1<=0;elsif (countnum<=t1+t2+t3+t4-t0) then -支干道左转绿灯亮且非闪烁,主干道红灯亮 reda<=1;greena<=0;greena1 <= 0;redb<=0;greenb<=0;greenb1<=1;elsif (countnum<=t1+t2+t3+t4) then -支干道左转绿灯亮且闪烁,主干道红灯亮 reda<=1;greena<=0;greena1 <= 0;redb<=0;greenb<=0;greenb1<=not greenb1;end if; -3end if; -2-下面将正计数转换为倒计数-if countnum<=t1 then -2count:=t1-countnum; -主干道绿灯亮,支干道红灯亮时倒计时elsif countnum<=t1+t2 then -主干道左转绿灯亮,支干道红灯亮时倒计时count:=t1+t2-countnum;elsif countnum<=t1+t2+t3 then-支干道绿灯亮,主干道红灯亮 时倒计时count:=t1+t2+t3-countnum;elsif countnum<=t1+t2+t3+t4 then-支干道左转绿灯亮,主干道红灯亮 时倒计时count:=t1+t2+t3+t4-countnum; end if; -2-上面将正计数转换为倒计数- t<=count;-显示countend if; -1-以下代码为分位译码-if t>=90 then -1cntnumh<=9;cntnuml<=t-90;elsif t>=80 thencntnumh<=8;cntnuml<=t-80;elsif t>=70 thencntnumh<=7;cntnuml<=t-70;elsif t>=60 thencntnumh<=6;cntnuml<=t-60;elsif t>=50 thencntnumh<=5;cntnuml<=t-50;elsif t>=40 thencntnumh<=4;cntnuml<=t-40;elsif t>=30 thencntnumh<=3;cntnuml<=t-30;elsif t>=20 thencntnumh<=2;cntnuml<=t-20;elsif t>=10 thencntnumh<=1;cntnuml<=t-10;elsecntnumh<=0;cntnuml<=t;end if;-1-以上代码为分位译码-各信号赋给各输出的交通灯greenax<=greena;-主干绿灯greenay<=greena1;-主干左转绿灯greenbx<=greenb;-支干道绿灯greenby<=greenb1;-支干道左转绿灯redax<=reda;-主干红灯redbx<=redb;-支干道绿灯end process;主要功能仿真如下:a)、reset为1时,初始化。为0时,会从79倒计时,主干道绿灯亮,支干道红灯亮,sensor为1时,主干道和支干道都为红灯亮:b)默认情况下倒计时到最后5S时会闪烁显示,并切换到下一状态,继续倒计时:c)如果reset=0且control为1时,暂停计数,此时若choose为1,则会在0-4之间循环计数,选择调节哪一个时间(t0-t4),若choose改为0,就会暂停计数:d)此时(reset=0,control=1,choose=0)若选择down=1或up=1,则会减计数(默认值到最小值循环)或加计数(默认值到最大值循环)调整当前选中的时间t:(当前选的t0,闪烁时间,最后调整为7s)e)若将control置于0 ,则会接着倒计时,就像最初初始化时,但此时调整后的时间生效(这里闪烁时间改为7s):6)显示process(clk500,reset)-lcd上显示数字和字符beginif reset=1 then-复位时不显示state<=write_instr;LCD_RS<=0;cnt<=0;elsif rising_edge(clk500) then-显示数字或字符case state iswhen write_instr=>LCD_RS<=0;case cnt is when 0=> data<="0011"when 1=> data<="0011"when 2=> data<="0011"when 3=> data<="0010"when 4=> data<="0010"when 5=> data<="1000"when 6=> data<="0000"when 7=> data<="0110"when 8=> data<="0000"when 9=> data<="1100"when 10=> data<="0000"when 11=> data<="0001"when others=> data<="0000"end case;if cnt=11 thencnt<=0;state<=write_dataup4;elsecnt<=cnt+1;state<=write_instr;end if;when write_dataup4=>LCD_RS<=1;case cnt iswhen 0=> data<=putc(C)(7 downto 4);when 1=> data<=putc(o)(7 downto 4);when 2=> data<=putc(u)(7 downto 4);when 3=> data<=putc(n)(7 downto 4);when 4=> data<=putc(t)(7 downto 4);when 5=> data<=putc(e)(7 downto 4);when 6=> data<=putc(r)(7 downto 4);when 7=> data<=putc(:)(7 downto 4);when 8=> data<=putn(cntnumh)(7 downto 4);when 9=> data<=putn(cntnuml)(7 downto 4);when others=>data<="0000"end case;state<=write_datadown4;when write_datadown4=>case cnt iswhen 0=> data<=putc(C)(3 downto 0);when 1=> data<=putc(o)(3 downto 0);when 2=> data<=putc(u)(3 downto 0);when 3=> data<=putc(n)(3 downto 0);when 4=> data<=putc(t)(3 downto 0);when 5=> data<=putc(e)(3 downto 0);when 6=> data<=putc(r)(3 downto 0);when 7=> data<=putc(:)(3 downto 0);when 8=> data<=putn(cntnumh)(3 downto 0);when 9=> data<=putn(cntnuml)(3 downto 0);when others=>data<="0000"end case;if cnt=7 thencnt<=8;state<=set_addrup;elsif cnt=9 thencnt<=0;state<=ret_homeup;elsecnt<=cnt+1;state<=write_dataup4;end if;when set_addrup=>LCD_RS<=0;data<="1100"state<=set_addrdown;when set_addrdown=>data<="0111"state<=write_dataup4;when ret_homeup=>LCD_RS<=0;data<="0000"state<=ret_homedown;when ret_homedown=>data<="0010"state<=write_dataup4;when others=>state<=write_instr;end case;end if;end process;end Behavioral;5、 位置约束、下载与配置最终,在实验板正常运行,实现所有功能。实验小结:a) 心得体会通过这次实验,我进一步掌握了VHDL语言的一些常用的语法规则,熟悉了ISE软件的使用,对Spartan 3E开发板有了更深的认识,了解了管脚的分配和FPGA的下载和配置方法。通过对于交通灯的设计,我学会了如何写LCD驱动,对于FPGA较深了兴趣。b) 待改进的问题1、模块化做的不够好,主要功能都在同一个进程里实现,使得代码可读性不够强;2、基本功能完成之后才开始实现扩展功能,只是对源代码的修改、添加新内容,整个程序逻辑不够明确,没有在最开始规划好;3、所有时间的调节都是同步的,需要时钟配合,可以改进为按键调节;4、程序中很多命名不够规范。c) 功能扩展1、 添加了紧急路况处理功能;2、 实现了各灯亮的时间以及闪烁时间的调整。15

注意事项

本文(FPGA实验报告交通灯控制器设计)为本站会员(仙***)主动上传,装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知装配图网(点击联系客服),我们立即给予删除!

温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!