数字电路实验-交通灯控制器.doc

上传人:doc321 文档编号:14964943 上传时间:2022-02-26 格式:DOC 页数:25 大小:162.50KB
返回 下载 相关 举报
数字电路实验-交通灯控制器.doc_第1页
第1页 / 共25页
数字电路实验-交通灯控制器.doc_第2页
第2页 / 共25页
数字电路实验-交通灯控制器.doc_第3页
第3页 / 共25页
数字电路实验-交通灯控制器.doc_第4页
第4页 / 共25页
数字电路实验-交通灯控制器.doc_第5页
第5页 / 共25页
点击查看更多>>
资源描述

《数字电路实验-交通灯控制器.doc》由会员分享,可在线阅读,更多相关《数字电路实验-交通灯控制器.doc(25页珍藏版)》请在三一文库上搜索。

1、数字电路实验报告交通灯控制器1 / 25一、 任务要求 设计制作一个用于十字路口的交通灯控制器。南北和东西方向各有一组绿、黄、红灯用于指挥交通,绿灯、黄灯和红灯的持续时间分别为20 秒、5 秒和25 秒; 当有特殊情况(如消防车、救护车等)时,两个方向均为红灯亮,计时停止,当特殊情况结束后,控制器恢复原来状态,继续正常运行; 用两组数码管,以倒计时方式显示两个方向允许通行或禁止通行的时间; 选做:增加左、右转弯显示控制功能; 选做:其它自拟功能。二、 系统设计利用有限状态机描绘出交通灯的状态转移图,并设置记录东西和南北路口可通行时间的全局变量count1,count2。状态间的转移以count

2、1,count2的值作为判断条件。对于两种特殊情况:当复位信号reset为高电平时,则回到最初状态;当紧急输入信号emergency为高电平时,则转移到一特殊状态,emergency结束后则返回当前状态。三、总体框图及分块设计 交通灯控制器的逻辑划分方块图东西向路灯蜂鸣器控制器系统复位点阵南北向路灯时间显示译码器时间计数器紧急请求分频器 交通灯控制器逻辑流程图启动东西向直行,南北向红灯东西向左转,南北向红灯东西向红灯,南北向左转东西向红灯,南北向黄灯东西向红灯,南北向直行东西向黄灯,南北向红灯过了20秒?过了10秒?是否按下紧急按钮过了5秒过了20秒?过了5秒?过了10秒?YesYesYesY

3、esYesYesNoNoNoNoNoNo正常运行全亮红灯,铃声响起YesNo 交通灯控制器的状态转移图东西向直行(001),南北向红灯(100)点阵(00)东西向红灯(100),南北向直行(001)点阵(00)东西向绿灯(100),南北向黄灯(010)点阵(01)东西向左转(001),南北向红灯(100)点阵(01)T20=1T20 =1T5 =1T5 =1T20=1T10 =0T20 =0T5 =0任何状态全都红灯东西100南北100Bell=1紧急按钮(A=0)东西黄灯(010),南北红灯(100)点阵(01)T5 =0东西向红灯(100),南北向左转(001)点阵(01)T10 =0T1

4、0 =1T10 =1紧急按钮(A=1)其中图中T20 T10 T5分别是直行,左转和黄灯的时间,通过判断其是否达到所规定的时间来给灯作为改变的条件,程序已交通灯分别初始化为绿灯和红灯。另外,在reset信号为高电平时,不论其他状态和信号如何,系统回到最初状态。在reset信号为低电平且emergency为高电平时,两个方向交通灯均为红灯警铃响起,直到emergency恢复低电平时,系统恢复到emergency刚快要出现时系统的状态,并会到之前状态。2.分块设计在我的实验设计中,整个交通灯控制器包括5个模块:控制器模块control;计数模块catcontol;分频模块fenpin1和fenpi

