实验八 交通灯控制电路的设计.docx
《实验八 交通灯控制电路的设计.docx》由会员分享,可在线阅读,更多相关《实验八 交通灯控制电路的设计.docx(15页珍藏版)》请在冰豆网上搜索。
实验八交通灯控制电路的设计
可编程逻辑设计
——实验八报告
学院:
物理与信息工程学院
专业:
通信工程
年级:
2007级
班级:
二班
学号:
110700221
姓名:
林明明
指导老师:
杨秀芝
实验八交通灯控制电路的设计
一、实验目的:
进一步学习复杂数字电路的设计方法,提高利用硬件描述语言进行电路设计的技巧和熟练程度。
二、实验要求及原理:
1、满足图1顺序工作流程。
图中设南北方向的红、黄、绿灯分别为NSR、NSY、NSG,东西方向的红、黄、绿灯分别为EWR、EWY、EWG。
它们的工作方式有些必须是并行进行的,即南北方向绿灯亮,东西方向红灯亮;南北方向黄灯亮,东西方向红灯亮;南北方向红灯亮,东西方向绿灯亮;南北方向红灯亮,东西方向黄红灯亮。
图1交通灯顺序工作流程图
2、应满足两个方向的工作时序:
即东西方向亮红灯时间应等于南北方向亮黄、绿灯时间之和,南北方向亮红灯时间应等于东西方向亮黄、绿灯时间之和。
时序流程图2所示。
图2中,假设每个单位时间为3秒,则南北、东西方向绿、黄、红灯亮时间分别15秒、3秒、18秒,一次循环为36秒。
其中红灯亮的时间为绿灯、黄灯亮的时间之和。
123456789
101112123456
NSG
NSY
NSR
EWR
EWG
EWY
t
5t
6t
t
图2交通灯时序工作流程图
3、十字路口要有数字显示,作为时间提示,以便人们更直观地把握时间。
具体为:
当某方向红灯亮时,置显示器为某值,然后以每秒减1计数方式方式工作,直至减到数为“0”,十字路口红、绿灯交换,一次工作循环结束,进入下一步某方向地工作循环。
例如:
当南北方向从黄灯转换成红灯时,置南北方向数字显示为24,并使数显计数器开始减“1”计数,当减到“0”,时,此时红灯灭,而南北方向的绿灯亮;同时,东西方向的红灯亮,并置东西方向的数显为24。
三、实验内容:
1、根据实验要求及原理1、2画出交通指示灯控制电路原理框图。
提示:
两个方向的控制电路可以共用一个24进制计数器实现。
2、用VHDL硬件描述语言层次化设计方法进行顶层文件和各模块电路的设计。
3、用QuartusII对设计进行编译、综合、仿真,给出仿真波形和时序分析数据(不包括数码显示部分)。
4、通过QuartusII集成环境,将设计下载到实验电路上进行硬件测试。
管脚锁定:
clk:
clk143clk1
start:
PIO2330SW1
NSGPIO1929LED12
NSYPIO2028LED11
NSRPIO2127LED10
EWGPIO22LED3
EWYPIO12LED2
EWRLED1
5、画出完整的交通灯控制电路原理框图(含数码显示部分)。
6、修改上述内容2的设计,增加数码显示部分。
注意:
两方向的计数要求分别显示在数码管1、2和数码管7、8上。
7、用MAX_plusⅡ对设计进行编译、综合、仿真,给出仿真波形和时序分析数据。
8、再次将设计下载到实验电路上进行硬件测试。
新增管脚锁定:
A(6):
PIO611SEGg
A(5):
PIO510SEGf
A(4):
PIO49SEGe
A(3):
PIO38SEGd
A
(2):
PIO27SEGc
A
(1):
PIO16SEGb
A(0):
PIO05SEGa
*S
(2):
80
*S
(1):
79
*S(0):
78
四、思考题:
1、控制电路除用有限状态机实现外,还可以采用什么方法实现?
2、如果增加夜间显示(即全部黄灯闪烁),电路该怎样设计?
实验结果:
交通灯控制电路原理框图:
顶层电路的VHDL描述:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitytrafficis
port(clk,start:
instd_logic;
NSG,NSY,NSR,EWG,EWY,EWR:
outstd_logic;
ledNS,ledEW:
outstd_logic_vector(7downto0)
);
end;
architecturebehavoftrafficis
componentNSEW
port(clk,start:
instd_logic;
NSG,NSY,NSR,EWG,EWY,EWR:
outstd_logic
);
endcomponent;
componentled7s
port(clock,start:
instd_logic;
ledns,ledew:
outstd_logic_vector(7downto0)
);
endcomponent;
signalclk0,clk1,clk2,clknsr,clkewr:
std_logic;
begin
u1:
NSEWportmap(clk=>clk,start=>start,
NSG=>NSG,NSY=>NSY,NSR=>NSR,
EWG=>EWG,EWY=>EWY,EWR=>EWR);
u2:
led7sportmap(clock=>clk,start=>start,
ledns=>ledNS,ledew=>ledEW);
end;
各模块电路的VHDL描述:
模块clock的VHDL描述——
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityclockis
port(clk,start:
instd_logic;
clk0,clk1,clk2:
outstd_logic
);
endclock;
architecturebehavofclockis
begin
process(clk,start)
variablecql:
std_logic_vector(6downto0);
begin
ifclk'eventandclk='1'then
ifstart='1'then
ifcql<48thencql:
=cql+1;
elsecql:
=(others=>'0');
endif;
ifcql<24then
clk1<='1';elseclk1<='0';
endif;
ifcql>23andcql<48then
clk2<='1';elseclk2<='0';
endif;
endif;
endif;
endprocess;
end;
模块cnt10的VHDL描述——
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYCNT10IS
PORT(CLK,EN,LD:
INSTD_LOGIC;
CQ:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
D:
INSTD_LOGIC_VECTOR(3DOWNTO0);
COUT:
OUTSTD_LOGIC
);
ENDCNT10;
ARCHITECTUREBEHAVOFCNT10IS
BEGIN
PROCESS(CLK,EN)
VARIABLECQI:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
IFCLK'EVENTANDCLK='1'THEN
IFLD='1'THENCQI:
=D;
IFEN='1'THEN
IFCQI>0THENCQI:
=CQI-1;
ELSECQI:
="1001";
ENDIF;
ENDIF;
ENDIF;
ENDIF;
IFCQI=0THENCOUT<='1';
ELSECOUT<='0';
ENDIF;
CQ<=CQI;
ENDPROCESS;
ENDBEHAV;
模块NSG的VHDL描述——
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityNSGis
port(clk,start:
instd_logic;
cq:
outstd_logic_vector(3downto0);
oout:
outstd_logic
);
end;
architectureoneofNSGis
begin
process(clk,start)
variablecqi:
std_logic_vector(3downto0);
begin
ifclk'eventandclk='1'then
ifstart='1'then
ifcqi<11thencqi:
=cqi+1;
elsecqi:
=(others=>'0');
endif;
endif;
ifcqi<5thenoout<='1';
elseoout<='0';
endif;
endif;
cq<=cqi;
endprocess;
endone;
模块NSR的VHDL描述——
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityNSRis
port(clk,start:
instd_logic;
cq:
outstd_logic_vector(3downto0);
oout:
outstd_logic
);
end;
architectureoneofNSRis
begin
process(clk,start)
variablecqi:
std_logic_vector(3downto0);
begin
ifclk'eventandclk='1'then
ifstart='1'then
ifcqi<11thencqi:
=cqi+1;
elsecqi:
=(others=>'0');
endif;
endif;
ifcqi<6thenoout<='0';
elseoout<='1';
endif;
endif;
cq<=cqi;
endprocess;
endone;
模块NSEW的VHDL描述——
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityNSEWis
port(clk,start:
instd_logic;
NSG,NSY,NSR,EWG,EWY,EWR:
outstd_logic
);
end;
architectureoneofNSEWis
begin
process(clk,start)
variablecqi:
std_logic_vector(5downto0);
begin
ifclk'eventandclk='1'andstart='1'then
ifcqi<47thencqi:
=cqi+1;
elsecqi:
=(others=>'0');
endif;
ifcqi<21thenNSG<='1';
elseNSG<='0';
endif;
ifcqi>20andcqi<25thenNSY<='1';
elseNSY<='0';
endif;
ifcqi<25thenEWR<='1';
elseEWR<='0';
endif;
ifcqi>24andcqi<49thenNSR<='1';
elseNSR<='0';
endif;
ifcqi>24ANDcqi<45thenEWG<='1';
elseEWG<='0';
endif;
ifcqi>44ANDCQI<49thenEWY<='1';
elseEWY<='0';
endif;
endif;
endprocess;
endone;
模块led7s的VHDL描述:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityled7sis
port(clock,start:
instd_logic;
ledns,ledew:
outstd_logic_vector(7downto0)
);
end;
architecturebehavofled7sis
signalcqi:
std_logic_vector(7downto0);
signalcql:
std_logic_vector(7downto0);
signalcnt6:
std_logic_vector(7downto0);
signalclk:
std_logic;
begin
clk<=clock;
process(clk)
begin
ifclk'eventandclk='1'then
ifstart='1'then
ifcnt6<47thencnt6<=cnt6+1;
elsecnt6<="00000000";
endif;
endif;
endif;
endprocess;
process(clk)
begin
ifclk'eventandclk='1'then
ifstart='1'then
ifcqi>32thencqi<=cqi-1;
elsifcqi=32thencqi<="00011001";
elsifcqi>16thencqi<=cqi-1;
elsifcqi=16thencqi<="00001001";
elsifcqi>0thencqi<=cqi-1;
elsifcqi=0andcnt6=0
thencqi<="00100100";
endif;
ifcql>32thencql<=cql-1;
elsifcql=32thencql<="00011001";
elsifcql>16thencql<=cql-1;
elsifcql=16thencql<="00001001";
elsifcql>0thencql<=cql-1;
elsifcql=0andcnt6=24
thencql<="00100100";
endif;
endif;
endif;
endprocess;
ledew<=cqi;
ledns<=cql;
end;
交通灯工作时序仿真波形:
测试结果及分析:
(1)东西方向亮红灯时间应等于南北方向亮黄、绿灯时间之和,南北方向亮红灯时间应等于东西方向亮黄、绿灯时间之和.
(2)当某方向红灯亮时,置显示器为某值,然后以每秒减1计数方式方式工作,直至减到数为“0”,十字路口红、绿灯交换,一次工作循环结束,进入下一步某方向地工作循环。
例如:
当东西方向从黄灯转换成红灯时,置东西方向数字显示为24,并使数显计数器开始减“1”计数,当减到“0”,时,此时红灯灭,而东西方向的绿灯亮;同时,南北方向的红灯亮,并置南北方向的数显为24。
【回答问题】
1、控制电路除用有限状态机实现外,还可以采用什么方法实现?
2、如果增加夜间显示(即全部黄灯闪烁),电路该怎样设计?
答:
1.还可以用进程语句实现,用一个十二进制的计数器作为控制模块,则EWR、EWG、EWY、NSR、NSG、NSY在计数器不同输出的时候有相应的输出。
2.把黄灯输出信号EWY、NSY作为使能端,接到一个锁存器上,锁存器的输入时一个频率较高的信号,输出接黄色LED。
当EWY、NSY=1时,黄灯闪烁。