交通灯实验报告.docx
- 文档编号:3503575
- 上传时间:2022-11-23
- 格式:DOCX
- 页数:12
- 大小:64.77KB
交通灯实验报告.docx
《交通灯实验报告.docx》由会员分享,可在线阅读,更多相关《交通灯实验报告.docx(12页珍藏版)》请在冰豆网上搜索。
交通灯实验报告
实验报告
名称:
十字路口交通管理信号灯
姓名:
岳成
学号:
5100309669
班级:
F1003021
日期:
2012.4.4
一、实验目的
1、了解交通灯的状态转换规律,学会用硬件描述语言来建立交通灯的模块。
2、利用该软件进行可编程逻辑器件设计,完成交通灯的逻辑仿真功能。
3、使用编译器将设计实现,下载到JDEE-10实验箱上进行调试和验证所设计的十字路口交通管理信号灯的功能。
二、实验要求
1、用两组点阵分别表示主干道上和支干道上的红绿灯。
红色点阵点亮时,表示红灯;绿色点阵点亮时,表示绿灯;红色和绿色点阵同时点亮时,表示黄灯。
2、用2组数码管(共计4位)显示主、支路交通信号灯的倒计时。
3、主干道上绿灯亮的时间为8秒,闪烁3秒,黄灯亮的时间为2秒,红灯亮的时间为11秒。
支干道上绿灯亮的时间为6秒,闪烁3秒,黄灯亮的时间为2秒,红灯亮的时间为13秒。
4、主干道上绿灯亮和闪烁、黄灯亮共13秒,这时支干道上的红灯一直亮着。
支干道上的绿灯亮6秒、闪烁3秒及黄灯亮2秒,主干道上的红灯亮11秒。
5、主干道上绿灯亮的时间为8秒,数码管显示起始时间7秒,然后依次递减至0,绿灯闪烁3秒,黄灯亮的时间为2秒(这段时间数码管不显示)。
支干道红灯亮的时间为13秒,数码管显示起始时间为12秒,然后依次递减至0。
6、支干道上绿灯亮的时间为6秒,数码管显示起始时间5秒,然后依次递减至0,绿灯闪烁3秒,黄灯亮的时间为2秒(这段时间数码管不显示),主干道红灯亮的时间为11秒,数码管显示起始时间为10秒,然后依次递减至0。
三、设计方案
1、对频率输入的考虑
交通灯等所需的频率只有两种:
1Hz和2Hz。
利用4M频率经过20、21次分频后可得到。
2、对交通灯控制部分的考虑
利用24个状态作为一个周期,可采用真值表法进行列写。
3、建一个七段译码的模块益以及一个点阵显示模块,根据真值表,确立24个状态。
四、程序设计
1、设计思路:
首先,建一个24进制的计数器,每一次计数间隔均为一秒。
对每一秒确立主干道以及支干道上点阵的状态(红灯亮、绿灯亮、绿灯闪烁、黄灯亮)、以及两组数码管上的显示时数(具体数字或熄灭)。
其次进行分步实现:
对于点阵部分,以主干道交通灯为例,输入有时钟信号、二十四进制计数器的输出、红灯信号、绿灯信号、闪烁信号以及发光信号(常亮),输出有红灯显示和绿灯显示两部分。
建立if语句的逻辑关系,根据输入产生相应的输出。
如果输入信号表明此时为红灯显示时间,则输出部分红灯亮而绿灯灭;如果输入信号表明此时为黄灯显示时间,则输出部分红等绿灯都需要点亮;如果输入信号表明此时为红灯闪烁,则还需借助2Hz的时钟信号,当时钟为高电平,绿灯灭;反之则绿灯亮。
对于数码管部分,以主干道交通灯为例,输入有二十四进制计数器的输出和2位时钟信号,因为主干道交通灯倒计时的状态仅仅与当前处在24个状态的哪一个相关。
数码管采用扫描方式,因为最多需要同时显示四位,则需要2位不同频率的高频的时钟信号。
举例来说,当2种信号都为高电平是,则显示个位数据,同时选定第一个数码管,以此类推。
最后对于本次实验暂不使用的二极管接上高电平使其熄灭。
2、程序清单:
24进制计数器count3.tdf
subdesign count3
(
clk:
input;
q[4..0]:
output;
)
variable
count[4..0]:
dff;
begin
count[].clk=clk;
if count[].q==23 then count[].d=0;
else count[].d=count[].q+1;
end if;
q[]=count[];
end;
中央处理模块 main.tdf
subdesign main
(
incount[4..0]:
input;
state[2..0]:
output;
out1[3..0]:
output;
out2[3..0]:
output;
out3[3..0]:
output;
out4[3..0]:
output;
tringle:
output;
digselect1:
output;%总共要点亮四个数码管,两个作为主干道,两个作为支干道%
digselect2:
output;
)
begin
table
incount[4..0]=>state[2..0],out1[3..0],out2[3..0],out3[3..0],out4[3..0],tringle,digselect1,digselect2;
h"0"=>1,h"0",h"7",h"1",h"2",0,1,1;
h"1"=>1,h"0",h"6",h"1",h"1",0,1,1;
h"2"=>1,h"0",h"5",h"1",h"0",0,1,1;
h"3"=>1,h"0",h"4",h"0",h"9",0,1,1;
h"4"=>1,h"0",h"3",h"0",h"8",0,1,1;
h"5"=>1,h"0",h"2",h"0",h"7",0,1,1;
h"6"=>1,h"0",h"1",h"0",h"6",0,1,1;
h"7"=>1,h"0",h"0",h"0",h"5",0,1,1;
h"8"=>2,h"0",h"0",h"0",h"4",1,0,1;%主干道绿灯开始闪烁%
h"9"=>2,h"0",h"0",h"0",h"3",1,0,1;
h"A"=>2,h"0",h"0",h"0",h"2",1,0,1;
h"B"=>3,h"0",h"0",h"0",h"1",0,0,1;%黄灯亮%
h"C"=>3,h"0",h"0",h"0",h"0",0,0,1;
h"D"=>4,h"1",h"0",h"0",h"5",0,1,1;%主干道红灯亮%
h"E"=>4,h"0",h"9",h"0",h"4",0,1,1;
h"f"=>4,h"0",h"8",h"0",h"3",0,1,1;
h"10"=>4,h"0",h"7",h"0",h"2",0,1,1;
h"11"=>4,h"0",h"6",h"0",h"1",0,1,1;
h"12"=>4,h"0",h"5",h"0",h"0",0,1,1;
h"13"=>5,h"0",h"4",h"0",h"0",1,1,0;
h"14"=>5,h"0",h"3",h"0",h"0",1,1,0;
h"15"=>5,h"0",h"2",h"0",h"0",1,1,0;
h"16"=>6,h"0",h"1",h"0",h"0",0,1,0;
h"17"=>6,h"0",h"0",h"0",h"0",0,1,0;
end table;
end;
数码管编码模块 digselector.tdf
subdesign digselector
(
digselect1:
input;%主干道交通灯显示使能信号%
digselect2:
input;%支干道交通灯显示使能信号%
clk:
input;%时钟输入%
clk1:
input;
digin1[3..0]:
input;%主干道十位数字%
digin2[3..0]:
input;%主干道各位数字%
digin3[3..0]:
input;%支干道十位数字%
digin4[3..0]:
input;%支干道个位数字%
out[3..0]:
output;%四个数码管的使能输入%
digout1[3..0]:
output;%主干道的数字输入%
)
begin
if !
clk and !
clk1 and digselect1 then
out[0]=vcc;digout1[3..0] = digin1[3..0];
elsif !
clk and clk1 and digselect1 then
out[1]=vcc;digout1[3..0] = digin2[3..0];
elsif clk and !
clk1 and digselect2 then
out[2]=vcc;digout1[3..0] = digin3[3..0];
elsif clk and clk1 and digselect2 then
out[3]=vcc;digout1[3..0] = digin4[3..0];
end if;
end;
8段译码器:
7segment.tdf
subdesign 7segment
(
i[3..0]:
input;
a,b,c,d,e,f,g,h:
output;
)
begin
table
i[3..0]=>a,b,c,d,e,f,g,h;
h"0"=>0,0,0,0,0,0,1,1;
h"1"=>1,0,0,1,1,1,1,1;
h"2"=>0,0,1,0,0,1,0,1;
h"3"=>0,0,0,0,1,1,0,1;
h"4"=>1,0,0,1,1,0,0,1;
h"5"=>0,1,0,0,1,0,0,1;
h"6"=>0,1,0,0,0,0,0,1;
h"7"=>0,0,0,1,1,1,1,1;
h"8"=>0,0,0,0,0,0,0,1;
h"9"=>0,0,0,0,1,0,0,1;
end table;
end;
点阵显示编码模块 state.tdf
subdesign state
(
instate[2..0]:
input;
inputclk[2..0]:
input;
row[8..1]:
output;
outstate[16..1]:
output;
green:
output;
red:
output;
)
begin
case instate[] is
when 1 =>
table
inputclk[2..0]=>row[8..1],outstate[16..1],green,red;%第一个状态,主干道绿灯亮,支干道红灯亮%
h"0"=>h"1",h"ffff",0,0;
h"1"=>h"2",h"fffb",0,1;
h"2"=>h"4",h"ffff",0,0;
h"3"=>h"8",h"ffdd",1,0;
h"4"=>h"10",h"ffff",0,0;
h"5"=>h"20",h"fffb",0,1;
h"6"=>h"40",h"ffff",0,0;
h"7"=>h"80",h"ffff",0,0;
end table;
when 2 =>
table
inputclk[2..0]=>row[8..1],outstate[16..1],green,red;%第二个状态,主干道绿灯闪烁,支干道红灯亮%
h"0"=>h"1",h"ffff",0,0;
h"1"=>h"2",h"fffb",0,1;
h"2"=>h"4",h"ffff",0,0;
h"3"=>h"8",h"ffdd",1,0;
h"4"=>h"10",h"ffff",0,0;
h"5"=>h"20",h"fffb",0,1;
h"6"=>h"40",h"ffff",0,0;
h"7"=>h"80",h"ffff",0,0;
end table;
when 3 =>
table
inputclk[2..0]=>row[8..1],outstate[16..1],green,red;%第三个状态,主干道黄灯亮,支干道红灯亮%
h"0"=>h"1",h"ffff",0,0;
h"1"=>h"2",h"fffb",0,1;
h"2"=>h"4",h"ffdd",1,1;
h"3"=>h"8",h"ffff",0,0;
h"4"=>h"10",h"ffff",0,0;
h"5"=>h"20",h"fffb",0,1;
h"6"=>h"40",h"ffff",0,0;
h"7"=>h"80",h"ffff",0,0;
end table;
when 4=>
table
inputclk[2..0]=>row[8..1],outstate[16..1],green,red;%第四个状态,主干道红灯亮,支干道绿灯亮%
h"0"=>h"1",h"ffff",0,0;
h"1"=>h"2",h"fff7",1,0;
h"2"=>h"4",h"ffff",0,0;
h"3"=>h"8",h"ffff",0,0;
h"4"=>h"10",h"ffdd",0,1;
h"5"=>h"20",h"fff7",1,0;
h"6"=>h"40",h"ffff",0,0;
h"7"=>h"80",h"ffff",0,0;
end table;
when 5=>
table
inputclk[2..0]=>row[8..1],outstate[16..1],green,red;%第五个状态,主干道红灯亮,支干道绿灯闪烁.%
h"0"=>h"1",h"ffff",0,0;
h"1"=>h"2",h"fff7",1,0;
h"2"=>h"4",h"ffff",0,0;
h"3"=>h"8",h"ffff",0,0;
h"4"=>h"10",h"ffdd",0,1;
h"5"=>h"20",h"fff7",1,0;
h"6"=>h"40",h"ffff",0,0;
h"7"=>h"80",h"ffff",0,0;
end table;
when 6=>
table
inputclk[2..0]=>row[8..1],outstate[16..1],green,red;%第六个状态,主干道红灯亮,支干道黄灯亮%
h"0"=>h"1",h"ffff",0,0;
h"1"=>h"2",h"ffef",1,1;
h"2"=>h"4",h"ffff",0,0;
h"3"=>h"8",h"ffff",0,0;
h"4"=>h"10",h"ffdd",0,1;
h"5"=>h"20",h"ffef",1,1;
h"6"=>h"40",h"ffff",0,0;
h"7"=>h"80",h"ffff",0,0;
end table;
end case;
end;
输出模块 expand.tdf
subdesign expand
(
instate[16..1]:
input;
green:
input;
red:
input;
tringle:
input;
inputclk:
input; %用来闪烁%
dataout1[16..1]:
output;%输出红色%
dataout2[16..1]:
output;%输出绿色%
)
begin
if tringle and green and !
red and inputclk then dataout1[16..1]=h"ffff";
dataout2[16..1]=instate[16..1];
elsif tringle and green and !
red and !
inputclk then dataout1[16..1]=h"ffff";
dataout2[16..1]=h"ffff";
elsif tringle and !
green and red then dataout1[16..1]=instate[16..1];
dataout2[16..1]=h"ffff";
elsif tringle and !
green and !
red then dataout1[16..1]=h"ffff";
dataout2[16..1]=h"ffff";
elsif !
tringle and green and !
red then dataout1[16..1]=h"ffff";
dataout2[16..1]=instate[16..1];
elsif !
tringle and !
green and red then dataout1[16..1]=instate[16..1];
dataout2[16..1]=h"ffff";
elsif !
tringle and green and red then dataout1[16..1]=instate[16..1];
dataout2[16..1]=instate[16..1];
elsif !
tringle and!
green and !
red then dataout1[16..1]=h"ffff";
dataout2[16..1]=h"ffff";
end if;
end;3、顶层逻辑设计图(管脚未锁定)
五、调试过程
应该说调试过程中遇到的最大困难就是让四位数码管正常显示了。
虽然在之前的实验二中有遇到过数码管,但当时只是随着教材依样画葫芦,一知半解,范例也相对简单,只要显示两位即可。
当时自己第一遍做的数码管也只能简单显示两位数字,一用上四位,立刻就乱套了,只有在主/支干道上亮黄灯即单独显示两位数字才正确。
通过一遍又一遍翻阅教材,在了解数码管扫描显示方式后,我明白了只有一位高频时钟信号对于显示4位数字是不够的。
所以我加了频率相近的高频时钟信号,使得在短时期内能顺利扫描4位。
之后的调试结果十分顺利,包括点阵的显示。
虽然在编译过程中,遇到错误,但基本能按照系统提示及时找到错误的根源并改正。
六、实验心得
在数字电路实验课上,我们学习了运用AHDL语言进行简单的逻辑器件编程,并对其语法、功能、应用范围以及其与软件之间的关系有了初步的了解。
俗话说,师傅领进门,修行在自身。
相比实验教材上的三个验证性实验,大作业要求的设计部分有一定难度。
考虑到想进一步提升对LED、点阵以及数码管的运用,我选择了实验四——十字路口交通管理信号灯的控制。
实验的基本要求与增强功能在此不在赘述。
虽然在实践中碰了不少壁,走了许多弯路,但回过头来,觉得收益颇多,不论是纠错能力还是思维的严密性。
是实践出真知,对于工科学生,在求学阶段多动手,多思考,哪怕是多遇到点困难也是非常重要的。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 交通灯 实验 报告