名称:基于VHDL语言的交通信号灯Quartus仿真(文末获取)
软件:Quartus
语言:VHDL
代码功能:
基于VHDL语言的交通信号灯
具体要求:
设计一个十字路口的交通灯控制器,控制A,B两条交叉道路上的车辆通行,东西方向为主干道A,南北方向为副干道B;具体要求如下:
1、每条道路设一组信号灯,每组信号灯有红、黄、绿3个灯组成,绿灯表示允许通过,红灯表示禁止通行,黄灯表示该车道上已过停车线的车辆继续通行,未过停车线的车辆停止通行。
2、主干道通行40秒,南北通行时间为20秒。
3、每次变换通行车道之前,要求黄灯先亮5s,才能变换通行车道。黄灯亮时,要求每秒闪烁一次。
1. 工程文件
2. 程序文件
3. 程序编译
4. RTL图
5. 仿真图
整体仿真图
分频模块
50分频为1Hz
红绿灯控制模块
数码管显示模块
数码管显示倒计时
部分代码展示:
LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_unsigned.all; --控制模块 ENTITY RGY IS PORT ( clk_1 : IN STD_LOGIC; clk : IN STD_LOGIC; reset : IN STD_LOGIC;--复位 R1 : OUT STD_LOGIC;--红绿灯信号 G1 : OUT STD_LOGIC;--红绿灯信号 Y1 : OUT STD_LOGIC;--红绿灯信号 R2 : OUT STD_LOGIC;--红绿灯信号 G2 : OUT STD_LOGIC;--红绿灯信号 Y2 : OUT STD_LOGIC;--红绿灯信号 SMG1 : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);--输出数码管显示数 SMG2 : OUT STD_LOGIC_VECTOR(7 DOWNTO 0)--输出数码管显示数 ); END RGY; ARCHITECTURE behave OF RGY IS SIGNAL G1_time : STD_LOGIC_VECTOR(7 DOWNTO 0);--对应灯时间 SIGNAL Y1_time : STD_LOGIC_VECTOR(7 DOWNTO 0);--对应灯时间 SIGNAL G2_time : STD_LOGIC_VECTOR(7 DOWNTO 0);--对应灯时间 SIGNAL Y2_time : STD_LOGIC_VECTOR(7 DOWNTO 0);--对应灯时间 SIGNAL state : STD_LOGIC_VECTOR(2 DOWNTO 0) := "000"; SIGNAL G1_cnt : STD_LOGIC_VECTOR(7 DOWNTO 0) := "00000001"; SIGNAL Y1_cnt : STD_LOGIC_VECTOR(7 DOWNTO 0) := "00000001"; SIGNAL G2_cnt : STD_LOGIC_VECTOR(7 DOWNTO 0) := "00000001"; SIGNAL Y2_cnt : STD_LOGIC_VECTOR(7 DOWNTO 0) := "00000001"; -- Declare intermediate signals for referenced outputs SIGNAL R1_temp : STD_LOGIC:='0'; SIGNAL G1_temp : STD_LOGIC:='0'; SIGNAL Y1_temp : STD_LOGIC:='0'; SIGNAL R2_temp : STD_LOGIC:='0'; SIGNAL G2_temp : STD_LOGIC:='0'; SIGNAL Y2_temp : STD_LOGIC:='0'; SIGNAL G1_BCD : STD_LOGIC_VECTOR(7 DOWNTO 0);--正计时 SIGNAL Y1_BCD : STD_LOGIC_VECTOR(7 DOWNTO 0);--正计时 SIGNAL R1_BCD : STD_LOGIC_VECTOR(7 DOWNTO 0);--正计时 SIGNAL G2_BCD : STD_LOGIC_VECTOR(7 DOWNTO 0);--正计时 SIGNAL Y2_BCD : STD_LOGIC_VECTOR(7 DOWNTO 0);--正计时 SIGNAL R2_BCD : STD_LOGIC_VECTOR(7 DOWNTO 0);--正计时 BEGIN --设置时间,可自行修改时间, --主路红灯时间等于支路绿灯加黄灯 --支路红灯时间等于主路绿灯加黄灯 G1_time <= "00101000";--主路绿灯40s Y1_time <= "00000101";--主路黄灯5s G2_time <= "00010100";--支路绿灯20s Y2_time <= "00000101";--支路黄灯5s -- Drive referenced outputs R1 <= R1_temp;--红 G1 <= G1_temp;--绿 Y1 <= Y1_temp and clk_1;--黄闪烁 R2 <= R2_temp;--红 G2 <= G2_temp;--绿 Y2 <= Y2_temp and clk_1;--黄闪烁 PROCESS (clk_1,reset) BEGIN if(reset='1')THEN state <= "001";--异步复位 elsIF (clk_1'EVENT AND clk_1 = '1') THEN CASE state IS WHEN "001" =>--主路绿灯 IF (G1_cnt < G1_time) THEN state <= "001"; G1_cnt <= G1_cnt + "00000001"; ELSE state <= "010";--//计时到后切换下一状态 G1_cnt <= "00000001"; END IF; WHEN "010" =>--主路黄灯 IF (Y1_cnt < Y1_time) THEN state <= "010"; Y1_cnt <= Y1_cnt + "00000001"; ELSE state <= "011";--计时到后切换下一状态 Y1_cnt <= "00000001"; END IF; WHEN "011" =>--支路绿灯 IF (G2_cnt < G2_time) THEN state <= "011"; G2_cnt <= G2_cnt + "00000001"; ELSE state <= "100";--计时到后切换下一状态 G2_cnt <= "00000001"; END IF; WHEN "100" =>--支路黄灯 IF (Y2_cnt < Y2_time) THEN state <= "100"; Y2_cnt <= Y2_cnt + "00000001"; ELSE state <= "001";--计时到后切换下一状态 Y2_cnt <= "00000001"; END IF; WHEN OTHERS => state <= "001"; END CASE; END IF; END PROCESS; --控制东西方向交通灯 PROCESS (clk_1) BEGIN IF (clk_1'EVENT AND clk_1 = '1') THEN IF (state = "001") THEN G1_temp <= '1'; ELSE G1_temp <= '0'; END IF; IF (state = "010") THEN Y1_temp <= '1'; ELSE Y1_temp <= '0'; END IF; IF (state = "011" OR state = "100") THEN R1_temp <= '1'; ELSE R1_temp <= '0'; END IF; END IF; END PROCESS;
源代码
扫描文章末尾的公众号二维码