十字路口交通灯控制器的设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
西安工业大学北方信息工程学院
课程设计报告
课程数字系统设计
题目十字路口交通灯控制器的设计
专业通信工程
班级
学号
姓名
2012年 6 月 23 日
目录
一、设计目的 (2)
二、设计要求和任务 (2)
设计任务: (2)
三、方案论证 (2)
四、VHDL语言程序描述 (3)
五、对VHDL语言进行处理 (7)
六、硬件仿真 (7)
七、心得体会 (10)
一、设计目的
利用MaxplussII平台的VHDL语言设计一个十字交叉路口的交通灯控制器,要求主干道和支道持续的时间各不相同,并能够用倒计时的形式显示。
二、设计要求和任务
设计任务:
有一条主干道和一条支干道的汇合点形成十字交叉路口,主干道为东西向,支干道为南北向。
为确保车辆安全,迅速地通行,在交叉道口的每个入口处设置了红、黄、绿3种信号灯(可利用实验板上的LED显示灯表示交通状态,其中O1、O2、O3分别表示主干道红、黄、绿灯,O6、O7、O8分别表示支干道红、黄、绿灯)。
要求:
(1)主干道绿灯亮时,支干道红灯亮,反之亦然,两者交替允许通行,主干道每次放行35s,支干道每次放行25s。
每次由绿灯变为红灯的过程中,亮光的黄灯作为过渡,时间为5s。
(2)利用七段数码显示器,实现正常的倒计时显示功能(用数码管1和数码管2显示主干道倒计时时间,用数码管4和数码管5显示支干道倒计时时间)。
(3)能实现总体清零功能:计数器由初始状态开始计数,对应状态的指示灯亮。
三、方案论证
图1交通灯控制器原理图
交通灯控制器原理框图如图1所示,包括置数模块、计数模块、主控制器模块和译码器模块。
置数模块将交通灯的点亮时间预置到置数电路中,计数模块以秒为单位倒计时,当计数值减为零时,主控电路改变输出状态,电路进入下一个状态的倒计时。
其中,核心部分是主控制模块,他负责整个交通灯的运行状态。
表1 交通灯控制器的状态转换表
(2)译码模块由于系统要进行35s,5s,25s三种定时,可以采用一个置数模块由主控模块输出的信号控制定时时间的选择。
(3)定时计数器采用倒序计时的方式,由主控模块输出的信号控制定时的开始,定时时间结束时输出定时时间结束信号到主控模块,通过主控模块控制交通灯的亮、灭。
(4)译码模块把计数器输出的信号分别进行译码,由数码管显示当前计数。
四、VHDL语言程序描述
----主干道放行35秒,支干道放行25秒,黄灯过渡时间为5秒的程序示例
library ieee; -----库说明
use ieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entity jiaotongdeng is -----实体名称
port( clk_in:instd_logic; -----端口定义:时钟信号rst:instd_logic; 复位信号
light:outstd_logic_vector(7 downto 0); 指示灯显示
LED7S0:out STD_LOGIC_VECTOR(6 downto 0); -----支干道十位数
LED7S1:out STD_LOGIC_VECTOR(6 downto 0); -----支干道个位数 LED7S2:out STD_LOGIC_VECTOR(6 downto 0); -----主干道十位数
LED7S3:out STD_LOGIC_VECTOR(6 downto 0) ----主干道个位数
);
endjiaotongdeng;
architecture arc of jiaotongdeng is -----结构体
type states is(green_red,yellow_red,red_green,red_yellow); -----定义了一个新的类型
signalstate:states;
signal nextstate:states:=green_red; -----定义下一状态
signal data0:integer range 0 to 3; ----支干道十位初始值范围 signal data1:integer range 0 to 9; ----支干道个位初始值范围 signal data2:integer range 0 to 3; ----主干道十位初始值范围 signal data3:integer range 0 to 9; ----主干道个位初始值范围signalclock_buffer:std_logic;
signal count_time:integer range 0 to 1999999; ----时钟技术范围signalclk:std_logic;
signal sec0:integer range 0 to 3; ----支干道十位显示值范围 signal sec1:integer range 0 to 9; ----支干道十位显示值范围 signal sec2:integer range 0 to 3; ----主干道十位显示值范围 signal sec3:integer range 0 to 9; ----主干道十位显示值范围begin
frequent:process(clk_in) ----分频程序begin
ifclk_in'event and clk_in='1' then
if count_time=1999999 then ----2M翻转一次
count_time<=0;
clock_buffer<=not clock_buffer;
else
count_time<=count_time+1;
end if;
end if;
clk<=clock_buffer; -----输出为1HZ的频率
end process;
light_statment:process(rst,state) ----交通信号灯的显示状态,及状态转换、初始值的设置begin
if rst='0' then light<="11011011"; --代表主干道绿灯亮,支干道红灯亮,O4和O5灯不用所以全置1让其始终不亮
else
case state is
when green_red=>light<="11011011"; --主干道绿灯亮,支干道红灯亮(状态一)
nextstate<=yellow_red; --下一状态为主干道黄灯亮,支干道红灯亮(状态二)
data2<=0;--下一状态的初始值设置
data3<=4;
data0<=0;
data1<=4;
when yellow_red=>light<="10111011"; --主干道黄灯亮,支干道红灯亮(状态二)
nextstate<=red_green;
data2<=2;
data3<=9;
data0<=2;
data1<=4;
when red_green=>light<="01111110"; --主干道红灯亮,支干道绿灯亮(状态三)
nextstate<=red_yellow;
data2<=0;
data3<=4;
data0<=0;
data1<=4;
when red_yellow=>light<="01111101"; --主干道红灯亮,支干道黄灯亮(状态四)
nextstate<=green_red;
data2<=3;
data3<=4;
data0<=3;
data1<=9;
end case;
end if;
end process;
time:process(rst,clk) -----记时状态
begin
ifrst='0' then
sec0<=3;sec1<=9;sec2<=3;sec3<=4; state<=green_red; ----数码管的初始值,初始状态
elsif (rising_edge(clk))then
if(((sec0=0 )and(sec1=0) )or ((sec2=0 )and(sec3=0)))then ----若支干道十位为0,个位为0或者主干道十位为0,个位为0就跳转到下一个状态
state<=nextstate;
sec2<=data2;sec3<=data3; ----数码管置下一状态的初始值
sec0<=data0;sec1<=data1;
else
sec1<=sec1-1; ----支干道个位减一
sec3<=sec3-1; ----主干道个位减一
if((sec2/=0)and(sec3=0))then ----主干道十位不为0,个位为0则
十位减一,个位附为9
sec2<=sec2-1;
sec3<=9;
end if;
if ((sec0/=0)and(sec1=0))then ----支干道十位不为0,个位为0则
十位减一,个位附为9
sec0<=sec0-1;
sec1<=9;
end if;
end if;
end if;
end process;
process(sec0) ----支干道十位计数值七段数码管译码
begin
case sec0 is
WHEN 0 => LED7S0 <= "1000000" ;---0
WHEN 1 => LED7S0 <= "1111001" ; ---1
WHEN 2 => LED7S0 <= "0100100" ;---2
WHEN 3 => LED7S0 <= "0110000" ;---3
WHEN others=>LED7S0<="1111111"; ---其余状态为不显示
END case;
END process;
process(sec1)
begin
case sec1 is
WHEN 0 => LED7S1 <= "1000000" ; ---0
WHEN 1 => LED7S1 <= "1111001" ; ---1
WHEN 2 => LED7S1 <= "0100100" ;---2
WHEN 3 => LED7S1 <= "0110000" ;---3
WHEN 4 => LED7S1 <= "0011001" ;---4
WHEN 5 => LED7S1 <= "0010010" ;---5
WHEN 6 => LED7S1 <= "0000010" ;---6
WHEN 7 => LED7S1 <= "1111000" ;---7
WHEN 8 => LED7S1 <= "0000000" ;---8
WHEN 9 => LED7S1 <= "0010000" ;---9
END case;
END process;
process(sec2) ----主干道十位计数值七段数码管译码begin
case sec2 is
WHEN 0 => LED7S2 <= "1000000" ;---0
WHEN 1 => LED7S2 <= "1111001" ; ---1
WHEN 2 => LED7S2 <= "0100100" ;---2
WHEN 3 => LED7S2 <= "0110000" ; ---3
WHEN others=>LED7S2<="1111111"; ---其余状态不显示
END case;
END process;
process(sec3) ----主干道个位计数值七段数码管译码begin
case sec3 is
WHEN 0 => LED7S3 <= "1000000" ;---0
WHEN 1 => LED7S3 <= "1111001" ; ---1
WHEN 2 => LED7S3 <= "0100100" ;---2
WHEN 3 => LED7S3 <= "0110000" ;---3
WHEN 4 => LED7S3 <= "0011001" ;---4
WHEN 5 => LED7S3 <= "0010010" ;---5
WHEN 6 => LED7S3 <= "0000010" ;---6
WHEN 7 => LED7S3 <= "1111000" ; ---7
WHEN 8 => LED7S3 <= "0000000" ;---8
WHEN 9 => LED7S3 <= "0010000" ; ---9
END case;
END process;
end arc;
五、对VHDL语言进行处理
(1)保存并查错
选取窗口菜单File-Project-Save&Check,即可针对电路文件进行检查。
(2 )修改错误
针对Message-Compiler窗口所提供的信息修改电路设计,直到没有错误为止。
(3 )保存并编译
选取窗口菜单File-Project-Save&Compile,即可进行编译,产生nand2.pof烧写文件。
六、硬件仿真
下载实验验证
(1)选择器件:
打开MAX+plus II,选取窗口菜单Assign-Device,出现对话框,选择MAX7000S系列的 EPM7128SLC84-6。
(2)锁定引脚:
选取窗口菜单Assign-Pin/Location/Chip,出现对话框,在Node Name中分别键入引脚名称,在Pin中键入引脚编号。
锁定引脚的界面如图所示。
图5 锁定引脚
Clk_in-->83,rst-->1,LED7S00~06-->69、70、73、74、75、76、77
LED7S10~16-->60、61、63、64、65、67、68
LED7S20~26-->18、20、21、22、24、25、27
LED7S30~36-->9、10、11、12、15、16、17
Light0~7-->58、57、56、55、54、52、51、50
(3)编译:选取窗口菜单File-Project-Save&Compile,即可进行编译,编译完成后的提示信息如图6所示。
图6 编译完成后的提示信息
(4)烧写:
(a)启动pof2jed.exe程序,将编译后生成的pof文件转换成jed文件,如图7所示进行设置。
设置完毕,点击“Run”按钮。
图7 pof文件转换成jed文件
(b)硬件连接:插上电源,下载线一端连接计算机并口端,一端接硬件板上的JTAG端口。
为了进行绝缘,在板子下面垫上一张白纸。
电源插好以后,POWER灯(红灯)亮。
(c)启动Atmel ISP.exe程序,将转换好的jiaotongdeng.jed文件下载到实际硬件中去。
点击File-New,弹出的对话框“Enter Number of :1”,点击OK按钮。
在弹出的对话框中按如图8所示进行设置,在JTAG中选择“Program/Verify”,Device 选择“ATF1508AS”,Jedec选择刚刚转换好的jiaotongdeng.Jed,点击OK按钮。
在PORT 中选择所连接的计算机并口号,在Cable types选择下载线的种类为ByteBlaster。
一切设置完毕后,点击Run按钮开始烧写,在烧写过程中,硬件板上的PROG灯(绿灯)会一直闪烁,烧写完毕后绿灯熄灭。
七、心得体会
通过利用MaxplussII平台的VHDL语言设计一个十字交叉路口的交通灯控制器,加深了我对于VHDL语言的理解和熟练,将原来的VHDL模块综合在一起。
在设计过程中,对于VHDL的语言模式,定义方式等的熟练,我更加意识到了其优越的性能,设计红绿灯的时间显示,各个状态跳变的方式和时刻考察了较为严密的思路,加强了团队合作能力和动手能力。
由于选择的器件所含有的宏单元有限,对程序的优化显得至关重要,避免了不必要的浪费,使得程序更加严谨和通畅。