基于VHDL的交通灯设计(实训要求)

简介本实验要完成任务就是设计一个简单的交通灯控制器,交通灯显示用实验箱 的交通灯模块和七段码管中的任意两个来显示。系统时钟选择时钟模块的 1KHz 时钟,黄灯闪烁时钟要求为 2Hz,七段码管的时间显示为 1Hz 脉冲,即每 1s 中递减一次,在显示时间小于 3 秒的时候,通车方向的黄灯以 2Hz 的频率闪烁。系统中用 S1 按键进行复位。该设计基于vhdl程序设计,分别编译分频、计数、数码管、...
摘要由CSDN通过智能技术生成

简介

本实验要完成任务就是设计一个简单的交通灯控制器,交通灯显示用实验箱 的交通灯模块和七段码管中的任意两个来显示。系统时钟选择时钟模块的 1KHz 时钟,黄灯闪烁时钟要求为 2Hz,七段码管的时间显示为 1Hz 脉冲,即每 1s 中递减一次,在显示时间小于 3 秒的时候,通车方向的黄灯以 2Hz 的频率闪烁。系统中用 S1 按键进行复位。
该设计基于vhdl程序设计,分别编译分频、计数、数码管、交通灯程序,然后将每个模块连接起来,构成一个系统,完成交通灯的功能实现。其交通灯的燃灭规律为:初始态是两个路口的红灯全亮,之后,东西路口的绿灯亮,南北路口的红灯亮,东西方向通车,延时一段时间后,东西路口绿灯灭,黄灯开始闪烁。闪烁若干次后,东西路口红灯亮,而同时南北路口的绿灯亮,南北方向开始通车,延时一段时间后,南北路口的绿灯灭,黄灯开始闪烁。闪烁若干次后,再切换到东西路口方向,重复上述过程。
结论:由这个设计可以得出,每一个模块都可以单独实现其功能,只要选好输入输出就可以将每个模块连接起来,构建成一个系统,从而综合的完成交通灯的功能。

红绿灯路口模型

在这里插入图片描述

方案设计


该系统主要由分为分频模块,计数器模块,交通灯控制模块,数码管控制模块构成。
其中分频模块是将系统输入的基准时钟信号转换成1HZ和2HZ的激励信号,分别驱动计数模块计数和交通灯控制模块。交通灯控制模块根据计数情况,控制交通灯亮灭和蜂鸣器的声音。数码管控制模块根据计数模块将时间以倒计时的形式通过数码管显示出来。

模块设计

时钟模块

模块


从输入端clk输入1khz的时钟信号,经过内部程序设计,将其分为1hz和2hz的信号进行输出,实现了1khz转化到1hz的设计

波形图测试


从波形仿真中可以看出,经过了1k个时钟输入信号clk1hz才得到一次上升沿,也就是相当于,将1khz的信号变为了1hz的信号,同样clk2hz就是clk1hz的一半,在clk500次时得到一次上升沿,将1khz的信号转化为2hz信号。从而达到分频的目的

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity FreDevider is
  port (clk:in std_logic;
        clk2hz:out std_logic;--定义时钟输出
        clk1hz:out std_logic);--定义时钟输出
  end FreDevider;
  architecture behave of FreDevider is
        signal clk_count1: std_logic_vector(9 downto 0);
        begin 
          process(clk)
        begin 
          if(CLK'EVENT AND CLK='1')THEN--时钟上升沿
             IF(clk_count1<1000)then
             clk_count1<=clk_count1+1;--时钟加计数
          else
             clk_count1<="0000000000";
          end if;
          END IF;
          end process;
        clk1hz<=clk_count1(9);
        CLK2HZ<=CLK_COUNT1(8);
      end behave;   

计数模块

模块


将分频得到的1hz信号输入clk1hz提供时钟激励,外加一个rst复位按键,按下按键进行计数清零。输出sec1和sec10为数码管的个位和十位计数,dir_flag为模式转换的标志输出信号,当其为0时,代表横向通过,为1时代表纵向通过

波形图测试


从波形仿真中可以看出,当1hz信号每次上升沿来的时候个位进行计数加1,当个位加到9后,下一个上升沿来时十位计数加1。当十位完成一次1到0的转换时dir_flag改变一次,也就是发生一次标志位转换(横纵向)

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY counter IS
PORT (CLK1HZ:IN STD_LOGIC;
RST:IN STD_LOGIC;
SEC1,SEC10:BUFFER INTEGER RANGE 0 TO 9;   --缓冲区整数范围0 ~ 9;十进制组成 
DIR_FLAG:BUFFER STD_LOGIC);
  • 42
    点赞
  • 289
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
交通灯控制器可以使用VHDL来实现。以下是一个简单的交通灯控制器的VHDL代码实现: ``` library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity traffic_light is port ( clk : in std_logic; reset : in std_logic; green : out std_logic; yellow : out std_logic; red : out std_logic ); end entity traffic_light; architecture behavioral of traffic_light is type state_type is (green_state, yellow_state, red_state); signal state : state_type := green_state; constant green_time : integer := 10000; -- 10 seconds constant yellow_time : integer := 2000; -- 2 seconds constant red_time : integer := 10000; -- 10 seconds signal counter : unsigned(14 downto 0) := (others => '0'); begin process (clk, reset) begin if reset = '1' then state <= green_state; counter <= (others => '0'); elsif rising_edge(clk) then case state is when green_state => green <= '1'; yellow <= '0'; red <= '0'; if counter = green_time then state <= yellow_state; counter <= (others => '0'); else counter <= counter + 1; end if; when yellow_state => green <= '0'; yellow <= '1'; red <= '0'; if counter = yellow_time then state <= red_state; counter <= (others => '0'); else counter <= counter + 1; end if; when red_state => green <= '0'; yellow <= '0'; red <= '1'; if counter = red_time then state <= green_state; counter <= (others => '0'); else counter <= counter + 1; end if; end case; end if; end process; end architecture behavioral; ``` 在代码中,我们定义了一个状态机来控制交通灯的状态。在每个状态下,我们使用计数器来计算状态的持续时间。使用计数器是为了定时控制交通灯的切换。当计数器到达指定的时间时,状态机会将交通灯的状态切换到下一个状态,并将计数器重置为零。 在主过程中,我们使用了一个 `process` 来控制状态机。如果 `reset` 信号为高电平,状态机将被重置为 `green_state` ,并将计数器清零。在上升沿时,状态机进入当前状态,并根据当前状态设置交通灯的输出信号。如果计数器达到指定时间,状态机将切换到下一个状态,并将计数器重置为零。 注意,这里使用了 `ieee.numeric_std.all` 库,以便使用无符号整数类型 `unsigned`。这个库是标准VHDL库的一部分,可以用于处理数字类型的操作。 以上就是一个简单的交通灯控制器的VHDL代码实现。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值