《数字电路实验-交通灯控制器(共20页).docx》由会员分享,可在线阅读,更多相关《数字电路实验-交通灯控制器(共20页).docx(20页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上数字电路实验报告交通灯控制器一、 任务要求 设计制作一个用于十字路口的交通灯控制器。南北和东西方向各有一组绿、黄、红灯用于指挥交通,绿灯、黄灯和红灯的持续时间分别为20 秒、5 秒和25 秒;当有特殊情况(如消防车、救护车等)时,两个方向均为红灯亮,计时停止,当特殊情况结束后,控制器恢复原来状态,继续正常运行;用两组数码管,以倒计时方式显示两个方向允许通行或禁止通行的时间;选做:增加左、右转弯显示控制功能;选做:其它自拟功能。二、 系统设计利用有限状态机描绘出交通灯的状态转移图,并设置记录东西和南北路口可通行时间的全局变量count1,count2。状态间的转移以co
2、unt1,count2的值作为判断条件。对于两种特殊情况:当复位信号reset为高电平时,则回到最初状态;当紧急输入信号emergency为高电平时,则转移到一特殊状态,emergency结束后则返回当前状态。三、总体框图及分块设计 交通灯控制器的逻辑划分方块图东西向路灯蜂鸣器控制器系统复位点阵南北向路灯时间显示译码器时间计数器紧急请求分频器 交通灯控制器逻辑流程图启动东西向直行,南北向红灯东西向左转,南北向红灯东西向红灯,南北向左转东西向红灯,南北向黄灯东西向红灯,南北向直行东西向黄灯,南北向红灯过了20秒?过了10秒?是否按下紧急按钮过了5秒过了20秒?过了5秒?过了10秒?YesYesY
3、esYesYesYesNoNoNoNoNoNo正常运行全亮红灯,铃声响起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 =
4、0T10 =1T10 =1紧急按钮(A=1)其中图中T20 T10 T5分别是直行,左转和黄灯的时间,通过判断其是否达到所规定的时间来给灯作为改变的条件,程序已交通灯分别初始化为绿灯和红灯。另外,在reset信号为高电平时,不论其他状态和信号如何,系统回到最初状态。在reset信号为低电平且emergency为高电平时,两个方向交通灯均为红灯警铃响起,直到emergency恢复低电平时,系统恢复到emergency刚快要出现时系统的状态,并会到之前状态。2.分块设计在我的实验设计中,整个交通灯控制器包括5个模块:控制器模块control;计数模块catcontol;分频模块fenpin1和fe
5、npin2;点阵DZ;数码管显示译码模块show;警铃控制器bellcontrol;主函数。现对各个模块的设计作一简要阐述:控制器模块control:这是整个程序的核心模块,控制着交通灯状态的转移和交通灯通行时间count1和count2数值的改变,该模块是交通灯状态转移图的程序实现。计数模块catcontrol:该模块将count1和count2数值转化为二进制信号并以较高频率扫描数码管的共阴极以显示多位数字的通行时间,是一个初级译码模块。分频模块fenpin1:该模块将实验板固有50M晶振时钟频率进行分频,以产生控制器模块所需的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_vector(7
10、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信号signal
11、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 std_
12、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(clk:
13、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 0);
14、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_out=clk
15、_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,bell_out
16、=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_out:o
17、ut std_logic); end fenpin1;architecture arch of fenpin1 is signal tmp:integer range 0 to ; begin p1:process(clk) begin if clkevent and clk=1 then if tmp= then tmp=0; else tmp=tmp+1; end if; if tmp then clk_out=0; else clk_out=1; end if; end if; end process p1;end arch;fenpin2 (1KHz) library ieee;use
18、 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 then tmp=0; else tmp=tmp+1; end
19、 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:in std_logic; light1:out std_
20、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:integer:=20; signal count2:intege
21、r:=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(emergency=1) then state=s6;count1=0;c
22、ount2=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;count2=count2-1;bellif count11 th
23、en 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 then tempstate=s4;count2=count2-
24、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=s0; end case; end if; counter1
25、=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的递减来判断是否该转状态,并且吧当前的状态保存在n_count里面,在紧急信号返回时候可以会到当前状态。一
26、共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_vector(5 downto 0); counter2:i
27、n 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_tmp:std_logic_vector(5 downt
28、o 0):=;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_tmpcase temp is when 0= num=0000;ca
29、t_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_tmp num=0100;cat_tmp num=0000;cat_
30、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_tmp num=0111;cat_tmpcase temp is whe
31、n 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 0= num=0001;cat_tmp num=0001;cat_t
32、mp 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_tmp
33、case 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 num=0111;cat_tmp num=0001;cat_tmp num=0111;cat_tmpcase temp is when 0= num=0001;cat_tmp num=1000;cat_tmp num=0001;cat_tmp num=1000;cat_tmpcase temp is when 0= num=0001;cat_tmp num=1001;cat_tmp num=0001;cat_tmp num=1001;cat_tmpcase temp is when 0= num=0010;cat_tmp num=0000;cat_tmp=; wh