简介
本实验要完成任务就是设计一个简单的交通灯控制器,交通灯显示用实验箱 的交通灯模块和七段码管中的任意两个来显示。系统时钟选择时钟模块的 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);