交通灯控制器设计(EDA程序设计实验报告)

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1EDA程序设计实验报告学院:信息学院专业:电子信息工程班级:电信1001班姓名:celestialfox学号:celestialfox2实验题目:交通灯控制器设计实验目的:1、熟练掌握VHDL基本语句、语法的使用2、掌握状态机的设计方法3、学习使用模块化设计4、加深对VHDL编程思想的理解设计任务:(1)显示十字路口A,B两个方向的红、黄、绿指示灯状态(2)根据外部设定时间实现正常的倒计时功能,用两组数码管分别作为A,B两方向的倒计时显示,规定东西和南北方向的车流量大致相同,因此红黄绿灯亮的时间也相同,定为红灯45s,黄灯5s,绿灯40s(3)设计一个特殊状态,此时A,B方向都禁止通行,指示红灯,计时器停止计数并保持原来的状态。特殊状态解除后,在原来状态的基础上继续计数(4)能实现总体清零功能,按下RES键后,系统实现总清零,计数器由初始状态计数,对应状态的指示灯亮设计分析:(1)交通灯的4种可能亮灯状态:状态东西方向南北方向3红黄绿绿黄红1100100210001030010014010001(2)根据交通灯不同状态的亮灯时间得到交通灯的工作过程:方向ARARAGAYARARA方向BGBYBRBRBGBYB时间t40s5s40s5s40s5s状态SS0S1S2S3S0S1(3)对于特殊情况,只需设计一个异步时序电路即可解决。程序中还应判断东西方向和南北方向的计数值是否超出范围。此电路仅在电路启动运行时有效,因为一旦两个方向的计数值正确后,就不能在计数到非法状态。(4)系统组成根据交通灯工作原理及要实现的功能将其分为4个部分。主控逻辑单元、置数器、计数器、BCD码转换器、七段字型译码器。主控制器置数器计数器BCD码转换器七段译码器4(5)系统工作原理NYYYNYYNYYNY上电复位S0状态A红B绿RES=0Time=0S1状态A红B黄RES=0Time=0S2状态A绿B红RES=0Time=0S3状态A黄B红Res=0Time=05程序设计:--theprogramhead--系统描述LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEWORK.ALL;ENTITYheadISPORT(color_a:bufferstd_logic_vector(2downto0);color_b:bufferstd_logic_vector(2downto0);acode_out_high,acode_out_low:outstd_logic_vector(6downto0);bcode_out_high,bcode_out_low:outstd_logic_vector(6downto0);res,clk,key:instd_logic);endhead;architecturemain_strofheadissignalput_a,put_b,flag_a,flag_b,load_a,load_b:std_logic;signaldata_a,data_b,value_cou_a,value_cou_b:std_logic_vector(7downto0);signalacode_in_high,acode_in_low,bcode_in_high,bcode_in_low:std_logic_vector(3downto0);signaldata_bcd_a,data_bcd_b:std_logic_vector(7downto0);componentput_numbis--定义置数器port(res_s,put_a,put_b,clk_s:instd_logic;out_sto_a:bufferstd_logic_vector(7downto0);out_sto_b:bufferstd_logic_vector(7downto0));endcomponent;componentcounteris--定义计数器port(res_c,clk_h,com_load,hold:instd_logic;in_data:instd_logic_vector(7downto0);vec_out:bufferstd_logic_vector(7downto0);flag:outstd_logic);endcomponent;componentmux_bcdis--定义bcd码转换器port(data_1:instd_logic_vector(7downto0);res_m,hold_s,clk_m:instd_logic;data_bcd:outstd_logic_vector(7downto0));endcomponent;componentmain_colis--定义主控制器port(hold_l,clk_r,flag_froma,flag_fromb,res_r:instd_logic;color_vec_a:bufferstd_logic_vector(2downto0);color_vec_b:bufferstd_logic_vector(2downto0);puta,putb,loada,loadb:bufferstd_logic);endcomponent;componentcode_sevis--定义七段字型译码器port(code_in:instd_logic_vector(3downto0);6code_out:outstd_logic_vector(6downto0));endcomponent;beginu1:put_numbportmap(res,put_a,put_b,clk,data_a,data_b);u2:counterportmap(res,clk,load_a,key,data_a,value_cou_a,flag_a);u3:counterportmap(res,clk,load_b,key,data_b,value_cou_b,flag_b);u4:mux_bcdportmap(value_cou_a,res,key,clk,data_bcd_a);u5:mux_bcdportmap(value_cou_b,res,key,clk,data_bcd_b);u6:main_colportmap(key,clk,flag_a,flag_b,res,color_a,color_b,put_a,put_b,load_a,load_b);u7:code_sevportmap(acode_in_high,acode_out_high);u8:code_sevportmap(acode_in_low,acode_out_low);u9:code_sevportmap(bcode_in_high,bcode_out_high);u10:code_sevportmap(bcode_in_low,bcode_out_low);acode_in_high=data_bcd_a(7downto4);--将BCD码转换器输出的八位码拆分为高低各四位acode_in_low=data_bcd_a(3downto0);bcode_in_high=data_bcd_b(7downto4);bcode_in_low=data_bcd_b(3downto0);endmain_str;--theprogramofmain_col--主控制器libraryieee;useieee.std_logic_1164.all;entitymain_colisport(hold_l,clk_r,flag_froma,flag_fromb,res_r:instd_logic;color_vec_a:bufferstd_logic_vector(2downto0);color_vec_b:bufferstd_logic_vector(2downto0);puta,putb,loada,loadb:bufferstd_logic);endmain_col;architecturertlofmain_colissignalcolor_vec:std_logic_vector(5downto0);--将两组灯颜色信号矢量并为一组signalcolor_vec_out:std_logic_vector(5downto0);--高三位为a组,低三位为b组beginputa=flag_froma;--来自a组计数器0秒信号送a组置数器putb=flag_fromb;--来自b组计数器0秒信号送b组置数器color_vec_a=color_vec_out(5downto3);color_vec_b=color_vec_out(2downto0);process(clk_r)beginif(clk_r'eventandclk_r='0')thenloada=flag_froma;--来自计数器的0秒信号延迟半个节拍后再送回计数器loadb=flag_fromb;--加载已在半个节前置数器放置在其端口上的初始数据确保数据无误endif;endprocess;process(clk_r,res_r,loada,loadb)7variabletemp:std_logic;variabletemp_vec:std_logic_vector(5downto0);begintemp_vec:=color_vec;if(res_r='0')thencolor_vec=100001;--复位时a组亮红灯,b组亮绿灯elsif(clk_r'eventandclk_r='1')thenif((loadaandloadb)='0')thencasetemp_veciswhen100001=color_vec=100010;--a红b绿后下一状态为a红b黄when100010=color_vec=001100;--a红b黄后下一状态为a绿b红when001100=color_vec=010100;--a绿b红后下一状态为a黄b红when010100=color_vec=100001;--a黄b红后下一状态为a红b绿whenothers=color_vec=XXXXXX;endcase;endif;endif;endprocess;process(hold_l,clk_r)--对特殊状态时红灯全亮的处理variabletemp:std_logic_vector(5downto0);beginif(hold_l='1')thentemp:=color_vec;elsetemp:=100100;endif;color_vec_out=temp;endprocess;endrtl;--theprogramofput_numb--置数器libraryieee;useieee.std_logic_1164.all;entityput_numbisport(res_s,put_a,put_b,clk_s:instd_logic;out_sto_a:bufferstd_logic_vector(7downto0);out_sto_b:bufferstd_logic_vector(7downto0));endput_numb;architecturertl_stoofput_numbisbeginprocess(res_s,put_a,clk_s)--a组计时时间状态机variablein_var:std_logic_vector(7downto0);beginin_var:=out_sto_a;8if(res_s='0')thenout_sto_a=00101100;--复位时a组输出2CH(44D),即45秒elsif(clk_s'eventandclk_s='0')then--在计时0秒的时钟下降沿置数if(put_a='0')thencasein_variswhen00101100=out_sto_a=001

1 / 15
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功