基于VHDL语言的交通信号灯Quartus仿真

名称:基于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;
源代码

 扫描文章末尾的公众号二维码

  • 18
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值