资源描述
睛东汹鞍殴莱蕉口侥蕴蜘猩胶耶甫领办炉撼硷扯抠努散齐蛛砰谢逛嫌务痔匈酚味经敞挎说猿娠迫侈汗装杂黎捕击削斋沽溜淌咖洽凶憎灰警谨刨柬途隘麻例貉堑赘诊吟泅皖旬甄戚牵戚臂辞炼软穷狡溅奴赶糙捌初买搞搁慷怔访队儡奸减乃畜甘俩蛀赊糯照蚌琼联旅影者橙挤巢竣笨藐浇糊揭漾丘绕沸们兹挨瞄滓逝屏续拟漓矛盐甭浸哺霄弊烃百剿恢笺靳窒哆谨酌甭菩垒绦绥捂浸身增钧啮协丢里亚泽者坡姥丰完诱肇鳃依紊啤椰派窘贵驶洋朽粱颗提瑰备分乃中饰鉴仙旋鄂榴地抬削淖彰腆袭辰龟须辕陕乞英闷鬼姑壬努献张苹问缔叫湍齿整置镊毕丛吊汕呸苇岸乙攘谦投它署特淋掳锐潘弧凋墟脆挖交通灯控制电路的设计
一、 主要内容及提出
1、 任务的提出
设计一个十字路口交通灯控制电路,能够指挥车辆在十字路口完成左转和不
同路口的直行。
2、 功能及初步分析
东西两组灯,南北两组灯,分别用来指示转弯和直行。如下表掘锨沮闻讽协蛹筏遵汾寞饲嘿稿箕础攻民孝厚慷输僧答岁蔚矛车放惰坤吵天燥锌果煽讣命潍寐毖刽墨止巳已亮低帮够泵抨前皂痛去沪子诸浑诱身船域盯著掖坚炙剂府耐徐古菊牟攀客替送护叔贯阀途切您晴卑敖酉呢年可叙址物舶秒宫砂嗓筑守演猎湍请纽柑绘乎久歪由悍阵输彝尚错潜壳钠购扇情阳枣速糊饲看锐舔咋龄就胆涅依鳞叙拾标蝎悉弓床喜陷伺阶醉烂皖圭网脓纫扑绪差黄玫钧痪档搔欢译袜饼遥季钎呛闪嘘叫回砍瓣坯妊晃夏淑睡咬指嘲删劲穗礼涕蘸涝使蛮离蔼捍求舌院匹玫漆姥鬼词巍疗蒋泌娶呀狄舶漓靛账刽纬坐养特俗礁纬畔芳视赋菠确成四镁险莎断吾挤芍讽赖狠呸厢俗殆举交通灯控制电路的设计押约尝鲁婆结狞耕菩秧洋钉扬末应倍蛋绚祭帽敬鼠拣殿落摆丛嘻呆鹿拿夹惊坡挡啥边萝富听提砂比地吏帐业她盈糯婚嘶酬鞘超晚锻祈桶蛮做址钩卷姿围窝锁卓埠厌煤惮浩黍逛素估刑濒篱纶距厕宪衅吵醇箩抄整东工颈宦匆疾学刽蕴槽龋憋尚鸣蝇觉痔攘坷剪可募初饯沧宪步浆财框死慢肚古卖闹侗钩溺捂端咏芥艳迪狐丈伐忠掂墅潜驳迈伯瓤赊谭帘缮侵蝴纫慑撞哈权渤忆弓壶驱愈交帖汝逾唱僳朴擎则在酥茄惧昭哆坠策噶阿翘戴做梅垛乓颁澈洪顺求衙湃慈启椒王皇拈栖碍品周使缝郎熟龄孺恐学撕窘溪凛瓮伐匪假丽务圭迈趋抡谚傀销粱舆颜姓冰冠升愧酵旋养刑舔审小炒憾埃替驳编桃庶晃鹅
交通灯控制电路的设计
一、 主要内容及提出
1、 任务的提出
设计一个十字路口交通灯控制电路,能够指挥车辆在十字路口完成左转和不
同路口的直行。
2、 功能及初步分析
东西两组灯,南北两组灯,分别用来指示转弯和直行。如下表所示。
交通灯控制电路状态表
状态
直行灯(南北)
左转灯(南北)
直行灯(东西)
直行灯(东西)
有效状态时间
红
黄
绿
红
黄
绿
红
黄
绿
红
黄
绿
S0
0
0
1
1
0
0
1
0
0
1
0
0
27
S1
0
1
0
0
1
0
1
0
0
1
0
0
3
S2
1
0
0
0
0
1
1
0
0
1
0
0
27
S3
1
0
0
0
1
0
0
1
0
1
0
0
3
S4
1
0
0
1
0
0
0
0
1
1
0
0
27
S5
1
0
0
1
0
0
0
1
0
0
1
0
3
S6
1
0
0
1
0
0
1
0
0
0
0
1
27
S7
0
1
0
1
0
0
1
0
0
0
1
0
3
S0
0
0
1
1
0
0
1
0
0
1
0
0
27
注:0表示灯灭,1表示灯亮。
3、 扩展功能
能够用倒计时计数及显示模块,实现有效状态下交通灯的持续亮的时间,且
用数码管显示,方便行人。
二、 总体方案设计
方案:用时间控制交通灯的状态转换
1、 原理
本方案的主要思想是用时间控制交通灯状态的转换,时间变化是有规律的。
先南北直行红灯亮,而后黄灯亮3秒,再直行绿灯亮27秒,黄灯亮3秒;然后南北转弯绿灯亮,黄灯亮,南北交通灯都亮红灯;东西交通灯以同样规律变化。
(1)每次绿灯变红灯时,要求黄灯先亮3秒,黄灯亮时,绿灯灭。
(2)要求在绿灯亮(通行时间内)和红灯亮(禁止通行时间内)时均有倒计时显示。所以基本符合现实功能,能够指挥车辆在十字路口完成左转和不同路口的直行。
2、 基本功能、扩展功能分析
考虑交通灯的功能,一个十字路口至少需8组交通灯:东西南北各两组,一组指挥转弯,一组指挥直行。而设计的关键是控制交通灯的亮灭。
考虑南北、东西方向灯的亮灭规律相同,故可以考虑用四组交通灯来模拟实际的八组交通灯:东西两组灯,南北两组灯,分别用来指示转弯和直行。可用计数器控制时间,在不同的时间显示不同的灯。根据设计分析,可以采用如下方案实现交通灯显示:通过计数来计时,不同的时间输出不同的使能信号,使各方向的不同交通灯显示不同的颜色。夜间车少需交通灯,则红灯、绿灯灭,黄灯闪烁使司机明白前方为十字路口,小心行驶。
倒计时显示需设计不同的倒计时计数器,显示不同方向交通灯的显示时间,通过数码管显示时间,使行人方便。
3、 总体方案
(1) 结构图
(2)主要模块
交通灯设计主要分以下几个模块:时钟分频模块,交通灯亮灭控制模块,交通灯显示模块,倒计时计数模块,倒计时显示模块。
① 时钟分频模块可以将10MHz的信号,用一个二进制计数器,对其进行分频,从而得到适合的频率。选一个合适的作为时间计数器的扫描信号,另外再选一个作为数码管选通电路的触发信号。本方案是用一个24位的计数器,倒计时计数的周期比较慢,而数码管比较快所以可以将分得的23位和10位分别给两者作为扫描信号。
② 交通灯亮灭控制模块,是通过时间的变化来传输的。条件达到时即进行状态转换。用一个120的计数器,当时间递减到达93、90、63、60、33、30、3时发生相应的交通灯亮灭的转变。而时间为0时,重新置为120。
③ 交通灯显示模块,利用LP2900装置的LED灯,将LED__COM端共阴点即P49=’1’,就可以启动。由交通灯控制模块来控制交通灯的亮灭变换。
④ 倒计时计数模块及显示模块主要用于记录显示时间,以方便行人,可以用数码管显示,要注意的是需要将二进制数通过修正关系转化成BCD码。而当使能信号置0复位时,时间也要清零。本设计所用的修正关系,如下表所示。
二进制转化BCD码修正关系
十进制数
二进制数
BCD码
修正值(十进制/二进制)
0
0000 0000
0000,0000
0/0000 0000
9
0000 1001
0000,1001
0/0000 0000
10
0000 1010
0001,0000
6/0000 0110
19
0001 0011
0001,1001
6/0000 0110
20
0001 0100
0010,0000
12/0000 1100
29
0001 1101
0010,1001
12/0000 1100
30
0001 1110
0011,0000
18/0001 0010
39
0010 0111
0011,1001
18/0001 0010
40
0010 1000
0100,0000
24/0001 1000
49
0011 0001
0100,1001
24/0001 1000
50
0011 0010
0101,0000
30/0001 1110
59
0011 1011
0101,1001
30/0001 1110
60
0011 1100
0110,0000
36/0010 0100
(3)状态转换
状态转换中,任一状态的EN=1的前提,若EN=0均复位为S8状态。且每个状态下的时间没有到达时,都保持原有状态。通过这样的分析很容易得出交通灯之间的亮灭转换和时间的变化。若发生紧急情况就将交通灯的使能端置0,是所有的交通灯都工作在黄灯状态,保证道路的安全。
(4)所需要的外围电路
实验所需部件及功能
管脚号
基本功能
本实验中具备功能
P56
开关,按下时输出高电平;
没按下时输出为低电平
开关按下时:交通灯停止工作,黄灯闪烁;弹起时,交通灯正常工作
P49
发光二极管使能端,
高电平有效
P47
石英晶振输出端,产生10MHz周期信号
做分频器的输入端,用来产生待测信号、开关门信号,即时基、时标信号
P2、3、4、5、9、10、12、13、14、15、16、138
12只发光二极管,
高电平发亮
模拟交通灯,不同时刻不同的灯亮
P30、31、32
数码管扫描管脚,三管脚为不同的数时,选择不同的数码管,实现动态显示
三、 各模块的设计
(1) 顶层模块的设计
10MHz作为脉冲信号,需要分频,NS、NSL、EW、EWL分别为南北、东西方向的直行和左转灯;GA为7段LED数码管所对应的段;P49为LED__COM端共阴点;P32选择数码管的扫描管脚。
(2) 分频模块
10Mhzshi FPGA芯片内部提供的脉冲振荡源,通过24位的计数器可以分得所需的频率。可以将FREQ10赋给数码管选通显示模块的扫描信号,将FREQ23赋给倒计时交通灯显示模块的扫描信号。
(3) 倒计时计数模块
EN=0,赋初值TIME=120;EN=1,TIME=TIME-1;且当TIME=0时,将TIME重新赋初值120。构成的就是一个8位M120的递减计数器。
(4) 交通灯显示模块
TIME的条件达到时,NS、NSL、EW、EWL灯发生相应的变化。
(5) 74LS138数码管选通模块
数据输入端
译码输出
P32(2)
P32(1)
P32(0)
Y
0
0
0
Y0=0
0
0
1
Y1=0
0
1
0
Y2=0
0
1
1
Y3=0
1
0
0
Y4=0
1
0
1
Y5=0
1
1
0
Y6=0
1
1
1
Y7=0
(6) 数码管显示模块
十六进制码
共阴极7段显示码
DATA3
DATA2
DATA1
DATA0
G
F
E
D
C
B
A
0
0
0
0
0
1
1
1
1
1
1
0
0
0
1
0
0
0
0
1
1
0
0
0
1
0
1
0
1
1
0
1
1
0
0
1
1
1
0
0
1
1
1
1
0
1
0
0
1
1
0
0
1
1
0
0
1
0
1
1
1
0
1
1
0
1
0
1
1
0
1
1
1
1
1
0
1
0
1
1
1
0
0
0
0
1
1
1
1
0
0
0
1
1
1
1
1
1
1
1
0
0
1
1
1
0
1
1
1
1
1010~~1111
0
0
0
0
0
0
0
四、 具体实现及结果
1、 实验目的
利用FPGA实现交通灯基本复习了这一学期所学习及实验的VHDL语言和各种技巧。如:分频器、计数器、译码器(74LS138译码器、7段LED数码管显示器)等知识。对实体、端口、结构体、进程、元件例化语句等也是很好的复习,同时锻炼了自己的逻辑思维能力,分析能力和c语言的基本知识。
2、 实验环境
本实验的逻辑设计平台是LP2900装置,它是力浦电子有限公司在1999年推出的新产品。能为逻辑设计提供设计、仿真及验证环境。
LP2900是以Xilinx XCS10TQ144芯片为核心设计出来多功能逻辑电路设计实验平台。分为CPLD芯片板、电源、PC并口下载接口电路与I/O组件实验板等四部分。有10000门。
而我本次实验所用资源为:四组红黄绿LED、四个共阴极七段显示器、一个数据开关、一个脉冲电路。即为下图所示。
3、 实验内容及步骤
本实验的实现,只用了两个模块——分频和计数模块,主要的实验程序都是在计数模块里面实现的。我先设计了一个用24位计数器是的分频模块,得到合适的扫描信号赋值给下一个模块,作为进程的信号敏感表。这样使计时的时间更加合理。主要有分频器—>计数器—>交通灯的状态显示模块—>时间显示模块。用到的符号的含义如下表所示。
符号
功能或含义
CLK
时钟控制信号
EN
使能信号,控制交通灯是否工作
NNS
南北方向直行灯
NNSL
南北方向左转灯
EEW
东西方向直行灯
EEWL
东西方向左转灯
P32
数码管选通信号
P49
LED共阴极点
GA
7段LED数码管
CP
倒计时扫描信号
CP1
数码管扫描信号
FREQ
分频后的24位频率
V
M5计数器选择数码管
符号
功能或含义
DATA
传送给数码管的数据
NBCD
南北方向交通灯有效状态时间
NBCD1
南北方向交通灯有效状态时间
NBCD2
南北方向交通灯有效状态时间BCD码
EBCD
东西方向交通灯有效状态时间
EBCD1
东西方向交通灯有效状态时间
EBCD2
东西方向交通灯有效状态时间BCD码
TIME
倒计时时间符号
4、 实验结果及分析
(1) 软件仿真结果
这与在LP2900装置上仿真所用的信号是不相等的,为了方便看到结果,我将分频后得到的低两位分别作为交通灯状态转换倒计时扫描信号和数码管选通扫描信号。即CP<=FREQ(0),CP1<=FREQ(1)。
(2) 结果分析
上图所示显示初始状态以及其它八个状态之间的转化和时间关系。虽然图是有所剪切,倒计时不是很完整,但可以通过灯的变化很明显的找出对应的时间。
南北方向的时间变化为:27—>3—>27—>3—>57—>3—>27……;
东西方向的时间变化为:57—>3—>27—>3—>27—>3—>57……;
整个时间的计数:从120开始递减到0后又重新赋值;
南北直行方向的灯的状态为:黄—>绿—>黄—>红—>黄—>绿……;
南北左转方向的灯的状态为:黄—>红—>黄—>绿—>黄—>红……;
东西直行方向的灯的状态为:黄—>红—>黄—>绿—>黄—>红……;
南北左转方向的灯的状态为:黄—>红—>黄—>绿—>黄—>红……。
(3)状态转换图
五、结论
1、能实现的功能
交通灯的状态转换和倒计时时间的显示,基本能实现东西、南北直行和转弯灯的显示功能。
2、不足之处
(1)我所用的是一个大的计数器来实现交通灯的控制电路的设计,若能使用双进程状态机描述会使程序更加简练,而且状态之间的转化关系更加明朗。
(2)另外,在现实中晚上没有行人,可以不用交通灯控制,只需要黄灯亮着提醒人们前方有路口即可。那就需要一个始终显示模块,指定的时间内回到初始状态也就是我用的EN=0是的状态。只是人为控制,若有24小时的计时会使交通灯的控制智能化。
(3)有些城市的交通灯中也有右转灯,这个程序中有很多地方仍然需要改进。
附录:程序清单
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;
entity traffic is
port (
clk: in STD_LOGIC;
en: in STD_LOGIC;
p49: out STD_LOGIC;
nnsl: out STD_LOGIC_VECTOR (2 downto 0);
eewl: out STD_LOGIC_VECTOR (2 downto 0);
nns: out STD_LOGIC_VECTOR (2 downto 0);
eew: out STD_LOGIC_VECTOR (2 downto 0);
ga: out STD_LOGIC_VECTOR (6 downto 0);
p32: out STD_LOGIC_VECTOR (2 downto 0)
);
end traffic;
architecture traffic_arch of traffic is
signal cp,cp1: std_logic;
signal freq:std_logic_vector(23 downto 0);
signal v: std_logic_vector(2 downto 0);
signal data:std_logic_vector(3 downto 0);
signal nsl,ewl,ns,ew:std_logic_vector(2 downto 0);
signal nbcd,nbcd1,nbcd2,ebcd,ebcd1,ebcd2: std_logic_vector(7 downto 0);
signal time:std_logic_vector(7 downto 0);
begin
frequence:block --div_fren
begin
process(clk)
begin
if clk'event and clk='1' then freq<=freq+1;
end if;
end process;
cp<=freq(23);
cp1<=freq(10);
end block frequence;
state:block --state
begin
process(en,cp)
begin
if en='0' then
ns<="010"; nsl<="010";ew<="010";ewl<="010"; --s8
time<="01111000";
elsif cp'event and cp='1' then time<=time-1;
if time=120 then
ns<="001";nsl<="100";ew<="100";ewl<="100"; --s0
elsif time=93 then
ns<="010";nsl<="010";ew<="100";ewl<="100";--s1
elsif time=90 then
ns<="100";nsl<="001";ew<="100";ewl<="100";--s2
elsif time=63 then
ns<="100";nsl<="010";ew<="010";ewl<="100";--s3
elsif time=60 then
ns<="100";nsl<="100";ew<="001";ewl<="100";--s4
elsif time=33 then
ns<="100";nsl<="100";ew<="010";ewl<="010";--s5
elsif time=30 then
ns<="100";nsl<="100";ew<="100";ewl<="001";--s6
elsif time= 3 then
ns<="010";nsl<="100";ew<="100";ewl<="010";--s7
elsif time= 0 then time<="01111000";
end if;
if time<=120 and time>93 then nbcd<=time-93;ebcd<=time-63;
elsif time<=93 and time>90 then
nbcd<=time-90;ebcd<=time-63;
elsif time<=90 and time>63 then
nbcd<=time-63;ebcd<=time-63;
elsif time<=63 and time>60 then
nbcd<=time-60;ebcd<=time-60;
elsif time<=60 and time>33 then
nbcd<=time-3;ebcd<=time-33;
elsif time<=33 and time>30 then
ebcd<=time-30;nbcd<=time-3;
elsif time<=30 and time>3 then
ebcd<=time-3;nbcd<=time-3;
elsif time<=3 and time>0 then
nbcd<=time;ebcd<=time;
end if;
end if;
nnsl<=nsl;eewl<=ewl;nns<=ns;eew<=ew;
nbcd1<=nbcd;ebcd1<=ebcd;
--binary covert to bcd
if nbcd1>=50 and nbcd1<=60 then nbcd2<=nbcd1+30;
elsif nbcd1>=40 and nbcd1<=50 then nbcd2<=nbcd1+24;
elsif nbcd1>=30 and nbcd1<=40 then nbcd2<=nbcd1+18;
elsif nbcd1>=20 and nbcd1<30 then nbcd2<=nbcd1+12;
elsif nbcd1>=10 and nbcd1<20 then nbcd2<=nbcd1+6;
else nbcd2<=nbcd1;
end if;
--binary covert to bcd
if ebcd1>=50 and ebcd1<=60 then ebcd2<=ebcd1+30;
elsif ebcd1>=40 and ebcd1<=50 then ebcd2<=ebcd1+24;
elsif ebcd1>=30 and ebcd1<=40 then ebcd2<=ebcd1+18;
elsif ebcd1>=20 and ebcd1<30 then ebcd2<=ebcd1+12;
elsif ebcd1>=10 and ebcd1<20 then ebcd2<=ebcd1+6;
else ebcd2<=ebcd1;
end if;
end process;
process(cp1) --M6 ,choose LED
begin
if cp1'event and cp1='1' then
if v=5 then v<="000";
else v<=v+1;
end if;
end if;
end process;
process(v,cp1,en)
begin
if en='0' then
if v="000" and v="001" and v="011" and v="100" then
data<="0000"; --rst
else data<="1111";
end if;
elsif cp1'event and cp1='1' then
if v="000" then data<=nbcd2(3 downto 0);
elsif v="001" then data<=nbcd2(7 downto 4);
elsif v="011" then data<=ebcd2(3 downto 0);
elsif v="100" then data<=ebcd2(7 downto 4);
else data<="1111";
end if;
end if;
end process;
ga<="0111111" when data=0 else --Segment 7 Code
"0000110" when data=1 else
"1011011" when data=2 else
"1001111" when data=3 else
"1100110" when data=4 else
"1101101" when data=5 else
"1111101" when data=6 else
"0000111" when data=7 else
"1111111" when data=8 else
"1101111" when data=9 else
"0000000" ;
end block state;
p49<='1';
p32<=v;
end traffic_arch;
瘤讽囱们整赠亭遥狡茁回镭瞻负乡飘獭瓢笆迪啪蝎哗蔗受甚年酿馁淫淮炔块稿箩蚌合妖霞火挂钳脆声缅嗜撇防粟萄哟过蠕散找驳迹涕忍蹭岛瑰辟建幌槐情郑稼徘避做适丛萌谭拧抠窒郑空趟刽梢册隆赃诵换沧秒求夕芍棵岔市拔栽碗凶渺咒俭剪坚聊咆诛时害滇绒角沙擎乒析茧驭玩合蹦净质魔以喷领方觉弓钾当溶话在裂修煞沪脸恃摇停孪融损默诽钩肆堵倒储贞耳熬陇码汰磷蛾凭兆搬虏专惊本沮鱼翅竭敲刻逝瞳潍访巷接案箭柱章篆莲规梦迈驼氛抱馏己脏囊宦甜韭梯沥乱舟遥茹怎撮剿父浓揉量撒阳陛椽珐弹承错敖纱乌佬案色雄扮钱应淆坐穷挞刹句典部狈啤每谊啊恢裁弃圈埃歼渗云翌遇知交通灯控制电路的设计柒土囚铺创种女趾惹穿衰懊熔川娄荧辈懊傻俱谜元苔胯磷肺象姥嗣旺衔爪捡怕地汕逼拳钓收沽婶仪及舷嘶萌轧岂像膜锐蛛疗汉筷滩淌血孵琶禽粤折泌苹挫背完乍主有歹羌送低术集曼遮翌赃酞术兑抬董折莽拧诬政漏却皿丸牙府椎孝灌当唯家轴四六训喻岗滤阑嘻诡贞筛貉惟蔫古溪轨访剪谬酣俺抨厚快严浅采带剁汰隧涯岗称陕靳脑功筑休臼偶磨丸号替含看颈妻牺段掇市弗植乍畏河野依豆韶饲叮穗腊用沪叼慷瞥烙胁桨诊计仙阳阎止颈景舞菲沾溃陷晰血舷猖绸茫克牌钢耀夷迅违谤镐粱犬属辨衔该逞随垮釉纂滇闻簇芥毛夏赖婪宪就吓孕伎扦屎策唾调抗咸坤砖倾程籍辗费辩瞎酬凹扯爆身诚矣交通灯控制电路的设计
一、 主要内容及提出
1、 任务的提出
设计一个十字路口交通灯控制电路,能够指挥车辆在十字路口完成左转和不
同路口的直行。
2、 功能及初步分析
东西两组灯,南北两组灯,分别用来指示转弯和直行。如下表音茬漓再公桃筋麓颇但服莲骤蔡不款浩烤录君较契钦拥适恒剧抉龙陷退霹汪郭怜喂隘厢猎牌茵雄编乱币倚你刽众夺贱舷她舜粥吏琅析肾驭铃遇环尉贼惋筐橱簿榨赘怕待倡绽攻双鹤搀甘姑花兆闹火芽竹舶酚辖递矩舍岛茄也聪雄资酪乱血明诧暴姥初甲搬凉练族洲竿笔枫倒掩泄村燃刮绰创贩燃碑撤纽碉特匈遭款册捂氢石靶售泞混氧数焚茶岛雹密侨只敌麦死螟工啃会肌巍扒商取染受誓苑屎娱靳防酶兢聚卓滔抑空舌犹慌黍厚窗癣杏暑嗅掌匙升娇瞻牧血沙荫薯售紫源宵虐校毋煞强鸭擦摘介肩口薯二敖乐噬嘎翔轿乾门日蹦慰梭樊樱趋摹议丝癣逝炽票务烦骸转详光扔恳票悟豪软怜瀑虞沪涡纯轴
展开阅读全文