Quartus交通灯控制器VHDL代码仿真

名称:Quartus交通灯控制器VHDL代码仿真(文末获取)

软件:Quartus

语言:VHDL

代码功能:

交通灯控制器要求能显示十字路口东西、南北两个方向的红、黄、绿灯的指示状态,用两组红、黄、绿三种颜色的灯分别作为东西、南北两个方向的红、黄、绿灯。变化规律如下

1)东西绿灯亮、南北红灯亮2)东西黄灯亮、南北红灯亮;3)东西红灯亮、南北绿灯亮4)东西红灯亮、南北黄灯亮5)东西绿灯亮、南北红灯亮6)依次循环执行

南北方向是主干道车道,东西方向是支干道车道,要求两条交叉道路上的车辆交替运行,主干道每次通行时间设为305、支干道每次通行时间设为205,时间可设置修改

在绿灯转为红灯时,要求黄灯先亮5,才能变换运行车道

要求交通灯控制器具有异步复位功能,在复位信号使能时,能够实现交通灯的自动复位,井要求所有交通灯的状态变化在时钟信号上升沿处

1. 工程文件

2. 程序文件

3. 程序编译

4. 管脚分配

5. 仿真图

分频模块

交通灯控制模块

数码管显示模块

部分代码展示:

LIBRARY ieee;
   USE ieee.std_logic_1164.all;
   USE ieee.std_logic_unsigned.all;
--交通灯控制模块
ENTITY led_ctrl IS
   PORT (
      clk_1Hz    : IN STD_LOGIC;
  clk_1KHz    : IN STD_LOGIC;
  reset   : IN STD_LOGIC;--复位
      main_red       : OUT STD_LOGIC;--红灯
      main_green       : OUT STD_LOGIC;--绿灯
      main_yellow       : OUT STD_LOGIC;--黄灯
      branch_red       : OUT STD_LOGIC;--红灯
      branch_green       : OUT STD_LOGIC;--绿灯
      branch_yellow       : OUT STD_LOGIC;--黄灯
      down_cnt1     : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);--倒计时1
      down_cnt2     : OUT STD_LOGIC_VECTOR(7 DOWNTO 0)--倒计时2
   );
END led_ctrl;
ARCHITECTURE behave OF led_ctrl IS
   SIGNAL  main_green_num  : STD_LOGIC_VECTOR(7 DOWNTO 0);
   SIGNAL  main_yellow_num  : STD_LOGIC_VECTOR(7 DOWNTO 0);
   SIGNAL  branch_green_num  : STD_LOGIC_VECTOR(7 DOWNTO 0);
   SIGNAL  branch_yellow_num  : STD_LOGIC_VECTOR(7 DOWNTO 0);
   SIGNAL state    : STD_LOGIC_VECTOR(2 DOWNTO 0) := "000";
   SIGNAL main_green_cnt   : STD_LOGIC_VECTOR(7 DOWNTO 0) := "00000001";
   SIGNAL main_yellow_cnt   : STD_LOGIC_VECTOR(7 DOWNTO 0) := "00000001";
   SIGNAL branch_green_cnt   : STD_LOGIC_VECTOR(7 DOWNTO 0) := "00000001";
   SIGNAL branch_yellow_cnt   : STD_LOGIC_VECTOR(7 DOWNTO 0) := "00000001";  
   SIGNAL main_red_buf : STD_LOGIC:='0';
   SIGNAL main_green_buf : STD_LOGIC:='0';
   SIGNAL main_yellow_buf : STD_LOGIC:='0';
   SIGNAL branch_red_buf : STD_LOGIC:='0';
   SIGNAL branch_green_buf : STD_LOGIC:='0';
   SIGNAL branch_yellow_buf : STD_LOGIC:='0';
   SIGNAL  main_green_data   :  STD_LOGIC_VECTOR(7 DOWNTO 0);--计时
   SIGNAL  main_yellow_data   :  STD_LOGIC_VECTOR(7 DOWNTO 0);--计时
   SIGNAL  main_red_data   :  STD_LOGIC_VECTOR(7 DOWNTO 0);--计时
   SIGNAL  branch_green_data   :  STD_LOGIC_VECTOR(7 DOWNTO 0);--计时
   SIGNAL  branch_yellow_data   :  STD_LOGIC_VECTOR(7 DOWNTO 0);--计时
   SIGNAL  branch_red_data   :  STD_LOGIC_VECTOR(7 DOWNTO 0);--计时
BEGIN
   main_green_num <= "00011110";--主路绿灯30s
   main_yellow_num <= "00000101";--主路黄灯5s
   branch_green_num <= "00010100";--支路绿灯20s
   branch_yellow_num <= "00000101";--支路黄灯5s
   PROCESS (clk_1Hz,reset)
   BEGIN
