交通灯实验报告
- 格式:docx
- 大小:310.21 KB
- 文档页数:6
交通灯实验报告姓名:方艳梅学号:2801311032 班级:28001020班一:实验要求设计一个十字路口的交通灯控制系统。
要求工作顺序为东西方向红灯亮49秒,在这49秒之中,前45秒南北方向绿灯亮,后4秒黄灯闪耀。
然后南北方向红灯亮49秒,在这期间,前45秒东西方向绿灯亮,后4秒黄灯闪耀。
并且将各状态的时间显示在LED 灯上,方便人们的查看。
依次重复。
并将程序下载入开发板中实现对十字路口交通灯的模拟。
二:实验原理及实验方案的实现:由于本实验的开发板给的是66MHz的时钟信号,而对各色交通灯的计时是以秒为单位的,若直接用该时钟信号构造状态机,会大大增加程序的计算量,因此我们考虑先构造一分频器,实现的是将高频时钟信号转换成底频的时钟信号,用于触发控制器、计数器及状态机。
本实验实现的是将该66MHz的时钟信号分频出10Hz的时钟信号。
(一)分频器的实现:process(rst,clk)variable cnt: integer range 0 to 33;beginif rst='0' thencnt:=0;clk_1ms<='0';ledoe<='1';elsif clk'event and clk='1' thenif cnt=33 thencnt:=0;clk_1ms<=not clk_1ms;elsecnt:=cnt+1;end if;end if;end process;process(rst,clk_1ms)由于后面的LED可能用到多种频率,我们先对此时钟信号进行多次分频。
variable cnt: integer range 0 to 100;beginif rst='0' thencnt:=0;clk_1hz<='0';elsif clk_1ms'event and clk_1ms='1' thenif cnt=100 thencnt:=0;clk_1hz<=not clk_1hz;elsecnt:=cnt+1;end if;end if;end process;(二)控制信号的产生:为了进一步产生状态机,必须产生各色交通灯转换时的转换变量,这样才能在读取了转换变量后改变状态机,从而进一步改变交通灯的状态。
这种转换变量就是控制信号。
在本实验中其实只有两个控制变量:绿灯向黄灯的转变、黄灯向红灯的转变,通过不断循环就可以实现所有的转变。
即在分频时钟45s和49s时记录并产生控制信号即可。
P2:PROCESS(FOUT)BEGINIF FOUT'EVENT AND FOUT='1' THENIF time1<"1100001" THENtime1<=time1+1;ELSE time1 <="0000000";END IF;END IF;END PROCESS P2;P3: PROCESS (FOUT)BEGINIF FOUT'EVENT AND FOUT='1' THENcurrent_state<=next_state;END IF;END PROCESS P3;(三)状态机的实现:产生控制变量以后,就要产生状态机控制交通灯的改变。
通过对实验要求的分析我们不难发现每个循环只有四个状态,因此设计一个状态变量,当控制变量的上升沿到来时使其递增,当状态量为四时,返回初始态。
然后在每个状态量下分别顺序定义实验要求的交通灯状态。
process(rst,clk_1hz)variable mid:std_logic_vector(5 downto 0);variable clk4:std_logic;variable clk49:std_logic;beginif(rst='0') thenmid:="000000";elsif (clk_1hz'event and clk_1hz='1') thenif(mid="110000")thenmid:="000000";elsemid:=mid+'1';end if;end if;clk4:=(not mid(5))and(not mid(4))and(not mid(3))and(notmid(2))and(mid(1))and(mid(0));clk49:=(mid(5))and(mid(4))and(not mid(3))and(not mid(2))and(not mid(1))and(not mid(0));control<=clk4 or clk49;end process;process(rst,control)variable control_mid:std_logic_vector(2 downto 0);beginif(rst='0')thencontrol_mid :="111";elsif(control'event and control='1')thenif(control_mid="011")thencontrol_mid:="000";elsecontrol_mid:=control_mid+'1';end if;end if;end process;process(control_mid,clk_1hz)begincase control_mid iswhen"000"=>green_ns<='0';yellow_ns<='0';red_ns<='1';green_ew<='1';yellow_ew<='0';red_ew<='0';when"001"=>green_ns<='0';yellow_ns<='0';red_ns<='1';green_ew<='0';yellow_ew<=clk_1hz;red_ew<='0';when"010"=>green_ns<='1';yellow_ns<='0';red_ns<='0';green_ew<='0';yellow_ew<='0';red_ew<='1';when"011"=>green_ns<='0';yellow_ns<='0';red_ns<=clk_1hz;green_ew<='0';yellow_ew<='0';red_ew<='1';when others=>green_ns<='0';yellow_ns<=clk_1hz;red_ns<='0';green_ew<='0';yellow_ew<='0';red_ew<='1';end case;end process;三:实验方案的验证1.系统的顶层结构:查看RTL schematic得2.逻辑电路结构:3.控制信号的产生波形图:可以看到在一个周期内control信号只有在4s和49s时才会有高电平出现,说明控制信号产生正确。
四.最终交通灯状态转换的仿真实验截图:五.设计方案的优点及可改进之处1.设计方案的优点:设计倒计时器,对红灯和绿灯进行倒计时控制,设计思路是先设计一个process完成十进制数到BCD码的转换,随后利用BCD码控制两个LED管,最后利用时钟完成倒计时的功能。
2.设计方案的可改进之处:第一,尽管使用分频器能对原始时钟信号进行有效分频,但考虑到在实际电路中时钟信号T字形延伸到达各模块中的,从而多个时钟信号的并行输入会对电路增加很大的难度,因此需要改进。
第二,没有对交通的繁忙进行一定的预测,这可以通过设置几个时间常量,当某条干道车比较多时,我们通过控制来使这条路上红绿灯进行延长。
六.设计后的收获1.这个实验我们初次接触VHDL语言,对其语法不是很熟悉。
完成这次实验后,能初步了解VHDL的书写格式,达到实验的基本要求。
2.在设计实验时要做到模块化设计,虽然这个实验很简单,但这种设计思想在任何电路设计中都是通用而且很有效的,在大型工程项目中显得尤为重要。
3.实验调试是要做到逐块调试,可以先屏蔽掉其他部分,对某一模块单独调试,逐步缩小调试范围,这样能更加高效。
其次,可以先考虑先检查语法,因为作为初学者,语法错误总是难避免的,一个很小的语法错误往往会导致整个程序的停滞不前。
在排除语法错误后,对于逻辑的检查调试可以结合仿真软件确定错误之处,并仔细核对语句,可能会达到较好的效果。
4.在完成一项工作时要考虑时刻考虑到工程影响,要紧贴实际,不能一味追求实验室中的简单快。
只有在实际中最优的方案才是最值得肯定的,因此要了解并逐步掌握实际优化方案的设计思想和方法。