实验五交通灯控制电路实验.docx
- 文档编号:11421294
- 上传时间:2023-02-28
- 格式:DOCX
- 页数:14
- 大小:91.80KB
实验五交通灯控制电路实验.docx
《实验五交通灯控制电路实验.docx》由会员分享,可在线阅读,更多相关《实验五交通灯控制电路实验.docx(14页珍藏版)》请在冰豆网上搜索。
实验五交通灯控制电路实验
南昌大学实验报告
学生姓名:
学号:
专业班级:
实验类型:
□验证□综合▉设计□创新实验日期:
12.14__实验成绩:
实验五交通灯控制电路实验
一、实验目的
1、了解交通灯的燃灭规律。
2、了解交通灯控制器的工作原理。
3、熟悉VHDL语言编程,了解实际设计中的优化方案。
二、实验原理
交通灯的显示有很多方式,如十字路口、丁字路口等,而对于同一个路口又有很多不同的显示要求,比如十字路口,车辆如果只要东西和南北方向通行就很简单,而如果车子可以左右转弯的通行就比较复杂,本设计实验仅针对最简单的南北和东西直行的情况。
要完成本实验,首先必须了解交通路灯的燃灭规律。
本实验需要用到实验箱上交通灯模块中的发光二极管,即红、黄、绿各三个。
依人们的交通常规,“红灯停,绿灯行,黄灯提醒”。
其交通灯的燃灭规律为:
初始态是两个路口的红灯全亮之后,东西路口的绿灯亮,南北路口的红灯亮,东西方向通车,延时一段时间后,东西路口绿灯灭,黄灯开始闪烁。
闪烁若干次后,东西路口红灯亮,而同时南北路口的绿灯亮,南北方向开始通车,延时一段时间后,南北路口的绿灯灭,黄灯开始闪烁。
闪烁若干次后,再切换到东西路口方向,重复上述过程。
在实验中使用8个七段码管中的任意两个数码管显示时间。
东西路和南北路的通车时间分别设定为1分钟和25s。
在显示时间小于5秒的时候,通车方向的黄灯闪烁。
三、实验内容
本实验要完成任务就是设计一个简单的交通灯控制器,交通灯显示用实验箱的交通灯模块和数码管模块。
系统时钟选择时钟模块的1KHz时钟,黄灯闪烁时钟要求为2Hz,七段码管的时间显示为1Hz脉冲,即每1s中递减一次,在显示时间小于5秒的时候,通车方向的黄灯以2Hz的频率闪烁。
系统中用S1按键进行复位。
四、实验步骤
1、打开QUARTUSII软件,新建一个工程。
2、建完工程之后,再新建一个VHDLFile,打开VHDL编辑器对话框。
3、按照实验原理和自己的想法,在VHDL编辑窗口编写VHDL程序,本次实验共分为四个进程源程序,每个进程程序分别实现一定的功能。
其具体的功能如下表17-2:
文件名称
完成功能
P1
实现分频产生1Hz计数脉冲和2Hz的黄灯闪烁脉冲
P2
十进制计数模块,控制显示灯点亮的时间
P3
控制灯的循环亮灭功能
P4
七段码管的扫描驱动与显示输出
所需实现的循环功能显示如下所示:
MGCR1分钟MYCR5秒钟MRCG20秒MRCY
5秒钟
4、编写完VHDL程序后,保存起来。
各程序源代码如下所示:
-------------------------------------
--Title:
源程序p1
--Author:
参考自网上
--Data:
2012-12-8
-----------------------------------------------------------------------------------------------------------
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
--------------------------------------------------------------------
ENTITYP1IS
PORT(CLK:
INSTD_LOGIC;--时钟输入
CLK2HZ:
OUTSTD_LOGIC;--输出2Hz闪烁时钟
CLK1HZ:
OUTSTD_LOGIC--输出1Hz计数时钟
);
ENDP1;
--------------------------------------------------------------------
ARCHITECTUREBEHAVEOFP1IS
SIGNALCLK_COUNT1:
STD_LOGIC_VECTOR(9DOWNTO0);
BEGIN
PROCESS(CLK)
BEGIN
IF(CLK'EVENTANDCLK='1')THEN
IF(CLK_COUNT1<1000)THEN
CLK_COUNT1<=CLK_COUNT1+1;
ELSE
CLK_COUNT1<="0000000001";
ENDIF;
ENDIF;
ENDPROCESS;
CLK1HZ<=CLK_COUNT1(9);
CLK2HZ<=CLK_COUNT1(8);
ENDBEHAVE;
-------------------------------------
--Title:
源程序P2
--Author:
参考自网上
--Data:
2012-12-8
-----------------------------------------------------------------------------------------------------------
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
--------------------------------------------------------------------
ENTITYP2IS
PORT(CLK1HZ:
INSTD_LOGIC;--输入计数1Hz脉冲
RST:
INSTD_LOGIC;--复位时钟
SEC1,SEC10:
BUFFERINTEGERRANGE0TO9;--十进制计数值
DIR_FLAG:
BUFFERSTD_LOGIC--方向标志
);
ENDP2;
--------------------------------------------------------------------
ARCHITECTUREBEHAVEOFP2IS
SIGNALDIR_FLAG1:
STD_LOGIC;
BEGIN
PROCESS(CLK1HZ,RST)
BEGIN
IF(RST='0')THEN
SEC1<=0;
SEC10<=6;
DIR_FLAG<='0';DIR_FLAG1<='0';
ELSIF(CLK1HZ'EVENTANDCLK1HZ='1')THEN--实现sel1与sel10的十进制计数
IF(SEC1=0)THEN
SEC1<=9;
IF(SEC10=0)THEN
IF(DIR_FLAG1='0')THEN
SEC10<=1;
ELSE
SEC10<=5;
ENDIF;
ELSE
SEC10<=SEC10-1;
ENDIF;
ELSE
SEC1<=SEC1-1;
ENDIF;
IF(SEC1=0ANDSEC10=0)THEN
DIR_FLAG<=NOTDIR_FLAG;
DIR_FLAG1<=NOTDIR_FLAG1;
ENDIF;
ENDIF;
ENDPROCESS;
ENDBEHAVE;
-------------------------------------
--Title:
源程序P3
--Author:
参考自网上
--Data:
2012-12-8
-----------------------------------------------------------------------------------------------------------
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
--------------------------------------------------------------------
ENTITYP3IS
PORT(CLK2HZ:
INSTD_LOGIC;--时钟输入
SEC1,SEC10:
ININTEGERRANGE0TO9;
DIR_FLAG:
INSTD_LOGIC;--方向标志
RST:
INSTD_LOGIC;--复位输入
MR,CR:
OUTSTD_LOGIC;--红灯输出
MY,CY:
OUTSTD_LOGIC;--黄灯输出
MG,CG:
OUTSTD_LOGIC--绿灯输出
);
ENDP3;
--------------------------------------------------------------------
ARCHITECTUREBEHAVEOFP3IS
BEGIN
PROCESS(CLK2HZ,RST)
BEGIN
IF(RST='0')THEN
MR<='1';
MG<='0';
CR<='1';
CG<='0';
ELSE--正常运行
IF(SEC10>0ORSEC1>3)THEN
IF(DIR_FLAG='0')THEN--横向通行
MR<='0';
MG<='1';
CR<='1';
CG<='0';
ELSE
MR<='1';
MG<='0';
CR<='0';
CG<='1';
ENDIF;
ELSE
IF(DIR_FLAG='0')THEN--横向通行
MR<='0';
MG<='0';
CR<='1';
CG<='0';
ELSE
MR<='1';
MG<='0';
CR<='0';
CG<='0';
ENDIF;
ENDIF;
ENDIF;
ENDPROCESS;
PROCESS(CLK2HZ)--控制黄灯的闪烁
BEGIN
IF(SEC10>0ORSEC1>3)THEN
MY<='0';
CY<='0';
ELSIF(DIR_FLAG='0')THEN
MY<=CLK2HZ;
CY<='0';
ELSE
MY<='0';
CY<=CLK2HZ;
ENDIF;
ENDPROCESS;
ENDBEHAVE;
-------------------------------------
--Title:
源程序P4
--Author:
参考自网上
--Data:
2012-12-8------------------------------------------------------------------------------------------------------------
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
--------------------------------------------------------------------
ENTITYP4IS
PORT(
DISPLAY:
STD_LOGIC_VECTOR(6DOWNTO0);--七段码管显示输出
SEC1,SEC10:
ININTEGERRANGE0TO9;--待显示十进制计数值
DIR_FLAG:
INSTD_LOGIC;--方向标志
CLK:
INSTD_LOGIC;--扫描时钟
SEG_SEL:
BUFFERSTD_LOGIC_VECTOR(2DOWNTO0)--七段码管扫描驱动
);
ENDP4;
--------------------------------------------------------------------
ARCHITECTUREBEHAVEOFP4IS
SIGNALDISP_TEMP:
INTEGERRANGE0TO15;
SIGNALDISP_DECODE:
STD_LOGIC_VECTOR(6DOWNTO0);
SIGNALDIRECTION:
INTEGERRANGE0TO15;
BEGIN
PROCESS(DIR_FLAG)
BEGIN
IF(DIR_FLAG='0')THEN--横向
DIRECTION<=10;
ELSE--纵向
DIRECTION<=11;
ENDIF;
ENDPROCESS;
PROCESS(SEG_SEL)
BEGIN
CASE(SEG_SEL+1)IS
WHEN"000"=>DISP_TEMP<=DIRECTION;
WHEN"001"=>DISP_TEMP<=DIRECTION;
WHEN"010"=>DISP_TEMP<=SEC10;
WHEN"011"=>DISP_TEMP<=SEC1;
WHEN"100"=>DISP_TEMP<=DIRECTION;
WHEN"101"=>DISP_TEMP<=DIRECTION;
WHEN"110"=>DISP_TEMP<=SEC10;
WHEN"111"=>DISP_TEMP<=SEC1;
ENDCASE;
ENDPROCESS;
PROCESS(CLK)
BEGIN
IF(CLK'EVENTANDCLK='1')THEN--扫描累加
SEG_SEL<=SEG_SEL+1;
DISPLAY<=DISP_DECODE;
ENDIF;
ENDPROCESS;
PROCESS(DISP_TEMP)--显示转换
BEGIN
CASEDISP_TEMPIS
WHEN0=>DISP_DECODE<="0111111";--'0'
WHEN1=>DISP_DECODE<="0000110";--'1'
WHEN2=>DISP_DECODE<="1011011";--'2'
WHEN3=>DISP_DECODE<="1001111";--'3'
WHEN4=>DISP_DECODE<="1100110";--'4'
WHEN5=>DISP_DECODE<="1101101";--'5'
WHEN6=>DISP_DECODE<="1111101";--'6'
WHEN7=>DISP_DECODE<="0000111";--'7'
WHEN8=>DISP_DECODE<="1111111";--'8'
WHEN9=>DISP_DECODE<="1101111";--'9'
WHEN10=>DISP_DECODE<="1001000";--'='
WHEN11=>DISP_DECODE<="0010100";--'||'
WHENOTHERS=>DISP_DECODE<="0000000";--全灭
ENDCASE;
ENDPROCESS;
ENDBEHAVE;
5、对自己编写的VHDL程序进行编译并仿真,对程序的错误进行修改。
直到完全通过。
后将每个进程文件转化为图像文件,再新建一个bdf文件,按要求将各各图形文件连接起来。
各模块连接图如下所示:
6、对bdf文件进行编译仿真无误后,依照按键开关、数字信号源、数码管与FPGA的管脚连接表或参照附录进行管脚分配。
分配完成后,再进行全编译一次,以使管脚分配生效。
7、用下载电缆通过JTAG口将对应的sof文件加载到FPGA中。
观察实验结果是否与自己的编程思想一致。
五、实验结果与现象
当设计文件加载到目标器件后,将时钟设定为1KHz。
交通灯模块的红、绿、黄LED发光管会模拟实际中的交通信号灯的变化。
初始状态为主干道,乡干道红灯全亮,后转换为主干道可行,乡干道禁行模式,此时,数码管上显示通行时间的倒计时为1分钟。
当倒计时到5秒时,黄灯开始闪烁。
频率为2hz。
到0秒时红绿灯开始转换,倒计时的时间变至25秒。
如此循环往复。
按下按键开关S1则从头开始显示和计数。
六、仿真波形分析
1、数码管计数过程在重复1分钟——20秒——1分钟这一计数过程,代表主干道亮绿灯乡干道亮红灯时间为1分钟,主干道亮红灯,乡干道亮绿灯时间为20秒。
2、重复过程
3、当RST=0时,数码管计数恢复初始值60,交通灯恢复初始状态全红。
结果如下所示:
7、实验心得与体会
本次实验中,在观察实验现象时出现了一个问题,那就是当按下复位按钮时,系统会复位到初始状态,即横向全亮红灯,纵向全亮绿灯,但是当持续按下复位按钮不动时,则出现全亮绿灯的情况,这在实际中是不合理的,经分析,可能是在设置复位功能出现了问题,即在复位时,仍然有状态传送给显示模块,整个的模块间仍按照未加复位时进行工作,鉴于此,我又在模块p2、p3模块中增加了一个状态标志,功能为当按下计数模块时,其余工作停止,只进行复位操作,但不按下时,则正常工作。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 交通灯 控制电路