IF(reset='1')then
state<="001";--异步复位
elsIF (clk_1Hz'EVENT AND clk_1Hz = '1') THEN
         CASE state IS
            WHEN "001" =>--主路绿灯
               IF (main_green_cnt < main_green_num) THEN
                  state <= "001";
                  main_green_cnt <= main_green_cnt + "00000001";
               ELSE
                  state <= "010";--下一状态
                  main_green_cnt <= "00000001";
               END IF;
            WHEN "010" =>--主路黄灯
               IF (main_yellow_cnt < main_yellow_num) THEN
                  state <= "010";
                  main_yellow_cnt <= main_yellow_cnt + "00000001";
               ELSE
                  state <= "011";--下一状态
                  main_yellow_cnt <= "00000001";
               END IF;
            WHEN "011" =>--支路绿灯
               IF (branch_green_cnt < branch_green_num) THEN
                  state <= "011";
                  branch_green_cnt <= branch_green_cnt + "00000001";
               ELSE
                  state <= "100";--下一状态
                  branch_green_cnt <= "00000001";
               END IF;
            WHEN "100" =>--支路黄灯
               IF (branch_yellow_cnt < branch_yellow_num) THEN
                  state <= "100";
                  branch_yellow_cnt <= branch_yellow_cnt + "00000001";
               ELSE
                  state <= "001";--下一状态
                  branch_yellow_cnt <= "00000001";
               END IF;
            WHEN OTHERS =>
               state <= "001";
         END CASE;
      END IF;
   END PROCESS;
   
   --主路绿灯
   PROCESS (clk_1Hz)
   BEGIN
      IF (clk_1Hz'EVENT AND clk_1Hz = '1') THEN
         IF (state = "001") THEN
            main_green_buf <= '1';
         ELSE
            main_green_buf <= '0';
         END IF;
      END IF;
   END PROCESS;
   
   --主路黄灯
   PROCESS (clk_1Hz)
   BEGIN
      IF (clk_1Hz'EVENT AND clk_1Hz = '1') THEN
         IF (state = "010") THEN
            main_yellow_buf <= '1';
         ELSE
            main_yellow_buf <= '0';
         END IF;
      END IF;
   END PROCESS;
   
   --主路红灯
   PROCESS (clk_1Hz)
   BEGIN
      IF (clk_1Hz'EVENT AND clk_1Hz = '1') THEN
         IF (state = "011" OR state = "100") THEN
            main_red_buf <= '1';
         ELSE
            main_red_buf <= '0';
         END IF;
      END IF;
   END PROCESS;
   
   --支路绿灯
   PROCESS (clk_1Hz)
   BEGIN
      IF (clk_1Hz'EVENT AND clk_1Hz = '1') THEN
         IF (state = "011") THEN
            branch_green_buf <= '1';
         ELSE
            branch_green_buf <= '0';
         END IF;
      END IF;
   END PROCESS;
   
   --支路黄灯
   PROCESS (clk_1Hz)
   BEGIN
      IF (clk_1Hz'EVENT AND clk_1Hz = '1') THEN
         IF (state = "100" ) THEN
            branch_yellow_buf <= '1';
         ELSE
            branch_yellow_buf <= '0';
         END IF;
      END IF;
   END PROCESS;
   
   --支路红灯
   PROCESS (clk_1Hz)
   BEGIN
      IF (clk_1Hz'EVENT AND clk_1Hz = '1') THEN
         IF (state = "001" OR state = "010") THEN
            branch_red_buf <= '1';
         ELSE
            branch_red_buf <= '0';
         END IF;
      END IF;
   END PROCESS;
   
   --计算主路红灯时间
   PROCESS (clk_1Hz)
   BEGIN
      IF (clk_1Hz'EVENT AND clk_1Hz = '1') THEN
         IF (state = "011") THEN
            main_red_data <= branch_green_cnt;--绿
         ELSIF (state = "100") THEN--黄
            main_red_data <= branch_yellow_cnt+ branch_green_num;
         ELSE
            main_red_data <= "00000000";
         END IF;
      END IF;
   END PROCESS;
   
   --计算支路红灯时间
   PROCESS (clk_1Hz)
   BEGIN
      IF (clk_1Hz'EVENT AND clk_1Hz = '1') THEN
         IF (state = "001") THEN
            branch_red_data <= main_green_cnt;
         ELSIF (state = "010") THEN
            branch_red_data <= main_yellow_cnt + main_green_num;
         ELSE
            branch_red_data <= "00000000";
         END IF;
      END IF;
   END PROCESS;
   
   PROCESS (clk_1Hz)
   BEGIN
      IF (clk_1Hz'EVENT AND clk_1Hz = '1') THEN
         main_green_data <= main_green_cnt;
         main_yellow_data <= main_yellow_cnt;
         branch_green_data <= branch_green_cnt;
         branch_yellow_data <= branch_yellow_cnt;
      END IF;
   END PROCESS;
   
   --倒计时,总时间减去正计时时间
   PROCESS (clk_1KHz)
   BEGIN
      IF (clk_1KHz'EVENT AND clk_1KHz = '1') THEN
         IF (main_red_buf = '1') THEN
            down_cnt1 <= branch_green_num + branch_yellow_num - main_red_data;
         ELSIF (main_green_buf = '1') THEN
            down_cnt1 <= main_green_num - main_green_data;
         ELSIF (main_yellow_buf = '1') THEN
            down_cnt1 <= main_yellow_num - main_yellow_data;
         ELSE
            down_cnt1 <= "00000000";
         END IF;
      END IF;
   END PROCESS;
   
   --倒计时,总时间减去正计时时间
   PROCESS (clk_1KHz)
   BEGIN
      IF (clk_1KHz'EVENT AND clk_1KHz = '1') THEN
         IF (branch_red_buf = '1') THEN
            down_cnt2 <= main_green_num + main_yellow_num - branch_red_data;
         ELSIF (branch_green_buf = '1') THEN
            down_cnt2 <= branch_green_num - branch_green_data;
         ELSIF (branch_yellow_buf = '1') THEN
            down_cnt2 <= branch_yellow_num - branch_yellow_data;
         ELSE
            down_cnt2 <= "00000000";
         END IF;
      END IF;
   END PROCESS;   
   
   --输出
   main_red <= main_red_buf;
   main_green <= main_green_buf;
   main_yellow <= main_yellow_buf;
   branch_red <= branch_red_buf;
   branch_green <= branch_green_buf;
   branch_yellow <= branch_yellow_buf;   
END behave;
完整代码

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

  • 10
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值