EDA实验交通信号灯控制器的设计.docx
《EDA实验交通信号灯控制器的设计.docx》由会员分享,可在线阅读,更多相关《EDA实验交通信号灯控制器的设计.docx(13页珍藏版)》请在冰豆网上搜索。
![EDA实验交通信号灯控制器的设计.docx](https://file1.bdocx.com/fileroot1/2023-2/3/28dfa14a-22b5-4550-97b5-af3c091ef8d1/28dfa14a-22b5-4550-97b5-af3c091ef8d11.gif)
EDA实验交通信号灯控制器的设计
XXXX大学计算机科学学院
实验/上机报告
课程名称:
可编程逻辑系统设计
专业:
计科06(硬件)
成绩:
指导教师:
姓名:
日期:
2009/4/17
项目序号:
exp5_0605020234
学号:
时间:
星期五
项目名称:
交通信号灯控制器的设计
组号:
地点:
研505
一、实验目的
1、通过一个简单交通信号灯控制器的设计,认识状态机的典型程序结构
2、掌握同步时序系统的VHDL设计方法
二、实验环境
1、硬件:
PC机、便携式EDA/SOPC/DSP实验系统;
2、软件:
QuartusII7.2;
三、实验内容
1、完成一个简单交通信号灯控制器的设计并实现功能仿真和硬件模拟运行
2、考虑一定安全性策略,在前者的基础上改进系统设计,并实现功能仿真和硬件模拟运行
四、实验过程
设计思想:
交通信号灯控制器工作原理如下:
假设主路(main)和支路(spur)的通行时间为Tm、Ts,过渡时间(interim)为Ti。
当主路为绿灯(maingreen)时通行Tm后,转到过渡阶段,点亮黄色(mainyellow)信号灯,在经过Ti后,主路红灯(mainred)点亮,支路绿灯(spurgreen)点亮,支路绿灯点亮的持续时间为Ts,然后点亮黄色(spuryellow)信号灯,在经过Ti后,支路红灯(spurred)点亮,主路绿灯(maingreen)点亮,重复上一次循环。
实验步骤:
根据交通信号灯工作原理,可以得到如下交通信号灯控制器的状态转换图:
由该状态转换图可以看出,交通信号灯控制器的状态转换条件是分别由Tm、Ti、Ts控制的,因此,需要设计Tm、Ti、Ts三个定时器。
另外,为了实现状态转换和信号灯控制信号,还需要设计状态控制电路和输出译码电路。
因此,可知该交通信号灯控制原理框图包括定时器、状态控制器和输出译码器三部分。
下面分别对各部分单元进行设计,然后再由这些单元构成整个交通信号灯控制器电路:
1、定时电路
根据定时时间的长短,设计相应的计数器,实现定时的功能,这里我们分别将主路、支路、过渡阶段的定时时间设置为50s、30s、5s,且这些定时电路都受状态定时控制电路的控制。
以下分别是50s、30s、5s定时器的VHDL描述:
1)、50s定时器的VHDL程序:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYcount50IS
PORT(clk:
INSTD_LOGIC;
em:
INSTD_LOGIC;
m:
OUTSTD_LOGIC);
ENDcount50;
ARCHITECTUREexOFcount50IS
SIGNALq:
INTEGERRANGE0TO49;
BEGIN
PROCESS(clk,em)
BEGIN
IF(rising_edge(clk))THEN
IFem='1'THEN
IFq=49THENq<=0;m<='1';
ELSEq<=q+1;m<='0';
ENDIF;
ENDIF;
ENDIF;
ENDPROCESS;
ENDex;
2)、30s定时器的VHDL程序
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYcount30IS
PORT(clk:
INSTD_LOGIC;
es:
INSTD_LOGIC;
s:
OUTSTD_LOGIC);
ENDcount30;
ARCHITECTUREexOFcount30IS
SIGNALq:
INTEGERRANGE0TO29;
BEGIN
PROCESS(clk,es)
BEGIN
IF(rising_edge(clk))THEN
IFes='1'THEN
IFq=29THENq<=0;s<='1';
ELSEq<=q+1;s<='0';
ENDIF;
ENDIF;
ENDIF;
ENDPROCESS;
ENDex;
3)、5s定时器的VHDL程序
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYcount5IS
PORT(clk:
INSTD_LOGIC;
ei:
INSTD_LOGIC;
i:
OUTSTD_LOGIC);
ENDcount5;
ARCHITECTUREexOFcount5IS
SIGNALq:
INTEGERRANGE0TO4;
BEGIN
PROCESS(clk,ei)
BEGIN
IF(rising_edge(clk))THEN
IFei='1'THEN
IFq=4THENq<=0;i<='1';
ELSEq<=q+1;i<='0';
ENDIF;
ENDIF;
ENDIF;
ENDPROCESS;
ENDex;
2、状态控制电路
用S0=00表示主路通行状态,用S1=01表示主路过渡状态,用S2=11表示支路通行状态,用S3=10表示支路过渡阶段。
用m表示主路定时器Tm定时时间的输出,用i表示过渡阶段定时器Ti定时时间的输出,用s表示支路定时器Ts定时时间的输出。
则根据交通信号灯的工作过程,可得状态转换表。
如下所示:
输入信号
输出信号
Q2n
Q1n
m
i
s
Q2n+1
Q1n+1
0
0
1
0
0
0
1
0
1
0
1
0
1
1
1
1
0
0
1
1
0
1
0
0
1
0
0
0
用em、ei、es分别表示定时器Tm、Ti、Ts的定时控制信号,可得定时控制信号与控制状态之间的逻辑关系。
如下所示:
输入信号
输出信号
Q2
Q1
em
ei
es
0
0
1
0
0
0
1
0
1
0
1
1
0
0
1
1
0
0
1
0
以下是状态控制器的VHDL描述:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYcontrolIS
PORT(clk:
INSTD_LOGIC;
m,s,i:
INSTD_LOGIC;
em,es,ei:
OUTSTD_LOGIC;
q:
OUTSTD_LOGIC_vector(1downto0));
ENDcontrol;
ARCHITECTUREexOFcontrolIS
SIGNALstate:
STD_LOGIC_VECTOR(1downto0);
BEGIN
PROCESS(clk)
BEGIN
IF(RISING_EDGE(clk))THEN
CASEstateIS
WHEN"00"=>
IFm='1'THEN
state<="01";ei<='1';
ELSEei<='0';
ENDIF;
WHEN"01"=>
IFi='1'THEN
state<="11";es<='1';
ELSEes<='0';
ENDIF;
WHEN"11"=>
IFs='1'THEN
state<="10";ei<='1';
ELSEei<='0';
ENDIF;
WHEN"10"=>
IFi='1'THEN
state<="00";em<='1';
ELSEem<='0';
ENDIF;
WHENothers=>
ENDCASE;
ENDIF;
ENDPROCESS;
ENDex;
3、译码电路
译码电路实现交通信号灯的开关控制。
根据状态控制电路所产生的不同状态,来完成主路和支路的红灯、绿灯、黄灯之间的切换功能。
根据状态转换图,可以得到交通信号灯点亮的逻辑真值表。
如下所示:
控制器状态
主路(main)m_r_y_g
支路(spur)s_r_y_g
Q2Q1
红灯r
黄灯y
绿灯g
红灯r
黄灯y
绿灯g
00
0
0
1
1
0
0
01
0
1
0
1
0
0
11
1
0
0
0
0
1
10
1
0
0
0
1
0
以下是该译码电路的VHDL描述:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYdecoderIS
PORT(q_in:
instd_logic_vector(1downto0);
m_r_y_g:
outstd_logic_vector(2downto0);
s_r_y_g:
outstd_logic_vector(2downto0)
);
ENDdecoder;
ARCHITECTUREexOFdecoderIS
BEGIN
PROCESS(q_in)
BEGIN
CASEq_inIS
WHEN"00"=>
m_r_y_g<="001";s_r_y_g<="100";
WHEN"01"=>
m_r_y_g<="010";s_r_y_g<="100";
WHEN"11"=>
m_r_y_g<="100";s_r_y_g<="001";
WHEN"10"=>
m_r_y_g<="100";s_r_y_g<="010";
ENDCASE;
ENDPROCESS;
ENDEX;
4、交通信号灯控制器的主程序:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYtrafficIS
PORT(clk:
instd_logic;
m_r_y_g:
outstd_logic_vector(2downto0);
s_r_y_g:
outstd_logic_vector(2downto0)
);
ENDtraffic;
ARCHITECTUREexOFtrafficIS
COMPONENTdecoderIS
PORT(q_in:
instd_logic_vector(1downto0);
m_r_y_g:
outstd_logic_vector(2downto0);
s_r_y_g:
outstd_logic_vector(2downto0));
ENDCOMPONENT;
COMPONENTcontrolIS
PORT(clk:
INSTD_LOGIC;
m,s,i:
INSTD_LOGIC;
em,es,ei:
OUTSTD_LOGIC;
q:
OUTSTD_LOGIC_vector(1downto0));
ENDCOMPONENT;
COMPONENTcount50IS
PORT(clk:
INSTD_LOGIC;
em:
INSTD_LOGIC;
m:
OUTSTD_LOGIC);
ENDCOMPONENT;
COMPONENTcount30IS
PORT(clk:
INSTD_LOGIC;
es:
INSTD_LOGIC;
s:
OUTSTD_LOGIC);
ENDCOMPONENT;
COMPONENTcount5IS
PORT(clk:
INSTD_LOGIC;
ei:
INSTD_LOGIC;
i:
OUTSTD_LOGIC);
ENDCOMPONENT;
signaltem,tei,tes,tm,ti,ts:
std_logic;
signalstate:
std_logic_vector(1downto0);
BEGIN
u0:
count50PORTMAP(clk,tem,tm);
u1:
count30PORTMAP(clk,tes,ts);
u2:
count5PORTMAP(clk,tei,ti);
u3:
controlPORTMAP(clk,tm,ts,ti,tem,tes,tei,state);
u4:
decoderPORTMAP(state,m_r_y_g,s_r_y_g);
ENDex;
分别对上述单元VHDL文件程序进行编译、仿真,仿真成功后,将各单元生成对应的元件,然后再由这些元件构成整个交通信号灯控制器电路,以下是该交通信号控制灯电路连接后的原理图。
如下所示:
对该原理图进行保存、编译、仿真,仿真成功后,进行编程和配置。
首先进行引脚锁定,以下是分配完引脚后的界面。
如下:
锁定引脚之后,即可进入编程界面,对目标器件进行编程。
五、实验总结
本次实验的目的是设计一个交通信号灯控制器,通过分析可知,交通信号灯工作过程为:
主路绿灯、支路红灯->主路黄灯、支路红灯->主路红灯,支路绿灯->支路黄灯、主路红灯->支路红灯、主路绿灯。
如此循环往复。
因此,根据交通信号灯的工作过程,在具体设计时可以假设主路(main)和支路(spur)的通行时间为Tm、Ts,过渡时间(interim)为Ti。
当主路为绿灯(maingreen)时通行Tm后,转到过渡阶段,点亮黄色(mainyellow)信号灯,在经过Ti后,主路红灯(mainred)点亮,支路绿灯(spurgreen)点亮,支路绿灯点亮的持续时间为Ts,然后点亮黄色(spuryellow)信号灯,在经过Ti后,支路红灯(spurred)点亮,主路绿灯(maingreen)点亮,重复上一次循环。
如此即形象的描述出了该信号灯的工作原理及设计思路。
通过上述进一步描述、分析和设计,可以得到该交通信号灯控制器需要包括定时器、状态控制器和输出译码器三部分。
其中定时器作为Tm、Ti、Ts时间控制,状态控制器作为实现状态转换用,译码器作为实现信号灯控制信号显示。
分析清楚后,即可进行具体设计。
这里先分别对各部分单元进行设计,设计完后进行元件例化,然后再由这些单元构成整个交通信号灯控制器电路。
这样,一个简单的交通信号灯控制器在软件上的设计就算完成了。
在本次实验中,真正问题开始出现是在各部分单元都设计好之后,由于最开始我考虑的是通过一个主程序即将每个部分单元联系起来了,因此可以直接对主程序进行元件例化,然后通过对主程序元件进行编译、仿真、配置和下载。
这里。
由前面的交通信号灯控制器电路原理图可以看出,该电路是由每部分单元生成的元件构成的。
很显然,通过主程序进行元件例子化的思路即是错误的。
另外,在对电路进行连接的具体操作过程中,还出现了一些其他问题,譬如我在主路、支路红黄绿灯输出时,最开始只分别用了一个引脚进行输出,这样的直接结果即是找不到相匹配的引脚。
从前面原理图显示可以看到,通过译码器出来有两条总线,一条为主路红、黄、绿灯的输出,一条为支路红黄、绿、灯的输出,这里在连接输出引脚时,也是通过单线引出的,因为如果不用单线连接,在编译时也无法找到相匹配的引脚。
电路连接好后,对原理图进行编译仿真,编译、仿真成功后,即可在硬件上进行模拟运行。
但是,这里存在一个问题,即硬件环境输出频率与设计的时钟频率不一致,我不知道应该通过怎样的操作来解决这一问题。
并且,按照上述步骤所设计出来的信号灯控制器,主路和支路红、黄、绿灯显示应该是一个自动控制过程,即在对硬件进行配置时,输入引脚应该就只有时钟脉冲,因此这里就又出现一个问题,即在具体的硬件模拟运行中不知道通过怎样的操作来控制。
由于上述原因,该控制器在硬件模拟运行中没有成功。
虽然本次实验并没有得到最终的结果,但是通过总体的设计,可知分析的大致思路并没有错。
并且在具体的设计过程中,通过实际操作中发现的问题,可以发现很多在以前实验中不曾注意到得细节问题。
而根据出现的问题做出解决的措施,又可以掌握很多知识要点。
可见在实验过程中还是要出现问题,并且有勇气去解决出现的问题,才能够真正学到有用的知识。
而只有真正把学到的知识融会贯通,才能更灵活地运用到以后的设计中去。