东西,南北两个方向交通灯设计VHDL代码Quartus仿真

名称:东西,南北两个方向交通灯设计VHDL代码Quartus仿真(文末获取)

软件:Quartus

语言:VHDL

代码功能:

功能需求

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

(1)东西绿灯亮、南北红灯亮;

(2)东西黄灯亮、南北红灯亮;

(3)东西红灯亮、南北绿灯亮;

(4)东西红灯亮、南北黄灯亮;

(5)东西绿灯亮、南北红灯亮;

(6)依次循环执行……

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

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

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

1. 工程文件

2. 程序文件

3. 程序编译

4. RTL图

5. 仿真图

整体仿真图

分频模块

红绿灯控制模块

数码管显示模块

部分代码展示:

LIBRARY ieee;
   USE ieee.std_logic_1164.all;
   USE ieee.std_logic_unsigned.all;
   USE ieee.std_logic_arith.all;
--显示模块
ENTITY display IS
   PORT (
      clk  : IN STD_LOGIC;--50MHz
      SMG1    : IN STD_LOGIC_VECTOR(7 DOWNTO 0);--倒计时时间
      SMG2   : IN STD_LOGIC_VECTOR(7 DOWNTO 0);--倒计时时间
      SEG  : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);--数码管段选
      SEL   : OUT STD_LOGIC_VECTOR(2 DOWNTO 0)--数码管位选
   );
END display;
ARCHITECTURE behavioral OF display IS
   
   SIGNAL SMG1_ten  : INTEGER := 0; 
   SIGNAL SMG1_one  : INTEGER := 0; 
   SIGNAL SMG2_ten : INTEGER := 0; 
   SIGNAL SMG2_one : INTEGER := 0; 
SIGNAL SMG1_int  : INTEGER := 0; 
SIGNAL SMG2_int  : INTEGER := 0;
   
   SIGNAL display_data  : INTEGER := 0; 
   SIGNAL select_num    : STD_LOGIC_VECTOR(31 DOWNTO 0) := "00000000000000000000000000000000";
   SIGNAL geshu         : STD_LOGIC_VECTOR(15 DOWNTO 0) := "0000000000000000";
BEGIN
   SMG1_int<=Conv_Integer(SMG1);--转为int类型
   SMG2_int<=Conv_Integer(SMG2);--转为int类型
   SMG1_ten <= SMG1_int / 10;--时间十位
   SMG1_one <= SMG1_int- SMG1_ten *10;--时间个位
   SMG2_ten <= SMG2_int / 10;--时间十位
   SMG2_one <= SMG2_int- SMG2_ten *10;--时间个位
   
   PROCESS (clk)
   BEGIN
      IF (clk'EVENT AND clk = '1') THEN
           geshu <= geshu + "0000000000000001"; --扫描那个管子的指示位
      END IF;
   END PROCESS;
   
   
   PROCESS (geshu)--位选切换
   BEGIN
      CASE geshu(5 downto 4) IS---仿真将geshu(15 downto 14)改为geshu(5 downto 4)
         WHEN "00" =>
            SEL <= "000";
            display_data <=  SMG1_ten;--时间个位
         WHEN "01" =>
            SEL <= "001";
            display_data <=  SMG1_one;--时间十位
         WHEN "10" =>
            SEL <= "010";
            display_data <=  SMG2_ten;--时间个位
         WHEN "11" =>
            SEL <= "011";
            display_data <=  SMG2_one;--时间十位
         WHEN OTHERS =>
      END CASE;
   END PROCESS;
   
   -------段选输出--
   PROCESS (display_data)
   BEGIN
      CASE display_data IS--数字显示码
         WHEN 0 =>
            SEG <=not"11000000";
         WHEN 1 =>
            SEG <= not"11111001";
         WHEN 2 =>
            SEG <= not"10100100";
         WHEN 3 =>
            SEG <= not"10110000";
         WHEN 4 =>
            SEG <= not"10011001";
         WHEN 5 =>
            SEG <= not"10010010";
         WHEN 6 =>
            SEG <= not"10000010";
         WHEN 7 =>
            SEG <= not"11111000";
         WHEN 8 =>
            SEG <= not"10000000";
         WHEN 9 =>
            SEG <= not"10010000";
         WHEN OTHERS =>
      END CASE;
   END PROCESS;
   
   
END behavioral;
源代码

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值