5、n2;点阵DZ;数码管显示译码模块show;警铃控制器bellcontrol;主函数。现对各个模块的设计作一简要阐述:控制器模块control:这是整个程序的核心模块,控制着交通灯状态的转移和交通灯通行时间count1和count2数值的改变,该模块是交通灯状态转移图的程序实现。计数模块catcontrol:该模块将count1和count2数值转化为二进制信号并以较高频率扫描数码管的共阴极以显示多位数字的通行时间,是一个初级译码模块。分频模块fenpin1:该模块将实验板固有50M晶振时钟频率进行50000000分频,以产生控制器模块所需的1Hz频率。 Fenpin2:则分成1KHz的供扫频

6、和警铃的响声频率点阵DZ:通过contol里面的返回值来控制其显示,行为低电平有效,列位高电平,从第一行开始扫描到第八行。数码管显示译码模块show:该模块通过对每一位数字进行7段数码管译码以显示该数字,实际上我在实验中用的是8位信号。因为7段数码管实际上有8个输出信号,除了7段数码管,还有小数点显示信号。警铃控制器bellcontrol:通过返回的紧急信号值来判断是否给警铃一个高电平的信号。主函数:将各个模块连接起来。3.仿真图 正常运行下加了紧急信号复位信号 此次试验实现了交通灯的直行控制以及左转的控制,外加了紧急情况。并且在此之上附加了点阵显示交通灯的状态以及响铃的警报。四.故障分析 1

7、.我一开始是用50M的晶振频率扫描的数码管的共阴极,在初次下载好程序后运行时,我发现数码管显示的数字虽然正确,但亮度不一,容易被认为是错误的显示。后来我将50M晶振分频后产生的一个较低的频率来扫描共阴极,便得到了稳定、均匀、清晰的数码管数字显示。对于给警铃加的也频率开始也掌握不好,后来改了1KHz才感觉比较合适 2.在宿舍仿真的时候,第一次没改分频,导致机器承受不住,然后改了分频之后,第一次周期设置比较断,观察不到状态的转变,开始以为是代码错了,检查了很久,结果才发现是周期设置为50us比较短,而不是代码的问题,后来设置周期为250us之后就看到状态的转变。 3.在验收的时候由于小喇叭的硬件电

8、路没连接,使得没有响声,本以为是软件代码问题,后来通过仿真观察发现还是有信号过去的。五.总结交通灯控制器是数字状态机中较为简单较为基本的一种应用,通过这次实验,我对数字状态机的基本应用和程序实现有了一个更为深刻的认识。开始第一周先是把书看了一次特别代码部分,首先了解其基本的句式及其基本结构。后来通过书上的一些例题看出了门道,从而有了些想法。VHDL语言比较直白,此次试验对于状态机的描述很直白,基本上都是通过状态的判断来制定当前的显示,通过各种case,以及计数器的循环来体现出。这次实验收获颇多,先是学会了VHDL语言,还对数字电路中各种状态的转变及其转变条件的理解加深。还深刻意识到我们学的理论

9、知识和实际也能很好的联系。六.代码源程序主函数trafficlibrary ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity traffic isport(clk,reset,emergency:in std_logic; light1,light2:out std_logic_vector(2 downto 0); cat:out std_logic_vector(5 downto 0); num_out:out std_logic_vect

10、or(7 downto 0); hang,lie:out std_logic_vector(7 downto 0); bell_out:out std_logic);end traffic;architecture arch of traffic issignal clk_a:std_logic;signal clk_b:std_logic;signal count_a:std_logic_vector(5 downto 0);signal count_b:std_logic_vector(5 downto 0);signal e:std_logic; -emergency对应bell信号si

