基于VHDL语言的交通灯控制器设计
2009年 06 月 18 日 星期四 20:38
设计要求
1、 显示一个方向的绿、黄、红的指示状态。
2、 特殊情况按键能实现特殊的功能,计数器停止计数并保持在原来的状态,显示红灯状态。 特殊 后能继续计数 .
3、 复位按键实现总体计数清零功能。
4、 实现正常的倒计时功能 . 用数码管作为倒计时显示 , 显示时间为绿灯 17s, 黄灯 3s 红灯 20s。
| |---| |
| 绿灯 | 黄灯 | 红灯 |
设计思想
首先由晶振产生出发信号,由控制器处理成 1HZ的时钟,利用此时钟进行计数,通过判断 控制交通灯的亮灭。通过每种灯亮的时间总数与计数值比较得到数码管应该显示的数值,利用分位 分成十位和个位。通过译码电路来实现数码管的显示。
本实验所使用的芯片为 EPM7128SLS84-,6 实体逻辑单元为 64 点,结构体逻辑单元为 128 小型芯片。
软件
本实验使用 MAX+plus II 10 来进行程序的编写,编译,仿真以及下载。在实验中发现其 用,但仍有地方需要改进,不支持 MOD取余运算。
( 源程序 )
* 在 MAX+plus II 中,汉字很容易出现乱码,建议大家用英文,这里为了考虑到读者的习惯 写论文时都译成中文
Library IEEE;
Use IEEE.std_logic_1164.all;
Entity redgreen is
Port
(
clock_in:in std_logic
hold_state:in std_logic; reset_state:in std_logic
led_red, led_green , led_yellow:out std_logic;
led_red
select_en:buffer std_logic; select_display:out std_logic_vector(0 to 6)
); end;
Architecture half of redgreen is
constant loop_hz:integer:=800000; -- 一根据晶振实际频率算出来 signal count_time:integer range 0 to loop_hz;
signal clock_buffer:std_logic;
signal clock_out:std_logic;
signal count_num:integer range 0 to 40;
signal display_num:integer range 0 to 20;
signal display_shi:integer range 0 to 9;
signal display_ge:integer range 0 to 9;
constant loop_time:integer:=40; 个循环周期的时间 constant red_time:integer:=20; -- 红灯的时间 constant green_time:integer:=17; -- 绿灯的时间
constant yellow_time:integer:=3; -- 黄灯的时间
begin
process(clock_in) -- 分频进程
begin
if rising_edge(clock_in) then
if count_time=loop_hz then count_time=0; clock_buffer=not clock_buffer;
else count_time=count_time+1;
end if;
end if; clock_out=clock_buffer;-- 输入 1HZ 的频率 end process;
process(reset_state ,clock_out) -- 计数进程 begin
if reset_state=1 then -- 重启后计数归零 count_num=0;
elsif rising_edge(clock_out) then
if hold_state=1 then -- 紧急时计数占停count_num=count_num;
else
if count_num=loop_time-1 then count_num=0;
else count_num=count_num+1;
end if;
end if;
end if;
end process;
process(clock_out) -- 交通灯显示
count
count
begin
num
num
if falling_edge(clock_in) then
if hold_state=1 then -- led_red=1; led_green=0;
原创力文档

文档评论(0)