基于FPGA的(带有紧急情况处理的)交通灯控制器的设计

发布时间:2019-01-17 05:56:44   来源:文档文库   
字号:

学号成绩

评语

《现代数字系统设计》课程论文

题目基于FPGA(带有紧急情况处理的交通灯控制器的设计

作者班级

院别信息与通信工程专业电子信息工程完成时间 2011512

目录

1 概述 (2

1.1 交通灯控制器的简介 (2

1.2论文主要完成的工作 (2

2 系统硬件设计 (2

2.1系统设计方案 (2

2.2 主控模块 (3

2.2.1 FPGA简介 (3

2.2.2 主控芯片ACEX1K 系列的EP1K10TC100-3的介绍: (4

2.3 显示模块 (4

2.3.1 发光二极管简介 (4

2.3.2 八段数码管简介: (4

3 系统软件设计 (5

3.1 软件整体设计 (5

3.2 控制模块 (6

3.2.1 交通灯状态机、倒计时 (6

3.2.2 交通灯主要模块的状态机及倒计时的流程图(PFD (7

3.3 显示模块 (8

4 系统测试与总结 (9

4.1 系统测试结果 (9

4.2本次设计的心得体会 (9

参考文献 (10

附录 (11

1. 控制模块源程序 (11

2. 显示模块源程序 (13

1 概述

1.1 交通灯控制器的简介

如今是个现代化的社会,交通灯在日常生活中起着至关重要的作用。交通灯是城市交通监管系统的做要组成部分,为管理交通工具和行人的动向,保障道路安全通畅的一类固定不动的必不可少的工具。在今天,交通灯控制器安装在各个路口上,它成为疏通交通最常见最有效的手段。

基于FPGA的交通灯设计方法具有设计的灵活性,易于修改,设计周期短等纵多优点。随着设计语言、电子设计自动化和FPGA期间的不断发展,基于FPGA 期间的不断完善和发展。在不远的将来。由FPGA设计的产品将越来越普遍。而此次交通灯控制器的设计采用基于Verilog HDL语言和FPGA的方法来实现所要求的功能。

1.2论文主要完成的工作

设计一个交通灯控制器,模拟现实生活中的交通灯,并能对紧急情况作出处理。

对系统进行模块划分、定义各模块的具体功能。再用Verilog HDL语言编写程序实现各个模块应有的功能。

创建顶层文件,搭建电路,下载到FPGA芯片中。调试并观察结果。

详细介绍本次设计过程中所涉及的硬件、软件原理及各个模块的设计方式。

深刻体会设计过程中所思,所想,所学。撰写心得体会。

2 系统硬件设计

2.1系统设计方案

利用状态机来实现对交通灯的控制,对十字路口的红、绿、黄和左拐灯进行控制,并通过数码管进行显示倒计时。

系统方案图如下图(1所示:

(1交通灯控制

2.顶层原理框图如图(2所示:

(2顶层原理系统图

2.2 主控模块

2.2.1 FPGA 简介

FPGA ,即现场可编程门阵列,它是在GAL PAL CPLD 灯可编程期间的基础上发展的产物。它是作为专门继承领域中的一种半定制电路而出现的,既解决了顶置电路的不足,又克服了原有可编程逻辑门电路数有限的缺点。FPGA 采用了逻辑单元阵列LCA 这样一个新概念,内部包括可配置模块CLB 、输出输入模块IOB R1Y G1R2

L

G2

L2

A 方向

B 方向 红绿灯显示

控制

倒计时

译码

和内部连线三个部分。

FPGA的基本特点有:1.采用FPGA设计ASIC电路,用户不需要投片生产就可以得到合适的芯片。2.FPGA可做其它全定制或半定制ASIC电路的中试样片。

3.FPGA内部有I/O引脚。

4.FPGAASIC电路中设计周期最短、开发费用最低、风险最小的器件之一。

5.FPGA采用高速CHMOS工艺,功耗低,可与CMOSTTL 兼容。可以说,FPGA芯片是小批量系统提高集成度、可靠性的最佳选择。

2.2.2 主控芯片ACEX1K 系列的EP1K10TC100-3的介绍:

ACEX 系列是当今Altera CPLD 中应用前景最好的器件系列之一[1,2],该系列的FPGA 由逻辑阵列块LAB(Logic array block、嵌入式阵列块EAB (embedded array block、快速互联以及IO 单元构成,每个逻辑阵列块包含8 个逻辑单元LE(logic element和一个局部互联。每个逻辑单元则由一个4 输入查找表(LUT、一个可编程触发器、快速进位链、级连链组成,多个LAB 和多个EAB 则可通过快速通道互相连接[3]EAB ACEX 系列器件在结构设计上的一个重要部件,他是输入端口和输出端口都带有触发器的一种灵活的RAM ,其主要功能是实现一些规模不太大的 FIFOROMRAM 和双端口RAM 等。

2.3 显示模块

2.3.1 发光二极管简介

发光二极管,它是半导体二极管的一种,可以把电能转化成光能;常简写为LED。发光二极管与普通二极管一样是由一个PN结组成,也具有单向导电性。当给发光二极管加上正向电压后,P区注入到N区的空穴和由N区注入到P 区的电子,PN结附近数微米内分别与N区的电子和P区的空穴复合,产生自发辐射的荧光。不同的半导体材料中电子和空穴所处的能量状态不同。当电子和空穴复合时释放出的能量多少不同,释放出的能量越多,则发出的光的波长越短。由镓(Ga与砷(AS、磷(P的化合物制成的二极管,当电子与空穴复合时能辐射出可见光,因而可以用来制成发光二极管。在电路及仪器中作为指示灯,或者组成文字或数字显示。磷砷化镓二极管发红光,磷化镓二极管发绿光,碳化硅二极管发黄光。

2.3.2 八段数码管简介:

数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示;按能显示多少个“8”可分为1位、2位、4位等等数码管;按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM的数码管。共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。当某一字段的阴极为高电平时,相应字

段就不亮。。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM的数码管。共阴数码管在应用时应将公共极COM接到地线GND,当某一字段发光二极管的阳极为高电平时,相应字段就点亮。当某一字段的阳极为低电平时,相应字段就不亮。数码管可以采用动态方式也可以采用静态方式驱动。

3 系统软件设计

3.1 软件整体设计

顶层文件图下图(3所示:

(3交通灯顶层文件图

3.2 控制模块

3.2.1 交通灯状态机、倒计时

1.状态机:用两个进程分别控制两个方向的交通灯。引入有限状态机控制交通灯

的状态转化,即绿灯->黄灯->左拐灯->红灯。复位时红灯亮。

2.倒计时:用两个减法计数器实现倒计时,当某个剩余时间减到0则切换状态。

各个状态交通灯保持的时间分配:A向红、黄、绿、左拐灯分别为

50S,5S,40S,15S, A向红、黄、绿、左拐灯分别为65S,5S,30S,15S

3.紧急情况:当有救护车或者其它一些情况时,救护车或特定车辆需优先通过十

字路口,此时交通等的状态为:A,B方向都为红灯亮,并且剩余时间

20s.

交通灯状态机及倒计时模块如下图(4所示:

CLK 同步时钟1HZ 用于准确及时

EN 使能信号

EMERGE 紧急信号有车辆需优先通过十字路口

LAMPA 0~3分别控制A方向的左拐、绿、黄和红灯

LAMPB 0~3分别控制B方向的左拐、绿、黄和红灯

ACOUNT 用于A方向的时间显示,驱动两个数码管

BCOUNT 用于B方向的时间显示

(4交通灯控制模块图

3.2.2 交通灯主要模块的状态机及倒计时的流程图(PFD 主要模块流程图如下图(5所示:

(5交通灯控制模块PFD

开始

是否使能?

设定定时时间和 方式

有无紧急情况?

A,B 方向都红灯亮起

计时时间到30S

A 方向绿灯亮40S ,接着黄灯亮5S ,再接着左拐灯亮15,然后黄灯亮5S ,同时

B 方向一直是红灯亮65S

B 方向绿灯亮30S ,接着黄灯亮5S ,再接着左拐灯亮15,然后黄灯亮5S ,同时B 方向一直是红灯亮55S

结束

回到初态,A ,B 方向都红灯亮,都显示为00

3.3 显示模块

7位数码管采用动态扫描显示,经位选信号译码后选择一位数码管,段暄信号为ABCDEFG

位选扫描模块图如下图(6所示:

CLK 时钟信号 1KHz 用于控制后面的译码显示模块使用动态扫描方式显示SEL 选择信号

(6位选扫描模块图

段选扫描模块图如下图(7所示:

ACOUNT 用于A方向的时间显示

BCOUNT 用于B方向的时间显示

SEL 位选信号

OUT 输出信号用来控制数码管所显示的字符

(7段选扫描模块图

显示译码模块图如下图(8所示:

OUT 控制数码管所显示的字符

A,B,C,D,E,F,G 驱动八段数码管显示

(8显示译码模块图

4 系统测试与总结

4.1 系统测试结果

由于交通灯这个设计仿真的结果不是很一目了然,再就是本人对仿真软件的了解不够,不能消除毛刺,影响观瞻。所以我就没有吧实验仿真图截下来,我在设计过程中,也通过仿真验证了实验结果的正确性。为了得到确定的结果,我把该顶层文件所组成的原理图文件下载到FPGA芯片和正确搭建电路后,就可以观察到交通等预期的结果了。

复位时红灯全亮,复位后相应灯亮的次序和相应的剩余时间都十分准确。刚启动时,A方向绿灯亮40S,接着黄灯亮5S,再接着左拐灯亮15,然后黄灯亮5S,同时B方向一直是红灯亮65S。再是,B方向绿灯亮30S,接着黄灯亮5S,再接着左拐灯亮15,然后黄灯亮5S,同时B方向一直是红灯亮55S。之后就一直重复以上行为。完全模拟了现实生活中的十字路口的交通灯。

扩展的功能情况为:不论何时,只要有紧急情况出现时,交通灯A,B方向都是红灯亮起,并且倒计时20S。使其能正常通过十字路口。20S过后交通灯回到正常状态。

4.2本次设计的心得体会

通过一个学期EDA的学习,我学到了很多东西。一直以来,我对各种变成都有浓厚的兴趣。而此次EDA的课程不仅要求学习者有一定的编程能力,还需要有一定的硬件实验的动手能力。EDA课程吸引我最大的地方在于,它不仅可以仿真,而且还可以下载到FPGA芯片中看到实实在在的效果。当看到自己的学习成果的那一刻的满足感最能激励我的学习热情。

跟着老师认真学习了一学期的EDA课程,我真的受益匪浅。老师幽默的,认真负责的实践性强的教学工作,不仅使我编程能力有了一定的提高,实践动手能力有了很大的提升。我学会了怎样有效地调试电路,准确分析问题所在,得到正确的解决方法。在此次设计过程中,我认真编写了所有模块的程序,经调试无误后,创建顶层原理图文件。再下载到FPGA中并正确搭建电路。本来我所设计的交通灯控制器是没有紧急情况处理功能的,但我觉得一个成熟的交通灯控制器应该要有此项功能。因此为了更好的达到设计目的。我修改了控制模块的程序,添加了此项功能。在文档的编写过程中,我学会了独立摸索,不断进步,精益求精。我认真思考,怎样才能把文档写得更加规范,更加符合设计要求。我不断地添加新内容,如绘制顶层原理图,最主要模块的即控制模块的程序流程图,使自己的设计思路更加容易被理解。

当然在这门课程的学习和设计过程中,我也发现了自己的一些不足。例如,对仿真软件的学习不够,我虽然做了仿真,但是效果不理想,有很多毛刺,还有一段时间的延时。我会在将来的学习过程中加以改正。

EDA的设计是很灵活的,如果你要想增加一些功能或者是修改须实现的功能,只需要修改相关的源程序或原理图即可。随着设计语言、电子设计自动化和FPGA期间的不断发展,基于FPGA期间的不断完善和发展。我相信,在不远的将来。由FPGA设计的产品将越来越普遍。

本课程虽然结束了,但是这种使用的技能将仍然存在我的学习,工作生活中。我相信,这是一种很实用的技能。我以后还会不断强化这种技能。希望可以基于FPGA设计出更多更实用的东西。

参考文献

[1]王金明《数字系统设计与Verilog HDl(第四版电子工业出版社 2011

1

[2]湖南理工学院实验室《专业实验辅导教材》 201010

附录

1. 控制模块源程序

/* 信号定义

CLK 同步时钟

EN 使能信号

LAMPA 0~3分别控制A方向的左拐、绿、黄和红灯

LAMPB 0~3分别控制B方向的左拐、绿、黄和红灯

ACOUNT 用于A方向的时间显示,驱动两个数码管

BCOUNT 用于B方向的时间显示 */

module traffic( CLK, EN, LAMPA,EMERGE, LAMPB, ACOUNT, BCOUNT ; output[7:0] ACOUNT, BCOUNT;

output[3:0] LAMPA, LAMPB;

input CLK, EN,EMERGE;//EMERGE信号模拟紧急情况,如有救护车要通过十字路口

reg[3:0] LAMPA, LAMPB;

reg[7:0] numa, numb; // 剩余时间

reg tempa, tempb; // 切换状态

reg[2:0] counta, countb; // 状态量

reg[7:0] ared, ayellow, agreen, aleft, // 保持时间

bred, byellow, bgreen, bleft;

assign ACOUNT = numa;

assign BCOUNT = numb;

/**************** 设置灯的计数初值 ****************/

always @( EN

begin

if( !EN

begin

ared <= 8'h55; ayellow <= 8'h5;

agreen <= 8'h40; aleft <= 8'h15;

bred <= 8'h65; byellow <= 8'h5;

bgreen <= 8'h30; bleft <= 8'h15;

end

end

/**************************** 控制A方向灯*************************/ always @( posedge CLK

begin

if( EN // 正常情况

if(EMERGE//紧急情况

counta <=5;

else //无紧急情况的正常运行状态

begin

if( !tempa // 切换状态

begin

tempa <= 1;

case( counta // 控制亮灯的顺序

0: begin numa<=agreen; LAMPA<=2; counta<=1; end

1: begin numa<=ayellow; LAMPA<=4; counta<=2; end

2: begin numa<=aleft; LAMPA<=1; counta<=3; end

3: begin numa<=ayellow; LAMPA<=4; counta<=4; end

4: begin numa<=ared; LAMPA<=8; counta<=0; end

5: begin LAMPA <= 8;numa<=8'h20;counta<=0; end // 紧急情况时,A,B向都红灯亮,并且持续时间都为20s,时间到转为正常情况

default: LAMPA <= 8; // 红灯亮

endcase

end

else // 倒计时

begin

if( numa > 1

if( numa[3:0] == 0

begin

numa[3:0] <= 4'b1001;

numa[7:4] <= numa[7:4] - 1;

end

else numa[3:0] <= numa[3:0] - 1;

if( numa == 2 tempa <= 0;

end

end

else // 返回初态

begin

LAMPA <= 4'b1000; counta <= 0; tempa <= 0;

end

end

/*************************** 控制B方向的灯 ************************/ always @( posedge CLK

begin

if( EN

if(EMERGE//紧急情况

countb=5;

else //无紧急情况的正常运行状态

begin

if( !tempb

begin

tempb <= 1;

case( countb // 控制亮灯的顺序

0: begin numb<=bred; LAMPB<=8; countb<=1; end

1: begin numb<=bgreen; LAMPB<=2; countb<=2; end

2: begin numb<=byellow; LAMPB<=4; countb<=3; end

3: begin numb<=bleft; LAMPB<=1; countb<=4; end

4: begin numb<=byellow; LAMPB<=4; countb<=0; end

5: begin LAMPB <= 8;numb<=8'h20;countb<=0; end //紧急情况时, A,B方向都红灯亮,并且持续时间都为20s,时间到转为正常情况

default: LAMPA <= 8; // 红灯亮

endcase

end

else

begin // 倒计时

if( numb > 1

if( numb[3:0] == 0

begin

numb[3:0] <= 4'b1001;

numb[7:4] <= numb[7:4] - 1;

end

else numb[3:0] <= numb[3:0] - 1;

if( numb == 2 tempb <= 0;

end

end

else

begin

LAMPB <= 4'b1000; countb <= 0; tempb <= 0;

end

end

endmodule

2. 显示模块源程序

(1位选扫描模块源程序:

/*四进制计数器*/

module count4(clk, out;

input clk;

output[1:0] out;

reg[1:0] out;

always @(posedge clk

begin

if(out == 3

out <= 0;

else

out <= out + 1;

end

Y1

endmodule

(2段选扫描模块源程序:

/*行为描述的164段选*/

module mux16_4(out,ACOUNT,BCOUNT,sel;

output[3:0] out;

reg[3:0] out;

input[7:0] ACOUNT;

input[7:0] BCOUNT;

input[1:0] sel;

always @(ACOUNT or BCOUNT or sel

case(sel

2'b00: out<=ACOUNT[7:4];

2'b01: out<=ACOUNT[3:0];

2'b10: out<=BCOUNT[7:4];

2'b11: out<=BCOUNT[3:0];

default out<=1'bx;

endcase

endmodule

(3显示译码模块源程序:

/*数码管显示电路*/

module decode4_7(a,b,c,d,e,f,g,out;

input[3:0] out;

output reg a,b,c,d,e,f,g;

always @(*

begin

case(out

4'd0:{a,b,c,d,e,f,g}=7'b1111110;

4'd1:{a,b,c,d,e,f,g}=7'b0110000;

4'd2:{a,b,c,d,e,f,g}=7'b1101101;

4'd3:{a,b,c,d,e,f,g}=7'b1111001;

4'd4:{a,b,c,d,e,f,g}=7'b0110011;

4'd5:{a,b,c,d,e,f,g}=7'b1011011;

4'd6:{a,b,c,d,e,f,g}=7'b1011111;

4'd7:{a,b,c,d,e,f,g}=7'b1110000;

4'd8:{a,b,c,d,e,f,g}=7'b1111110;

4'd9:{a,b,c,d,e,f,g}=7'b1111011;

default:{a,b,c,d,e,f,g}=7'b1111110;

endcase

end

endmodule

本文来源:https://www.2haoxitong.net/k/doc/17baa967876fb84ae45c3b3567ec102de3bddf6e.html

《基于FPGA的(带有紧急情况处理的)交通灯控制器的设计.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式