11、gnal dz_a:std_logic_vector(1 downto 0);signal show_num:std_logic_vector(3 downto 0);component fenpin1 isport(clk:in std_logic; clk_out:out std_logic);end component;component fenpin2 isport(clk:in std_logic; clk_out:out std_logic); end component;component control isport(clk:in std_logic; emergency:in

12、 std_logic; reset:in std_logic; light1:out std_logic_vector(2 downto 0):=001; light2:out std_logic_vector(2 downto 0):=100; counter1:out std_logic_vector(5 downto 0); counter2:out std_logic_vector(5 downto 0); bell:out std_logic; dz:out std_logic_vector(1 downto 0); end component;component dz isport

13、(clk:in std_logic; dz:in std_logic_vector(1 downto 0); hang,lie:out std_logic_vector(7 downto 0);end component;component bellcontrol isport(bell:in std_logic; clk1,clk2:in std_logic; bell_out:out std_logic);end component;component catcontrol isport(clk:in std_logic; cat:out std_logic_vector(5 downto

14、 0); num_in:out std_logic_vector(3 downto 0); counter1:in std_logic_vector(5 downto 0); counter2:in std_logic_vector(5 downto 0);end component;component show isport(num_in:in std_logic_vector(3 downto 0); num_out:out std_logic_vector(7 downto 0); end component;beginu1:fenpin1 port map(clk=clk,clk_ou

15、t=clk_a);u2:fenpin2 port map(clk=clk,clk_out=clk_b);u3:control port map(clk=clk_a,reset=reset,emergency=emergency,light1=light1,light2=light2,counter1=count_a,counter2=count_b,bell=e,dz=dz_a);u4:dz port map(clk=clk_b,dz=dz_a,hang=hang,lie=lie);u5:bellcontrol port map(bell=e,clk1=clk_b,clk2=clk_a,bel

16、l_out=bell_out);u6:catcontrol port map(clk=clk_b,cat=cat,num_in=show_num,counter1=count_a,counter2=count_b);u7:show port map(num_in=show_num,num_out=num_out);end arch;分频器fenpin1 (1Hz)library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity fenpin1 isport(clk:in std_logic; clk_

17、out:out std_logic); end fenpin1;architecture arch of fenpin1 is signal tmp:integer range 0 to 49999999; begin p1:process(clk) begin if clkevent and clk=1 then if tmp=49999999 then tmp=0; else tmp=tmp+1; end if; if tmp25000000 then clk_out=0; else clk_out=1; end if; end if; end process p1;end arch;fe

18、npin2 (1KHz) library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity fenpin2 isport(clk:in std_logic; clk_out:out std_logic); end fenpin2;architecture arch of fenpin2 issignal tmp:integer range 0 to 49999; begin p1:process(clk) begin if clkevent and clk=1 then if tmp=49999 th

19、en tmp=0; else tmp=tmp+1; end if; if tmp25000 then clk_out=0; else clk_out=1; end if; end if; end process p1;end arch;控制器controllibrary ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity control isport(clk:in std_logic; emergency:in std_logic; reset:

20、in std_logic; light1:out std_logic_vector(2 downto 0); light2:out std_logic_vector(2 downto 0); counter1:out std_logic_vector(5 downto 0); counter2:out std_logic_vector(5 downto 0); bell:out std_logic; dz:out std_logic_vector(1 downto 0);end control;architecture arch of control is signal count1:inte

21、ger:=20; signal count2:integer:=35; signal n_count1:integer; signal n_count2:integer; type all_state is (s0,s1,s2,s3,s4,s5,s6); signal state:all_state:=s0; signal tempstate:all_state:=s0; begin p1:process(clk,emergency,reset) begin if(reset=1) then state=s0;count1=20;count2=35;bell=0; elsif(emergenc

22、y=1) then state=s6;count1=0;count2=0;bellif count11 then tempstate=s0;count1=count1-1;count2=count2-1;n_count1=count1;n_count2=count2; else state=s1;count1=10;count2=count2-1;bellif count11 then tempstate=s1;count1=count1-1;count2=count2-1;n_count1=count1;n_count2=count2; else state=s2;count1=5;coun

23、t2=count2-1;bellif count11 then tempstate=s2;count1=count1-1;count2=count2-1;n_count1=count1;n_count2=count2; else state=s3;count1=35;count2=20;bellif count21 then tempstate=s3;count2=count2-1;count1=count1-1;n_count1=count1;n_count2=count2; else state=s4;count2=10;count1=count1-1;bellif count21 the

24、n tempstate=s4;count2=count2-1;count1=count1-1;n_count1=count1;n_count2=count2; else state=s5;count2=5;count1=count1-1;bellif count21 then tempstate=s5;count2=count2-1;count1=count1-1;n_count1=count1;n_count2=count2; else state=s0;count1=20;count2=35;bellstate=tempstate;count1=n_count1;count2state=s

25、0; end case; end if; counter1=conv_std_logic_vector(count1,6); counter2dzdzdzdzdz=10; end case; else dzlight1=001;light2light1=001;light2light1=010;light2light1=100;light2light1=100;light2light1=100;light2light1=100;light2=100; end case; end process p3;end arch;cotrol是通过count的递减来判断是否该转状态,并且吧当前的状态保存在

26、n_count里面,在紧急信号返回时候可以会到当前状态。一共7个状态,s0s6。计数器catcontrollibrary ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity catcontrol isport(clk:in std_logic; cat:out std_logic_vector(5 downto 0); num_in:out std_logic_vector(3 downto 0); counter1:in std_logic_v

27、ector(5 downto 0); counter2:in std_logic_vector(5 downto 0); end catcontrol;architecture arch of catcontrol issignal temp:integer range 0 to 3;signal count1:integer range 0 to 35;signal count2:integer range 0 to 35;signal count:integer range 0 to 35;signal num:std_logic_vector(3 downto 0);signal cat

28、_tmp:std_logic_vector(5 downto 0):=011111;begin p1:process(clk)begincount1=conv_integer(counter1); count2=conv_integer(counter2); if(clkevent and clk=1) then if(temp=3) then temp=0; else temp count count count countcase temp is when 0= num=0000;cat_tmp num=0000;cat_tmp num=0000;cat_tmp num=0000;cat_

29、tmpcase temp is when 0= num=0000;cat_tmp num=0001;cat_tmp num=0000;cat_tmp num=0001;cat_tmpcase temp is when 0= num=0000;cat_tmp num=0010;cat_tmp num=0000;cat_tmp num=0010;cat_tmpcase temp is when 0= num=0000;cat_tmp num=0011;cat_tmp num=0000;cat_tmp num=0011;cat_tmpcase temp is when 0= num=0000;cat

30、_tmp num=0100;cat_tmp num=0000;cat_tmp num=0100;cat_tmpcase temp is when 0= num=0000;cat_tmp num=0101;cat_tmp num=0000;cat_tmp num=0101;cat_tmpcase temp is when 0= num=0000;cat_tmp num=0110;cat_tmp num=0000;cat_tmp num=0110;cat_tmpcase temp is when 0= num=0000;cat_tmp num=0111;cat_tmp num=0000;cat_t

31、mp num=0111;cat_tmpcase temp is when 0= num=0000;cat_tmp num=1000;cat_tmp num=0000;cat_tmp num=1000;cat_tmpcase temp is when 0= num=0000;cat_tmp num=1001;cat_tmp num=0000;cat_tmp num=1001;cat_tmpcase temp is when 0= num=0001;cat_tmp num=0000;cat_tmp num=0001;cat_tmp num=0000;cat_tmpcase temp is when

32、 0= num=0001;cat_tmp num=0001;cat_tmp num=0001;cat_tmp num=0001;cat_tmpcase temp is when 0= num=0001;cat_tmp num=0010;cat_tmp num=0001;cat_tmp num=0010;cat_tmpcase temp is when 0= num=0001;cat_tmp num=0011;cat_tmp num=0001;cat_tmp num=0011;cat_tmpcase temp is when 0= num=0001;cat_tmp num=0100;cat_tmp num=0001;cat_tmp num=0100;cat_tmpcase temp is when 0= num=0001;cat_tmp num=0101;cat_tmp num=0001;cat_tmp num=0101;cat_tmpcase temp is when 0= num=0001;cat_tmp num=0110;cat_tmp num=0001;cat_tmp num=0110;cat_tmpcase temp is when 0= num=0001;cat_tmp=011111

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1