⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 light.vhd

📁 pulse_sequence.vhd 并行脉冲控制器 light.vhd.vhd 交通脉冲控制器 division1.vhd 电压脉冲控制器中的分频 ad.vhd 电压脉冲控制器中的A/D控制
💻 VHD
字号:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity light is
port (start:in std_logic;					--定义初始化信号,高电平有效
		clk: in std_logic;					--定义参考时钟
	car_zhi:in std_logic;				--定义仪器监测到的支路有无车辆的标志,有为高电平
	man_zhi:in std_logic;				--定义仪器监测到的支路有无行人的标志,有为高电平
	g_zhu,y_zhu,r_zhu:out std_logic;	--定义主干道绿、黄、红灯,亮为高电平
		g_zhi,y_zhi,r_zhi:out std_logic	    --定义支路绿、黄、红灯,亮为高电平
	  );
end light;
architecture beh of light is
signal counter_g_zhu:integer range 0 to 255; --定义对主干道绿灯亮的计数器
signal counter_flash1:integer range 0 to 255; --定义主干道绿灯向红灯转换的计数器
signal counter_flash2:integer range 0 to 255; --定义支路绿灯向红灯转换的计数器
signal counter_judge1:integer range 0 to 255; --定义对支路绿灯亮的计数器
signal counter_judge2:integer range 0 to 255; --定义对支路连续5秒无车辆和行人的计数器
signal f1_g_zhu,f2_g_zhu:std_logic; 		--定义主干道绿灯亮的标志,亮为高电平
signal f_g_zhi:std_logic;					--定义支路绿灯亮的标志,亮为高电平
signal gtor_zhu: std_logic;				--定义主干道绿灯向红灯转换的标志,高电平开始转换
signal rtog_zhu: std_logic;				--定义主干道红灯向绿灯转换的标志,高电平开始转换
signal judge:std_logic;					--判断支路是否由绿灯向红灯转换的标志,高电平开始判断
begin
process(clk)
begin
if clk'event and clk='1' then
 if start='1' then  						--当start为高电平时, 对系统初始化
  f1_g_zhu<='1';							--主干道绿灯亮,黄灯和红灯灭
  f2_g_zhu<='1';
  g_zhu<='1';
  y_zhu<='0';							
  r_zhu<='0';
  g_zhi<='0';							--支路红灯亮,绿灯和黄灯灭
  y_zhi<='0';
  r_zhi<='1';
  judge<='0';							--支路由绿灯向红灯转换的标志初始为无效
  counter_g_zhu<=0;						--所有计数器初始为零
  counter_flash1<=0;
  counter_flash2<=0;
  gtor_zhu<='0';							--主干道红绿灯相互转换的标志初始化为无效
  rtog_zhu<='0';
else 
  if f1_g_zhu='1' then					--当主干道为绿灯时,开始计数
   counter_g_zhu<=counter_g_zhu+1;
   if counter_g_zhu>=15 then			--当主干道绿灯已亮15个clk时(实为240个,即2分
    if (car_zhi='1') or (man_zhi='1') then	--钟),开始判断支路是否有行人或车辆等待,若有将主
     gtor_zhu<='1'; 						--干道由绿灯转为红灯的标志置为高电平有效
	 f1_g_zhu<='0';						--将标志置零,不再继续判断
    end if;
   end if;
  end if;
  if gtor_zhu='1' then 					--当为高电平时,主干道开始由绿灯向红灯转换
   counter_flash1<=counter_flash1+1;		
   if counter_flash1<=3 then 				--当计数在3(实为5,即绿灯闪2.5秒)以内,设置主干道
    f2_g_zhu<=not f2_g_zhu; 			--绿灯闪烁
    g_zhu<=f2_g_zhu;
   elsif counter_flash1<=6 then			--当计数在3~6(实为5~10)时,主干道黄灯亮
    	y_zhu<='1';
   else y_zhu<='0';						--当计数在超过6(实为10,即5秒)时,主干道黄灯灭
 	    r_zhu<='1';						--红灯亮
	    gtor_zhu<='0';					--将转换标志清零,结束转换
		g_zhi<='1';						--支路绿灯亮
	    f_g_zhi<='1';					--支路绿灯亮标志置1
		r_zhi<='0'; 						--支路红灯灭
	    counter_flash1<=0;				--计数器清零,为下一次作准备
		judge<='1';						--启动判断支路是否由绿灯向红灯转换
		counter_judge1<=0;				--将判断计数器清零
		counter_judge2<=0;
   end if;
  end if;
  if judge='1' then 						--当判断标志为高电平时,开始启动判断支路是否由绿
   counter_judge1<=counter_judge1+1;	--灯向红灯转换
   if counter_judge1<10 then				--在计数不超过10(实为40,即20秒)时,判断是否有车
    if (car_zhi='0') and (man_zhi='0') then --辆和行人
     counter_judge2<=counter_judge2+1;
	  if counter_judge2>=4 then			--若连续4个clk(实为10个,即5秒)支路上没有车辆
	   rtog_zhu<='1'; 					--和行人时,启动转换,高电平有效
	   judge<='0'; 						--同时将标志judge置0,结束本次判断
 	  end if;
   else counter_judge2<=0;				--若在4个clk之内有车辆和行人出现,将计数器清零,
   end if;								--重新开始计数
  else  rtog_zhu<='1';					--若计数超过10,则无论支路有无车辆和行人,都启动
    	judge<='0'; 						--支路由绿灯向红灯的转换,同时将标志judge置0
  end if;
 end if;    
 if rtog_zhu='1' then 					    --当支路由绿灯向红灯转换的标志有效时,启动转换
   counter_flash2<=counter_flash2+1;		--计数
   if counter_flash2<=3 then 				--同前,支路绿灯闪
    f_g_zhi<=not f_g_zhi;
    g_zhi<=f_g_zhi;
   elsif counter_flash2<=6 then			--然后黄灯亮
    	y_zhi<='1';		
   else	y_zhi<='0';
 	    r_zhi<='1';						--再红灯亮
	    rtog_zhu<='0';					--将标志清零,结束本次转换
		g_zhu<='1';						--主干道绿灯亮
	    f1_g_zhu<='1';					--将主干道绿灯亮标志置1,开始启动主干道绿灯是否
		f2_g_zhu<='1'; 					--向红灯转换的判断
		r_zhu<='0'; 						--主干道红灯灭
		counter_flash2<=0;				--计数器清零,为下一次转换作准备
		counter_g_zhu<=0;
   end if;
  end if; 
 end if;
end if;
end process ; 
end beh;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -