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

软件:Quartus

语言:VHDL

代码功能:

十字路口交通灯控制器的VHDL设计(每班21号以后的单号)

设计要求:利用硬件描述语言和FPGA器件,设计实现一个由一条主干道和一条支

干道的汇合点形成的十字交叉路口的交通灯控制器,具体要求如下

(1)主、支干道各设有一个绿、黄、红指示灯,两个显示数码管

(2)在主干道和支干道的两个方向上各设有一组绿、黄、红交通灯,其中一个方向是绿灯、黄灯、红灯,另一个方向是红灯、绿灯、黄灯

(3)数码管以倒计时的方式显示允许通行或禁止通行的时间,主干道每次放行40ss60s70s,支干道每次放行20s30s40s50s,在每次由亮绿灯变成亮红灯的转换过程中要亮5s的黄灯作为过渡,并进行减计时显示,时钟信号由实验箱上50MHz分频得到1H

(4)设置交主干道优先通行电路(选做

各放行定时器的实体名为:XXX放行时间,XXX为自己姓名的首字母

任务学号对应:21、23、25号选(70150);27、29、31选(60140)33、35、37-选(5030);39、41、43选(40120)。

1. 工程文件

2. 程序文件

3. 程序编译

4. RTL图

5. 仿真图

整体仿真图

分频模块

红绿灯控制模块

上图显示了主路和支路的红绿灯以及对应的倒计时

数码管显示模块

上图仿真了主路数码管显示10,支路数码管显示18

部分代码展示:

LIBRARY ieee;
   USE ieee.std_logic_1164.all;
   USE ieee.std_logic_unsigned.all;
--控制模块
ENTITY QJP_6040_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 QJP_6040_RGY;
ARCHITECTURE behave OF QJP_6040_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 <= "00111100";--主路绿灯60s
   Y1_time <= "00000101";--主路黄灯5s
   G2_time <= "00101000";--支路绿灯40s
   Y2_time <= "00000101";--支路黄灯5s
   -- Drive referenced outputs
   R1 <= R1_temp;--红
   G1 <= G1_temp;--绿
   Y1 <= Y1_temp;--黄灯
   R2 <= R2_temp;--红
   G2 <= G2_temp;--绿
   Y2 <= Y2_temp;--黄灯
   
   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;
   
   --控制南北方向交通灯
   PROCESS (clk_1)
   BEGIN
      IF (clk_1'EVENT AND clk_1 = '1') THEN
         IF (state = "011") THEN
            G2_temp <= '1';
         ELSE
            G2_temp <= '0';
         END IF;
         IF (state = "100" ) THEN
            Y2_temp <= '1';
         ELSE
            Y2_temp <= '0';
         END IF;
         IF (state = "001" OR state = "010") THEN
            R2_temp <= '1';
         ELSE
            R2_temp <= '0';
         END IF;
      END IF;
   END PROCESS;
源代码

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

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