版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
XXXXXX学院题目:基于FPGA的交通灯控制课程设计学院:信息工程学院班级:设计人:指导教师:设计时间:2016年6月16日目录一.摘要1二.概述11.FPGA的应用1三.系统总体设计21.设计任务22.系统设计流程2四.硬件设计41.控制模块52.时钟分频模块53.分位译码模块54.计数模块6五.实验程序设计6六.程序仿真与分析131.仿真结果132.仿真结果分析14七.心得体会14八.参考文献15九.附录15Hold倒计时数字及‘闪烁控制信号’七段数码管七段数码管驱动电路Reset分频电路分位译码电路红、黄、绿发光二极管控制器计数器Hold倒计时数字及‘闪烁控制信号’七段数码管七段数码管驱动电路Reset分频电路分位译码电路红、黄、绿发光二极管控制器计数器在FPGA设计描述中,采用自顶向下的设计思路,该思路,首先要描述顶层的接口,上面的描述已经规定了交通灯控制的输入输出信号:输入信号:复位开关信号reset;外部时钟信号clk。LED七段显示数码管的输出信号count1(6
downto
0),count2(6
downto
0),count3(6
downto
0),count4(6
downto
0);在自顶向下的VHDL设计描述中,通常把整个设计的系统划分为几个模块,然后采用结构描述方式对整个系统进行描述。根据实验设计的结构功能,来确定使用哪些模块以及这些模块之间的关系。通过上面的分析,不难得知可以把交通灯控制系统划分为4个模块:时钟分频模块,计数模块,控制模块,分位译码模块。时钟分频模块:把555多谐振荡器发出的较高频率脉冲用分频电路的到较第频率的时钟信号,本电路通过三次10分平分别得到10Hz、1Hz的时钟信号。
控制器电路:根据计数器的计数值控制发光二极管的亮、灭,以及输出倒计时数值给七段译码管的分位译码电路。当检测到手动控制信号(Con=’1’)时,执行手动控制;
计数器电路:这里需要的计数器的计数范围为0~89。计到89后,下一个时钟沿升为1时,开始下一轮计数,此外当系统复位信号(Reset=’1’)使计数器异步清‘0’。手动信号(Con=’1’)使系统清‘0’。
分位译码电路:因为控制器输出的倒计时数值可能是1位或者2位十进制数,所以在七段数码管的译码电路前要加上分位电路(即将其分为2个1位的十进制数,如20分为2和0,7分为0和7)。七段数码管的译码电路根据控制电路的控制信号,驱动交通灯的显示,通过输入二进制数值,输出信号点亮二极管,我们用的是共阳极数码管,因此译码电路输出逻辑数值‘0’点亮二极管,译码电路输出逻辑数值‘1’熄灭二极管。四.硬件设计1.控制模块控制模块的作用是根据计数器的数值控制发光二极管的亮、灭,以及输出倒计时数值给七段数码管的分位译码电路。此外,当检测到特殊情况(EMI=‘1’)发生时,无条件点亮红灯的二极管(急救灯按下EMI='1',则东西南北都亮红灯,在这种状态下原来的状态必须保持,即东西南北方向定时时间保持不变。急救灯未按下或者按下后恢复,则继续计时(计时通过计数器ct),同时恢复东西南北原来灯的状态)。2.时钟分频模块分频器实现的是将高频时钟信号转换成低频时钟信号,用于触发控制器、计数器和扫描显示电路。将频率变为1Hz的脉冲波,从而得到周期为1s的脉冲波。3.分位译码模块(1)因为控制输出的倒计时数值可能是1位或2位十进制数,所以七段数码管的译码电路前要加上分位电路(即将其分为两个1位的十进制数,如25分为2和5)。(2)分位模块输出的计数值将十位数和个位数分别存到数组里,这样就可以得到两个路口倒计时时间显示的十位和个位信号。4.计数模块实现计数为0-80计数,计数到80后,下一个时钟沿回复到0,开始下一计数。此外当检测到特殊情况(hold=“1”)发生时,计数器暂停计数,无条件点亮红色的发光二极管。而系统复位信号Reset则使计数器异步清零。五.实验程序设计1.顶层模块library
ieee;
use
ieee.std_logic_1164.all;
use
ieee.std_logic_unsigned.all;
entity
dingceng
is
port(clkd,resetd,cond,con1d:in
std_logic;
count1:out
std_logic_vector(6
downto
0);—七段数码管显示
count2:out
std_logic_vector(6
downto
0);—七段数码管显示
count3:out
std_logic_vector(6
downto
0);—七段数码管显示
count4:out
std_logic_vector(6
downto
0);—七段数码管显示
reda,yellowa,greena,lifta:outstd_logic;—a发光二极管输出
redb,yellowb,greenb,liftb:outstd_logic);—b发光二极管输出
end
entity
dingceng;
architecture
one
of
dingceng
is
2.实体定义componentclk_10—脉冲输入port(clk:in
std_logic;)--时钟频率为250KHz.
clk_div10
:
out
std_logic);--十分频后脉冲输出
end
component;
component
counter3.计数模块port
(clk0:in
std_logic;)--脉冲信号输入
con:in
std_logic;--手动控制信号
reset:in
std_logic;--复位信号
countnum:bufferinteger
range
0to89);--0-89计数输出。
end
component;
a4.控制模块component
controller
port
(
clk1
:
in
std_logic;)--脉冲信号输入
con1
:
in
std_logic;--手动控制信号
con2:
in
std_logic;--状态控制信号countnum
:
in
integer
range
0
to
89–0-89计数输入;
numa,numb
:
out
integer
range
0
to
25;--东西、南北两个方向的倒计时数值输出
ra,ga,ya,la:
out
std_logic);--ra,ga,ya,la发光二极管输出
rb,gb,yb,lb:
out
std_logic);--rb,gb,yb,lb发光二极管输出
end
component;
a5.分位模块component
fenwei
port
(
numin:in
integer
range
0
to
25;--倒计时数值输入
numa,numb:out
integer
range
0
to
9
);--将数值分为2个1位的十进制输出
end
component;
component
yima
port(clk2:in
std_logic;
bb:
in
integer
range
0
to
9;
ya:out
std_logic;--BCD码输出
yb:out
std_logic;--BCD码输出
yc:out
std_logic;--BCD码输出
yd:out
std_logic;--BCD码输出
ye:out
std_logic;--BCD码输出
yf:out
std_logic;--BCD码输出
yg:out
std_logic);--BCD码输出
end
component;
signal
a,b,c,d:std_logic;
signal
ww:integer
range
0
to
89;
signal
yy1,yy2:integer
range
0
to
25;
signal
tt1,tt2,tt3,tt4:integer
range
0
to
9;
begin
u0:
clk_10
port
map(clk=>clkd,clk_div10=>a);
u1:
clk_10
port
map(clk=>clkd,clk_div10=>b);
u2:
clk_10
port
map(clk=>b,clk_div10=>c);
u3:counter
port
map(clk0=>c,con=>cond,reset=>resetd,countnum=>ww);
u4:controller
port
map
(clk1=>c,con1=>cond,con2=>con1d,countnum=>ww,numa=>yy1,numb=>yy2,ra=>reda,ga=>greena,ya=>yellowa,ga1=>greena1,rb=>redb,gb=>greenb,yb=>yellowb,gb1=>greenb1);
u5:fenwei
port
map(numin=>yy1,numa=>tt1,numb=>tt2);
u6:fenwei
port
map
(numin=>yy2,numa=>tt3,numb=>tt4);
u7:yima
port
map(clk2=>b,bb=>tt1,ya=>count1(0),yb=>count1(1),yc=>count1(2),yd=>count1(3),ye=>count1(4),yf=>count1(5),yg=>count1(6));
u8:yima
),yf=>count2(5),yg=>count2(6));
u9:yima
3(4),yf=>count3(5),yg=>count3(6));
u10:yima
4(4),yf=>count4(5),yg=>count4(6));
end
architecture
one;b1.实体定义library
ieee;
use
ieee.std_logic_1164.all;
use
ieee.std_logic_arith.all;
use
ieee.std_logic_unsigned.all;
entity
clk_10
is--脉冲输入
port(
clk
:
in
std_logic;--时钟频率为250KHz
clk_div10
:
out
std_logic);--十分频后脉冲输出
end
clk_10;--脉冲输出
architecture
one
of
clk_10
is
signal
clk_temp
:
std_logic;
begin
process(clk)
variable
counter
:
std_logic_vector(2
downto
0);
constant
md
:
std_logic_vector(2
downto
0)
:=
"101";
begin
if(clk'event
and
clk='1')
then
if(counter
=
md)then
counter
:=
(others
=>'0');
clk_temp
<=
not
clk_temp;
end
if;
counter
:=
counter
+
1
;
end
if;
end
process;
port
map(clk2=>b,bb=>tt4,ya=>count4(0),yb=>count4(1),yc=>count4(2),yd=>count4(3),ye=>countport
map(clk2=>b,bb=>tt3,ya=>count3(0),yb=>count3(1),yc=>count3(2),yd=>count3(3),ye=>countport
map
(clk2=>b,bb=>tt2,ya=>count2(0),yb=>count2(1),yc=>count2(2),yd=>count2(3),ye=>count2(4)clk_div10
<=
clk_temp;
end
one;b2.计数模块
library
ieee;
use
ieee.std_logic_1164.all;
entity
counter
is
port
(
clk0:in
std_logic;)--脉冲信号输入
con:in
std_logic;--手动控制信号
reset:in
std_logic;--复位信号
countnum:buffer
integer
range
0
to
89);--复位信号
end
counter;
architecture
one
of
counter
is
begin
process
(reset,clk0)
begin
if
reset='1'
then
countnum
<=
0;
elsif
rising_edge(
clk0
)
then
if
con='1'
then
countnum
<=
0;
else
if
countnum=89
then
countnum
<=
0;
else
countnum
<=
countnum
+
1;
end
if;
end
if;
end
if;
end
process;
end
one;b3.控制模块library
ieee;
use
ieee.std_logic_1164.all;
use
ieee.std_logic_unsigned.all;
entity
controller
is
port
(
clk1
:
in
std_logic;)--脉冲信号输入
con1
:
in
std_logic;--手动控制信号
con2:
in
std_logic;--状态控制信号countnum
:
in
integer
range
0
to
89–0-89计数输入;
numa,numb
:
out
integer
range
0
to
25;--东西、南北两个方向的倒计时数值输出
ra,ga,ya,la:
out
std_logic);--ra,ga,ya,la发光二极管输出
rb,gb,yb,lb:
out
std_logic);--rb,gb,yb,lb发光二极管输出
end
component;
end
controller;
architecture
one
of
controller
is
signal
m
:
integer
range
0
to
7;
begin
process
(
clk1,con1,con2,countnum
)
variable
aa:std_logic_vector(7
downto
0);
begin
if
(clk1'event
and
clk1
=
'1'
)then
if
con1
='0'
then
if
countnum
>=
65then
numb<=90-countnum;
numa
<=90-countnum;
if
countnum
>=
70
then
aa
:=
"00011000";
else
aa
:=
"00101000";
numa<=
70-countnum;
end
if;
elsif
countnum
>=
45
then
numb
<=
65-countnum;
numa
<=65-countnum;
if
countnum
>=
50
then
aa
:=
"10000100";
else
aa
:=
"10000010";
numb<=
50-countnum;
end
if;
elseif
countnum
>=
20
then
numa
<=
45-countnum;
numb
<=45-countnum;
if
countnum
>=
25
then
aa
:=
"01001000";
else
aa
:=
"00101000";
numa
<=
25-countnum;
end
if;
elsif
countnum
>=
0
then
numa
<=
20-countnum;
numb
<=
20-countnum;
if
countnum
>=
5
then
aa
:=
"10000100";
else
aa
:=
"10000010";
numb
<=
5-countnum;
end
if;
end
if;
else
if
con1=
'1'
the
numa
<=
0;
numb
<=
0;
if
con2
=
'1'
then
if
m
=
7
then
m
<=
0;
else
m
<=
m
+
1;
end
if;
end
if;
if
m
=
0
then
aa
:=
"01001000";
elsif
m=
1
then
aa
:=
"00101000";
elsif
m=2
then
aa
:="10000100";
elsif
m=3
then
aa
:=
"10000010";
elsif
m=4
then
aa
:=
"00011000";
elsif
m=5
then
aa
:=
"00101000";
elsif
m=6
then
aa
:=
"10000001";
elsif
m=7
then
aa
:=
"10000010";
end
if;end
if;end
if;end
if;ra
<=
aa(7);ga<=
aa(6);ya<=
aa(5);
ga1<=aa(4);
rb<=aa(3);gb<=aa(2);yb<=aa(1);
gb1<=aa(0);
endprocess;endone;
b4.分位模块libraryieee;
use
ieee.std_logic_1164.all;
entity
fenwei
is
port
(
numin:in
integer
range
0
to
25;--倒计时数值输入
numa,numb:out
integer
range
0
to
9
);--将数值分为2个1位的十进制输出end
fenwei;--倒计时输出
architecture
one
of
fenwei
is
begin
process(
numin
)
variable
numa1,numb1:
integer
range
0
to
9;
begin
if
numin
>=
20
then
numa1
:=2;
numb1
:=
numin
-
20;
elsif
numin
>=
10
then
numa1
:=
1;
numb1
:=
numin
-
10;
else
numa1
:=
0
;
numb1
:=
numin
;
end
if
;
numa
<=
numa1;
numb
<=
numb1;
end
process
;
end
one
;
bb[3..0]--BCD码输入clk2—脉冲输入
ya,yb,yc,yd,ye,yf,yg—七段数码管显示输出5.译码模块library
ieee;
use
ieee.std_logic_1164.all;
entity
display
is
port(
clk2:in
std_logic;
bb:
in
std_logic_vector(3
downto
0);--BCD码输入ya:out
std_logic;--七段数码管显示输出
yb:out
std_logic;--七段数码管显示输出yc:out
std_logic;--七段数码管显示输出yd:out
std_logic;--七段数码管显示输出
ye:out
std_logic;--七段数码管显示输出
yf:out
std_logic;--七段数码管显示输出yg:out
std_logic);--七段数码管显示输出end
display;
architecture
one
of
display
issignal
temp:
std_logic_vector(6
downto
0);
--BCD码输入begin
process(bb)
begin
case
bb
is
when
"0000"
=>
temp
<=
"1000000";
when
"0001"
=>
temp
<=
"1111001";
when
"0010"
=>
temp
<=
"0100100";
when
"0011"
=>
temp
<=
"0110000";
when
"0100"
=>
temp
<=
"0011001";
when
"0101"
=>
temp
<=
"0010010";
when
"0110"
=>
temp
<=
"0000010";
when
"0111"
=>
temp
<=
"1011000";
when
"1000"
=>
temp
<=
"0000000";
when
"1001"
=>
temp
<=
"0010000";when
others
=>
temp
<=
"1111111";
end
case;
end
process;ya<=temp(0);
yb<=temp(1);
yc<=temp(2);
yd<=temp(3);
ye<=temp(4);
yf<=temp(5);
yg<=temp(6);
end
one;六.程序仿真与分析1仿真结果利用QUARTUSⅡ软件对本程序进行编译,生成了可以进行仿真定时分析以及下载到可编程器件的相关文件。仿真结果如图所示:2仿真结果分析通过设定clk值以及start和EMI的初值,就可以得到仿真波形图。EMI高电平信号输入时,所有交通灯都变成红灯状态。由仿真波形图还可以清楚的看出各时间段每个交通灯的状态。要得到正确的仿真波形图就不许设定合适的时间信号clk值。如果clk值设置的太小则交通灯状态变化的太快无法分辨,如果clk值设置的太大则交通灯状态转换缓慢,效果不明显。其次,要设定start初值,如果没有设定start初值就不可能触发而得到仿真图。最后,就是要设置一EMI高电平信号来检测紧急情况下的交通灯的状态。七.心得体会通过这次的FPGA课程设计,我发现了自己的很多不足,发现了很多知识上的漏洞,同时也看到了自己的实践经验还是比较缺乏,理论联系实际的能力还需提高。这次课程设计让我学到了很多,不仅巩固了先前学的FPGA技术的理论知识,而且也培养了我的动手
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 风险预警与应对管理策略
- 智慧物流园区智能化管理平台推广计划
- 智能安防系统城市安全监管项目实施计划书
- 专线接入服务合同
- 哪吒闹海的神话传说读后感
- 智慧仓储与配送一体化建设方案
- 中高职一体化人才培养质量评价标准开发与设计
- 施工现场管理规章制度
- 高科技产业园区投资合同
- 2025版五星级酒店总经理任期制聘用合同3篇
- TZJXDC 002-2022 电动摩托车和电动轻便摩托车用阀控式铅酸蓄电池
- GB/T 4744-2013纺织品防水性能的检测和评价静水压法
- GB/T 337.1-2002工业硝酸浓硝酸
- 《解放战争》(共48张PPT)
- 放射工作人员法律法规及防护知识培训考核试题附答案
- 劳动仲裁追加申请申请书(标准版)
- 西方法律思想史 课件
- 各种绿色蔬菜收货验收作业标准和蔬菜品质标准课件
- 内蒙古乌兰察布市市药品零售药店企业药房名单目录
- 叉车年度检表
- 试生产方案确认表(各单位会签)
评论
0/150
提交评论