学号成绩
评语
《现代数字系统设计》课程论文
题目基于FPGA的(带有紧急情况处理的交通灯控制器的设计
作者班级
院别信息与通信工程专业电子信息工程完成时间 2011年5月12日
目录
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.FPGA是ASIC电路中设计周期最短、开发费用最低、风险最小的器件之一。
5.FPGA采用高速CHMOS工艺,功耗低,可与CMOS、TTL 兼容。可以说,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 块,其主要功能是实现一些规模不太大的 FIFO、ROM、RAM 和双端口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位数码管采用动态扫描显示,经位选信号译码后选择一位数码管,段暄信号为A、B、C、D、E、F、G。
位选扫描模块图如下图(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]湖南理工学院实验室《专业实验辅导教材》 2010年10月
附录
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段选扫描模块源程序:
/*行为描述的16选4段选*/
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
文档为doc格式