第一篇:基于FPGA的(带有紧急情况处理的)交通灯控制器的设计.
学号成绩 评语
《现代数字系统设计》课程论文
题目基于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.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;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;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
第二篇:基于FPGA的交通灯控制器设计
数字系统课程设计
基于FPGA的交通控制灯设计
姓名:
学号:
班级:
摘要
随着社会的发展,城市规模的不断扩大,城市交通成为制约城市发展的一大因素。人口和汽车日益增长,市区交通也日益拥挤,人们的安全问题当然也日益重要。因此,红绿交通信号灯成为交管部门管理交通的重要工具之一。有了交通灯,人们的安全出行也有了很大的保障。自从交通灯诞生以来,其内部的电路控制系统就不断的被改进,设计方法也开始多种多样,从而使交通灯显得更加智能化。尤其是近几年来,随着电子与计算机技术的飞速发展,电子电路分析和设计方法有了很大的改进,电子设计自动化也已经成为现代电子系统中不可或缺的工具和手段,这些都为交通灯控制系统的设计提供了一定的技术基础。本课程设计运用erilog HDL语言描述交通控制器,通过状态机计数法,实现设计所要求的交通灯控制及时间显示,并最后进行了软件实现,达到了系统要求的功能。
设计原理
1.1设计要求
设计一个交通控制器,用LED显示灯表示交通状态,并以7段数码显示器显示当前状态剩余秒数 主干道绿灯亮时,支干道红灯亮;反之亦然,二者交替允许通行,主干道每次放行35s,支干道每次放行25s。每次由绿灯变为红灯的过程中,亮光的黄灯作为过渡,黄灯的时间为5s。能进行特殊状态显示,特殊状态时东西、南北路口均显示红灯状态。用LED灯显示倒计时,并且能实现总体清零功能,计数器由初始状态开始计数,对应状态的显示灯亮。能实现特殊状态的功能显示,1.2设计思路和原理
本次设计是针对十字路口,进行南北和东西直行情况下交通灯控制。设定东西方向为主干道方向,根据交通灯的亮的规则,在初始状态下四个方向的都为红灯亮启,进入正常工作状态后,当主干道上绿灯亮时,支干道上红灯亮,持续35S后,主干道和支干道上的黄灯都亮启,持续5S后,主干道上红灯亮启,支干道上绿灯亮启持续25S,之后主干道和支干道上的黄灯都亮启5s,一个循环完成。循环往复的直行这个过程。其过程如下图所示:
0s主干道方向25s绿灯亮30s红灯亮黄灯亮65s支干道方向0s红灯亮35s绿灯亮黄灯亮60s65s
图1.交通灯点亮时间控制说明
1.3实现方法
本次采用文本编辑法,即利用Verilog HDL语言描述交通控制器,通过状态机计数法,实现设计所要求的交通灯控制及时间显示。设计中用两组红黄绿LED模拟两个方向上的交通灯,用4个7段数码管分别显示两个方向上的交通灯剩余时间,控制时钟由试验箱上频率信号提供。
Verilog HDL程序设计
2.1整体设计
根据上章设计原理,交通灯控制的关键是各个状态之间的转换和进行适当的时间延时,根据状态机的设计规范,本次设计了三个状态之间的循环转化,其真值表及状态转化图如下所示:
状状00状状00状状10状状11状状01状状01状状11状状10状状状状状状状状状状001状状状状状010状状状状状100状状状状状010状状状状状状状状状状100状状状状状010状状状状状001状状状状状010
图2.交通灯控制状态转化
说明:该状态图为交通灯在正常情况下的状态转化图,进入控制后,状态00时主干道绿灯及支干道红灯亮起,进入状态01后两路黄灯亮起,状态11时主干道红灯及支干道绿灯亮起。进入10状态两路黄灯亮起。结束一个循环,从00状态重新开始循环。
为实现控制与显示的功能,需要设计交通灯点亮顺序控制程序,倒数计时程序,七段数码管显示程序,数码管显示扫描程序,其系统结构图如下所示:
holdrst状状状状1Hz状状状状状状状状状状状状状状状状状状状clk1KHz状状状状状状状1Hz状状状状状状状状状状状状状状状状状状状状状 图3.交通灯控制系统结构图
其中rst为复位信号,clk为时钟信号,hold为特殊情况控制信号,输入hold时两个方向红灯无条件亮起。
2.2 具体设计
根据整体设计要求,编写各个功能部分Verilog HDL程序,设置各输入输出变量说明如下 clk: 为计数时钟; qclk:为扫描显示时钟;
en: 使能信号,为1 的话,则控制器开始工作; rst: 复位信号,为1的话,控制及技术回到初始状态;
hoid:特殊情况控制信号,为1的话,则两个方向无条件显示为红灯;
light1: 控制主干道方向四盏灯的亮灭;其中,light1[0]~light[2],分别控制主干道方向的 绿灯、黄灯和红灯;
light2: 控制支干道方向四盏灯的亮灭;其中,light2[0] ~ light2[2],分别控制支干道方向的 绿灯、黄灯和红灯;
num1: 用于主干道方向灯的时间显示,8 位,可驱动两个数码管; num2: 用于支干道方向灯的时间显示,8 位,可驱动两个数码管; counter:用于数码管的译码输出; st1,st2:数码管扫描信号。输入输出及中间变量设置如下:
module traffic(en,clk,qclk,rst,rst1,hold,num1,num2,light1,light2,counter,st1,st2);input en,clk,qclk,rst,hold,rst1;output st1,st2;output[7:0] num1,num2;output[6:0]counter;output[2:0] light1,light2;reg tim1,tim2,st1,st2;reg[1:0]state1,state2,ste;reg[2:0]light1,light2;reg[3:0]num;reg[6:0]counter;reg[7:0] num1,num2;reg[7:0] red1,red2,green1,green2,yellow1,yellow2;
1.二极管点亮控制
该部分程序的作用是根据计数器的计数值控制发光二极管的亮、灭,以及输出倒计时数值给七段数码管的译码电路。此外,当检测到特殊情况(hold=‘1’)发生时,无条件点亮红灯的二极管,当检测到复位信号,两个方向计数与控制回复到00状态。因为主、支干道两个方向二极管点亮的顺序与延迟时间不同,顾编写两个独立的部分来控制,具体程序如下: 1)主干道方向 always @(posedge clk)begin
if(rst)//复位与特殊情况控制
begin light1<=3'b001;num1<=green1;end else if(hold)begin light1<=3'b100;num1<=green1;end else if(en)
begin //使能有效开始控制计数
if(!tim1)//
begin //主干道交通灯点亮控制
tim1<=1;
case(state1)
2'b00:begin num1<=green1;light1<=3'b001;state1<=2'b01;end
2'b01:begin num1<=yellow1;light1<=3'b010;state1<=2'b11;end
2'b11:begin num1<=red1;light1<=3'b100;state1<=2'b10;end
2'b10:begin num1<=yellow1;light1<=3'b010;state1<=2'b00;end
default:light1<=3'b100;
endcase
end 2)支干道方向
always @(posedge clk)begin
if(rst)//复位与特殊情况控制
begin
light2<=3'b100;
num2<=red2;
end
else if(hold)
begin
light2<=3'b100;
num2<=red2;
end
else if(en)
begin
if(!tim2)
begin
tim2<=1;
case(state1)
2'b00:begin num2<=red2;light2<=3'b100;state2<=2'b01;end
2'b01:begin num2<=yellow1;light2<=3'b010;state2<=2'b11;end
2'b11:begin num2<=green2;light2<=3'b001;state2<=2'b10;end
2'b10:begin num2<=yellow2;light2<=3'b010;state2<=2'b00;end
default:light2<=3'b100;
endcase
end
2.倒数计时
该部分程序完成二极管发光时延的计数,并将计数结果送到数码管显示电路,每切换到一个状态,计数器的初值都被重置,以实现不同颜色二极管不同的时延要求。本次设计直接用逻辑运算完成2位十进制数的计数,未采用分位器的设计。因为主、支干道上计数器的结构完全相同,顾只列出一路的程序,其具体程序如下所示:
always @(posedge clk)begin else begin //倒数计时
if(num1>0)
if(num1[3:0]==0)
begin
num1[3:0]<=4'b1001;
num1[7:4]<=num1[7:4]-1;
end
else num1[3:0]<=num1[3:0]-1;
if(num1==1)tim1<=0;
end
end
else
begin
light1<=3'b010;
num1=2'b00;
tim1<=0;
end end
3.数码管的译码及扫描显示
该段程序主要完成4个7段数码管的译码显示及扫描,使系统能正常显示主、支干道两个方向上的剩余时间。译码的时钟频率要低,为Hz级。扫描的时钟频率要高,最低不得小于人眼分辨频率50Hz,具体程序如下所示: always @(posedge qclk)begin //数码管扫描
if(rst1)
begin
st1=0;
st2=0;
end else
begin
case({st2,st1})
2'b00:begin num<=num1[3:0];{st2,st1}<=2'b01;end
2'b01:begin num<=num1[7:4];{st2,st1}<=2'b10;end
2'b10:begin num<=num2[3:0];{st2,st1}<=2'b11;end
2'b11:begin num<=num2[7:4];{st2,st1}<=2'b00;end
endcase
end end always @(posedge qclk)begin //数码管译码显示 case(num)4'b0000: counter<=7'b0111111;//0 4'b0001: counter<=7'b0000110;//1 4'b0010: counter<=7'b1011011;//2 4'b0011: counter<=7'b1001111;//3 4'b0100: counter<=7'b1100110;//4 4'b0101: counter<=7'b1101101;//5 4'b0110: counter<=7'b1111101;//6 4'b0111: counter<=7'b0000111;//7 4'b1000: counter<=7'b1111111;//8 4'b1001: counter<=7'b1101111;//9 default: counter<=7'b0111111;//0 endcase end endmodule 总体程序见程序清单所示
仿真与硬件调试
3.1 波形仿真
在QuartursⅡ软件下创建工程,新建编辑设计文件,将程序输入,整体编译后,新建波形仿真文件。设置仿真时间,时钟周期,输入输出端口,进行波形仿真。具体仿真波形图及说明如下所示: 仿真截止时间:100us; 时钟:clk 1us,qclk 0.1us 1.正常工作时波形仿真图
图4.正常工作时波形仿真图
图形说明
波形仿真主要完成了控制与计数以及数码管显示的波形图。en为低电品时,计数器置初值,高电平时开始正常控制与计数。控制发光二极管首次输出为“light1=001,light2=100”,表示主干道路绿灯亮,支杆道路红灯亮,计数器num1和num2从“00110101”开始递减计数,计数至“00000000”时,进入下一个状态,控制输出量为light=010,light2=010,表示主、支干道黄灯均亮起,计数器num1和num2从“00000101”开始计数递减,计数至”00000000”时进入下一个状态,light=100,light2=001,表示主干道路红灯亮,支杆道路绿灯亮。Counter根据num1,num2变化随时钟上升沿输出译码后的数据。由于屏幕显示大小有限,未仿真出一个完整周期。
2.特殊情况仿真波形
图5.特殊情况仿真波形
图形说明
当hold输入高电平时,在时钟上升沿的控制下,light 1与light2被强制置位为”100”,表示两路红灯均亮起
3.复位情况仿真波形
图6.复位情况仿真波形
图形说明
当rst输入高电平时,在时钟上升沿控制下,计数与控制都回到00状态,即light1=001,light2=100,计数器num1和num2从“00110101”开始递减计数。3.2 硬件调试
完成时序仿真确认无误后,进行实验箱管脚设置,注意设置完成后一定要再进行一次全局仿真,使程序真正对应于硬件输出输出。具体连接说明如下所示
输入变量:rst、clk、qclk、hold、en 其中en,hold,rst接”0-1”拨码开关,以稳定的输出可变化的电平。计数时钟clk接实验箱上1Hz时钟,扫描显示时钟qclk接125Khz时钟。
输出变量:light1[2:0]、light2[2:0]、counter[6:0]、st1、st2 其中light1[0]、light2[0]分别接绿色的发光二极管;light1[1]、light2[1] 分别接黄色的发光二极管;light1[2]、light2[2]分别接红色的发光二极管。counter[0]~counter[6],分别接七段数码管的a~f,st1、st2分别接试验箱上”4-16”译码器的低两位。
完成接线后将程序烧写到芯片上,开始功能调试。分辨改变使能信号,复位信号以及特殊情况信号,观察数码管以及发光二级管情况。
程序清单
module traffic(en,clk,qclk,rst,rst1,hold,num1,num2,light1,light2,counter,st1,st2);input en,clk,qclk,rst,hold,rst1;output st1,st2;output[7:0] num1,num2;output[6:0]counter;output[2:0] light1,light2;reg tim1,tim2,st1,st2;reg[1:0]state1,state2,ste;reg[2:0]light1,light2;reg[3:0]num;reg[6:0]counter;reg[7:0] num1,num2;reg[7:0] red1,red2,green1,green2,yellow1,yellow2;
always @(en)if(!en)begin //设置计数初值 green1<=8'b00110101;red1<=8'b00100101;yellow1<=8'b00000101;green2<=8'b00100101;red2<=8'b00110101;yellow2<=8'b00000101;end
always @(posedge clk)begin if(rst)//复位与特殊情况控制
begin
light1<=3'b001;num1<=green1;
end else if(hold)
begin
light1<=3'b100;
num1<=green1;
end
else if(en)
begin //使能有效开始控制计数
if(!tim1)//开始控制
begin //主干道交通灯点亮控制
tim1<=1;
case(state1)
2'b00:begin num1<=green1;light1<=3'b001;state1<=2'b01;end
2'b01:begin num1<=yellow1;light1<=3'b010;state1<=2'b11;end
2'b11:begin num1<=red1;light1<=3'b100;state1<=2'b10;end
2'b10:begin num1<=yellow1;light1<=3'b010;state1<=2'b00;end
default:light1<=3'b100;
endcase
end
else
begin //倒数计时
if(num1>0)
if(num1[3:0]==0)
begin
num1[3:0]<=4'b1001;
num1[7:4]<=num1[7:4]-1;
end
else num1[3:0]<=num1[3:0]-1;
if(num1==1)tim1<=0;
end
end
else
begin
light1<=3'b010;
num1=2'b00;
tim1<=0;
end
end
always @(posedge clk)begin
if(rst)//复位与特殊情况控制
begin
light2<=3'b100;
num2<=red2;
end
else if(hold)
begin
light2<=3'b100;
num2<=red2;
end
else if(en)
begin
if(!tim2)
begin
tim2<=1;
case(state1)
2'b00:begin num2<=red2;light2<=3'b100;state2<=2'b01;end
2'b01:begin num2<=yellow1;light2<=3'b010;state2<=2'b11;end
2'b11:begin num2<=green2;light2<=3'b001;state2<=2'b10;end
2'b10:begin num2<=yellow2;light2<=3'b010;state2<=2'b00;end
default:light2<=3'b100;
endcase
end
else
begin //倒数计时
if(num2>0)
if(num2[3:0]==0)
begin
num2[3:0]<=4'b1001;
num2[7:4]<=num2[7:4]-1;
end
else num2[3:0]<=num2[3:0]-1;
if(num2==1)tim2<=0;
end
end
else
begin
tim2<=0;
state2<=2'b00;
light2<=3'b010;
end
end
always @(posedge qclk)begin //数码管扫描
if(rst1)
begin
st1=0;
st2=0;
end else
begin
case({st2,st1})
2'b00:begin num<=num1[3:0];{st2,st1}<=2'b01;end
2'b01:begin num<=num1[7:4];{st2,st1}<=2'b10;end
2'b10:begin num<=num2[3:0];{st2,st1}<=2'b11;end
2'b11:begin num<=num2[7:4];{st2,st1}<=2'b00;end
endcase
end end always @(posedge qclk)begin //数码管译码显示 case(num)4'b0000: counter<=7'b0111111;//0 4'b0001: counter<=7'b0000110;//1 4'b0010: counter<=7'b1011011;//2 4'b0011: counter<=7'b1001111;//3 4'b0100: counter<=7'b1100110;//4 4'b0101: counter<=7'b1101101;//5 4'b0110: counter<=7'b1111101;//6 4'b0111: counter<=7'b0000111;//7 4'b1000: counter<=7'b1111111;//8 4'b1001: counter<=7'b1101111;//9 default: counter<=7'b0111111;//0 endcase end endmodule
总结
在设计中采用V erilog HDL语言设计交通灯控制系统, 借助其功能强大的语言结构, 简明的代码描述复杂控制逻辑设计, 与工艺无关特性, 在提高工作效率的同时达到求解目的, 并可以通过V erilog HDL 语言的综合工具进行相应硬件电路生成, 具有传统逻辑设计方法所无法比拟的优越性。
在设计过程中,觉得最难的部分是波形仿真部分,虽然程序编译通过但仿真出不了正确的波形,不是计数器无法正常计数,就是控制输出无法进入到下一个状态,每次出现问题就必须返回重新修改程序。实践证明,在编写一个较复杂的程序时,一开始一定要画流程图,弄清楚各个功能及实现它们的逻辑算法,做到心中有数后在开始下笔写编写程序。在编写的时候要尤其要注意语言的规范,如本次设计中编写的V erilog在Quartus8.1中可以正常生成时序图,而在低版本的软件中却无法生成,原因就是语言使用不规范,在解决这个问题时我总结了一些经验,首先程序要逻辑清晰,简洁明了,避免不必要的嵌套与条用,其次要适当地给程序加上注解文字,提高可读性,以方便之后的程序出错时进行查找,最后充分利用仿真软件提供的各项编译工具与报错消息,按图索骥,有方向的完成程序调试。
完成仿真后进行,进行试验箱上的硬件调试,该步骤主要是要求细心,按照引脚清单,逐一完成连线,本次设计用到两个时钟输入,注意一定要选择合适频率的时钟,以便达到期望的效果。注意观察实物的现象,看是否满足设计要求,不满足时检查是硬件问题还是程序问题,如果是程序问题,在修改完之后必须要重新编译,重新烧入。不断排查错误,直至达到满意的效果。
通过这次课程设计,熟悉了简单EDA设计的整个流程,加深了对Verilog HDL硬件描述语言的理解,提高了动手能力,并且锻炼了自己的耐心,收获颇丰,我会把在本次课程设计中学到的东西应用到今后的工作学习中。
参考资料
[1] 夏宇闻.复杂数字电路与系统的V erilog HDL设计技术 [M ].北京: 北京航空航天大学出版社, 1998 [2] 郭梯云.移动通信[M ].西安: 西安电子科技大学出版社, 1995 [3] [法]M ichelMouly, M arie Bernadet te Pautet1GSM 数字移动通信系统[M ].骆健霞, 顾龙信, 徐云霄译.北京: 电子工业出版社, 1996 [4] 张毅刚, 乔立岩.虚拟仪器软件开发环境L abW indow söCV I 610 编程指南[M ].北京: 机械工业出版社, 2002 [5] 刘国权.GSM 手机的测试[J ].中国无线电管理, 2003 [6] 俞定玖, 刘湘慧.GSM 数字蜂窝移动交换系统测试[J ].电信科学, 2000 [7] 张明.V erilog HDL 实用教程[M ].成都: 电子科技大学出版社, 1999 [8] Hyde D C.Bucknell Handbook on V erilog HDL 1Computer Science Department, Bucknell U niversity L ew is burg, 1995 [9] 康华光.电子技术基础(数字部分)[M ].北京: 高等教育出版社, 1988
第三篇:交通灯控制器设计实验报告
设计性实验项目名称
交通灯控制器设计
实验项目学时:3学时
实验要求:■ 必修
□ 选修
一、实验目的
1、学习与日常生活相关且较复杂数字系统设计;
2、进一步熟悉EDA实验装置和QuartusⅡ软件的使用方法;
3、学习二进制码到BCD码的转换;
4、学习有限状态机的设计应用。
二、实验原理
交通灯的显示有很多方式,如十字路口、丁字路口等,而对于同一个路口又 有很多不同的显示要求,比如十字路口,车辆如果只要东西和南北方向通行就很 简单,而如果车子可以左右转弯的通行就比较复杂,本实验仅针对最简单的南北 和东西直行的情况。
要完成本实验,首先必须了解交通路灯的燃灭规律。本实验需要用到实验箱上交通灯模块中的发光二极管,即红、黄、绿各三个。依人们的交通常规,“红灯停,绿灯行,黄灯提醒”。其交通灯的燃灭规律为:初始态是两个路口的红灯全亮之后,主干道的绿灯亮,乡间道路的红灯亮,主干道方向通车,延时一段时间后,乡间公路来车,主干道绿灯灭,黄灯开始闪烁。闪烁若干次后,主干道红灯亮,而同时乡间公路的绿灯亮,延时一段时间后,乡间公路的绿灯灭,黄灯开始闪烁。闪烁若干次后,再切换到主干道方向,重复上述过程。
三、设计要求
完成设计、仿真、调试、下载、硬件测试等环节,在型EDA实验装置上实现一个由一条主干道和一条乡间公路的汇合点形成的十字交叉路口的交通灯控制器功能,具体要求如下:
1、有MR(主红)、MY(主黄)、MG(主绿)、CR(乡红)、CY(乡黄)、CG(乡绿)六盏交通灯需要控制;
2、交通灯由绿转红前有4秒亮黄灯的间隔时间,由红转绿没有间隔时间;
3、乡间公路右侧各埋有一个串连传感器,当有车辆准备通过乡间公路时,发出请求信号S=1,其余时间S=0;
4、平时系统停留在主干道通行(MGCR)状态,一旦S信号有效,经主道黄灯4秒(MYCR)状态后转入乡间公路通行(MRCG)状态,但要保证主干道通行大于一分钟后才能转换;
5、一旦S信号消失,系统脱离MRCG状态,即经乡道黄灯4秒(MRCY)状态进入MGCR状态,即使S信号一直有效,MRCG状态也不得长于20秒钟;
6、控制对象除红绿灯之外,还包括分别在主干道和乡间公路各有一个两位十进制倒计时数码管显示。
四、主要仪器设备
1、微机
1台
1套 1套
2、QuartusII集成开发软件
3、EDA实验装置
五、实验步骤
源程序:
0module traffic1(clk,s,rst,light,sel,SG);input clk,s,rst;output[5:0] light;
output [2:0]sel;output [7:0]SG;reg [5:0] light;reg clk1;reg [3:0] sc;
reg [7:0] count;reg [7:0] cnt,SG;reg [2:0] sel;reg [3:0]a;parameter s0=0,s1=1,s2=2,s3=3,s4=4;initial
begin
count<=8'b01100000;
light<=6'b001100;
sc=s0;
end
always @(posedge clk)begin
begin cnt=cnt+1;
if(cnt==100)begin clk1=1'b1;cnt=0;end
else clk1=1'b0;//100分频,CLK为数码管扫描频率,CLK1为计数频率
if(sel<7)sel=sel+1;else sel=6;
end //sel为数码管选择
begin
case(sel)
7: a=count[3:0];//0数码管为个位
6: a=count[7:4];//1数码管为十位
default: a=0;
endcase
case(a)
0:SG<=8'b00111111;1:SG<=8'b00000110;
2:SG<=8'b01011011;3:SG<=8'b01001111;
4:SG<=8'b01100110;5:SG<=8'b01101101;
6:SG<=8'b01111101;7:SG<=8'b00000111;
8:SG<=8'b01111111;9:SG<=8'b01101111;//8段译码值
default: SG=8'b11111111;
endcase
end end
always @(posedge clk1 or negedge rst)
begin
if(!rst)begin count = 0;sc=s3;end // count set nothing but else 0
else if(count == 0)
begin
case(sc)
s0: begin if(s)begin sc=s1;count = 8'b00000100;light=6'b010100;end else begin sc=s4;count = 8'b01100000;end end
s1: begin count = 8'b00100000;sc=s2;light=6'b100001;end
s2: begin count = 8'b00000100;sc=s3;light=6'b100010;end
s3: begin count = 8'b01100000;sc=s0;light=6'b001100;end
s4: begin if(s)begin sc=s1;count = 8'b00000100;light=6'b010100;end else begin sc = s4;count = 8'b01100000;light<=6'b001100;end end
default begin sc=s0;count =8'h60;end
endcase
end
else
if((sc==s2)&(s==0))begin sc=s3;count = 8'b00000100;light=6'b100010;end
else
if((sc==s4)&(s==1))begin sc=s1;count = 8'b00000100;light=6'b010100;end
else if(count[3:0] == 4'b0000)
begin count = count-7;end
else
begin count = count-1;end
end endmodule
管脚锁定
六、波形仿真
主干道60s倒计时
s信号为1时
七、实验心得
通过本次实验,让我进一步掌握了软件quartus的使用流程,一开始实验时波形仿真是正确的,但在电路上实现时主干道亮黄灯时,乡间道路亮的是绿灯,这显然是不对的,后面发现是管脚锁定时出现了问题,改回来之后就没问题了。管脚锁定时不能粗心,不然很容易出现问题。
曹军
生医121班
第四篇:FPGA交通灯实验报告
交通灯实验报告
一,实验目的
实现两路信号灯交替亮起,并利用两组数码管分别对两路信号进行倒计时。
两路信号时间分别为:
V:绿灯(30S)
H:红灯(35S)
黄灯(5s)
绿灯(30S)
红灯(35S)
黄灯(5S)
二,实验步骤 建立工程
可在欢迎界面点击“Creat a New Project”进入工程建立界面,亦可关闭欢迎界面,点击菜单栏的“File”,点击“New Project Wizard”进入建立工程界面。右侧为建立工程界面,点击next。
在此界面选定工程路径,取好工程名,点击“Next”。注意:路径中不能有中文,工程名也不能有中文。
一直点击“Next”进入器件设置界面,DE2-70开发工具采用的Cyclone II系列的EP2C70F896C6N。点击“Finish”,完成工程建立
1、点击“File”,点击“New” 选择“Verilog HDL” 2,点击主界面工具栏中的 选择“Verilog HDL”
3、写入verilog代码。
代码如下:
module traffic(Clk_50M,Rst,LedR_H,LedG_H,LedY_H,LedR_V,LedG_V,LedY_V,Seg7_VH,Seg7_VL,Seg7_HH,Seg7_HL,led15);
parameter S1=2'b00;parameter S2=2'b01;parameter S3=2'b10;parameter S4=2'b11;
input Clk_50M,Rst;output LedR_H,LedG_H,LedY_H,LedR_V,LedG_V,LedY_V;output[6:0] Seg7_VH,Seg7_VL,Seg7_HH,Seg7_HL;output led15;
//-------------div for 1Hz-------start----reg Clk_1Hz;reg [31:0] Cnt_1Hz;always@(posedge Clk_50M or negedge Rst)begin
if(!Rst)
begin
Cnt_1Hz<=1;
Clk_1Hz<=1;
end
else
begin
if(Cnt_1Hz>=25000000)
end
//-----------div for 1Hz------end-----reg[7:0] Cnt30,CntH,CntV,CntHH,CntVV;reg[7:0] CntDis,CntDiss;//-----------30 counter and seg7---start---reg LedR_H,LedG_H,LedY_H,LedR_V,LedG_V,LedY_V;always@(posedge Clk_1Hz)begin
end
begin
Cnt_1Hz<=1;
Clk_1Hz<=~Clk_1Hz;
end
else
Cnt_1Hz<=Cnt_1Hz + 1;
case(state)
S1:
end
always@(posedge Clk_1Hz)begin
case(stateV)
S1:
begin
if(CntV>=30)
CntV<=1;
begin
if(Cnt30>=30)
Cnt30<=1;
else
Cnt30<=Cnt30 + 1;S2:
begin
if(Cnt30>=5)
Cnt30<=1;end
else
Cnt30<=Cnt30 + 1;S3:
begin
if(Cnt30>=30)
Cnt30<=1;end
else
Cnt30<=Cnt30 + 1;S4:
begin
if(Cnt30>=5)
Cnt30<=1;end
else
Cnt30<=Cnt30 + 1;end endcase
else
CntV<=CntV + 1;
S2: begin
end
end if(CntV>=5)
CntV<=1;
else
CntV<=CntV + 1;end
S3:
begin
if(CntV>=35)
CntV<=1;
else
CntV<=CntV + 1;end endcase always@(posedge Clk_1Hz)begin
case(stateH)
S1:
end
always@(negedge Clk_50M or negedge Rst)begin
begin
if(CntH>=35)
CntH<=1;
else
CntH<=CntH + 1;
S2:
begin
if(CntH>=30)
CntH<=1;end
else
CntH<=CntH + 1;end
S3:
begin
if(CntH>=5)
CntH<=1;
else
CntH<=CntH + 1;end endcase
case(state)
S1:
end always@(negedge Clk_50M or negedge Rst)begin
case(state)
S1:
end
//16进制计数器转换为用于显示的10进制计数器 always@(posedge Clk_50M)begin
if(CntVV>29)
begin
CntDis[7:4]<=3;
CntDis[3:0]<=CntVV20;end else if(CntVV>9)begin
CntDis[7:4]<=1;
CntDis[3:0]<=CntVV30;end else if(CntHH>19)begin
CntDiss[7:4]<=2;
CntDiss[3:0]<=CntHH10;end else
CntDiss<=CntHH;
end
if(Cnt30>=5)
end
end S3:
begin
state<=S4;
end S4:
begin
state<=S1;
end default:
begin
state<=S1;
end endcase
if(Cnt30>=30)
if(Cnt30>=5)always@(posedge Clk_1Hz)begin
case(state)
S1:
end
always@(posedge Clk_50M or negedge Rst)
begin
stateH<=S1;
stateV<=S1;
end S2:
begin
stateH<=S1;
stateV<=S2;
end S3:
begin
stateH<=S2;
stateV<=S3;
end S4:
begin
stateH<=S3;
stateV<=S3;
end endcase begin
if(!Rst)
begin
LedR_H<=0;
else
LedG_H<=0;LedY_H<=0;
LedR_V<=0;
LedG_V<=0;end LedY_V<=0;
begin
case(state)
S1:
begin
LedR_H<=1;LedG_H<=0;LedY_H<=0;LedR_V<=0;LedG_V<=1;LedY_V<=0;end
S2:
begin
LedR_H<=1;LedG_H<=0;LedY_H<=0;LedR_V<=0;LedG_V<=0;LedY_V<=1;end
S3:
begin
LedR_H<=0;LedG_H<=1;LedY_H<=0;LedR_V<=1;LedG_V<=0;LedY_V<=0;end
S4:
begin LedR_H<=0;LedG_H<=0;
end
LedY_H<=1;LedR_V<=1;LedG_V<=0;LedY_V<=0;end
default:
begin
end LedR_H<=0;LedG_H<=0;LedY_H<=0;LedR_V<=0;LedG_V<=0;LedY_V<=0;end
endcase assign led15=state;
endmodule
module SEG7_LUT input [3:0] iDIG;output reg
always @(iDIG)begin
case(iDIG)4'h1: oSEG = 7'b1111001;
//---t----4'h2: oSEG = 7'b0100100;// |
| 4'h3: oSEG = 7'b0110000;// lt rt
4'h4: oSEG = 7'b0011001;// |
| 4'h5: oSEG = 7'b0010010;//---m----4'h6: oSEG = 7'b0000010;// |
| 4'h7: oSEG = 7'b1111000;// lb rb 4'h8: oSEG = 7'b0000000;// |
| 4'h9: oSEG = 7'b0011000;//---b----4'ha: oSEG = 7'b0001000;4'hb: oSEG = 7'b0000011;4'hc: oSEG = 7'b1000110;4'hd: oSEG = 7'b0100001;4'he: oSEG = 7'b0000110;[6:0] oSEG;[6:0] oSEG;(oSEG,iDIG);
end
4'hf: oSEG = 7'b0001110;4'h0: oSEG = 7'b1000000;endcase endmodule 编译工程
保存文件,将文件放在所建工程所在路径下 点击主界面工具栏中的图标
也可点击菜单栏中“Processing”,点击“Start Compilation”
分配关键如下:
Clk_50M Input PIN_AD15 LedG_H Output PIN_AD9 LedG_V Output PIN_AJ6 LedR_H Output PIN_AJ7)LedR_V Output PIN_AJ5)LedY_H Output PIN_AD8 LedY_V Output PIN_AK5 Rst Input PIN_AA23 Seg7_HH[6] Output PIN_G1 Seg7_HH[5] Output PIN_H3 Seg7_HH[4] Output PIN_H2 Seg7_HH[3] Output PIN_H1 Seg7_HH[2] Output PIN_J2 Seg7_HH[1] Output PIN_J1 Seg7_HH[0] Output PIN_K3
Seg7_HL[6] Seg7_HL[5] Seg7_HL[4] Seg7_HL[3] Seg7_HL[2] Seg7_HL[1] Seg7_HL[0] Seg7_VH[6] Seg7_VH[5] Seg7_VH[4] Seg7_VH[3] Seg7_VH[2] Seg7_VH[1] Seg7_VH[0] Seg7_VL[6] Seg7_VL[5] Seg7_VL[4] Seg7_VL[3] Seg7_VL[2] Seg7_VL[1] Seg7_VL[0] Output Output Output Output Output Output Output Output Output Output Output Output Output Output Output Output Output Output Output Output Output PIN_E4 PIN_F4 PIN_G4 PIN_H8 PIN_H7 PIN_H4 PIN_H6 PIN_AD17 PIN_AF17 7 PIN_AE17 7 PIN_AG16 PIN_AF16 7 PIN_AE16 7 PIN_AG13 PIN_AD12 PIN_AD11 PIN_AF10 8 PIN_AD10 PIN_AH9 8 PIN_AF9 8 PIN_AE8 8
烧写代码
在管脚配置完成后,还需将工程再编译一次,成功后,点击主界面工具栏中的亦可点击主界面菜单栏中“Tools”,点击“Programmer”
进入代码烧写界面后,点击“Start”,当“Progress”为100%时,表示烧写完成,这是可观察DE2-70板现象
获得预期的效果,两组的信号红黄绿灯交替切换,计数器记为零时信号灯切换状态,红灯35s,黄灯5s,绿灯30s。三,心得体会
通过本次实验初步了解了EDA技术,熟悉了FPGA开发板的开发流程,锻炼了动手能力。
第五篇:基于FPGA的交通灯控制电路的设计
编号:
EDA技术
实训(论文)说明书
题 目: 交通灯控制电路的设计 院(系): 信息与通信学院 专 业: 电子信息工程 学生姓名: 学 号: 指导教师:
2013年月日
桂林电子科技大学实训说明书用纸
摘要
EDA工具对于电子设计人员来说极其重要,它可以在电子设计的各个阶段、层次进行计算机模拟验证,确保设计的准确性,可缩短设计周期,降低设计成本。交通灯可以实现十字路口红绿灯的自动控制。基于FPGA的交通灯设计系统具有可靠性强、实时快速擦写、运算速度高、故障率低、电路简单,且体积小的特点。本设计采用的是Altera公司CycloneII系列的EP2C5T144芯片作为核心最小系统,它可以方便嵌入到实际的交通灯应用系统中,可以完成简单的逻辑控制、数据采集、信号处理、数学计算等功能;使用QuartusII软件作为开发平台;采用自顶向下的设计思路对系统进行模块化设计和综合,并通过波形仿真和硬件实现两种方式实现并验证交通灯的功能。关键词:交通灯、EDA、FPGA
桂林电子科技大学实训说明书用纸
Abstract EDA tools for electronic design personnel is very important, it can be in the electronic design of each stage, levels of computer simulation verification, to ensure the accuracy of the design, can shorten the design cycle, reduce design cost.The traffic light can realize intersection traffic light automatic control.Based on the FPGA of traffic light design system has the reliability, real-time fast operation speed is high, integration.it, low failure rate, circuit is simple, and the characteristics of small volume.This design USES is Altera company CycloneII series of EP2C5T144 chip as the core minimum system, it can be convenient to the actual traffic lights embedded application system, can complete the simple logic control, data acquisition, signal processing, mathematical calculations, etc;Use QuartusII software as a development platform, Using the top-down design idea of system modular design and comprehensive, and through the waveform simulation and hardware realization two ways to realize and verify the function of the traffic lights.Key words: traffic lights;EDA;FPGA
桂林电子科技大学实训说明书用纸
引言
“EDA技术”是一门实践性和实用性都很强的课程,学习的目的在于应用。本设计实训是配合“EDA技术”课堂教学的一个重要的实践教学环节,在本课程设计指导书中列举了一些常用的小型设计系统,旨在起到巩固课堂和书本上所学知识,加强综合能力,提高系统设计水平,启发创新思想的效果。
1设计任务与要求
1.1本综合设计实训任务的内容和要求
① 用EDA实训仪上的4只八段数码管分别显示道路东西和南北通行和禁止的倒计时时间。
② 能设置道路东西和南北两侧通行和禁止的倒计时时间,最大设置时间为99秒,最小设置时间为1秒。
③ 交通灯用红、绿、黄三种发光二极管(LED)显示控制的结果。④ 红、绿、黄灯显示的次序应符合实际交通道路控制的要求。系统概述及设计原理
2.1 系统的主要功能
交通灯控制电路是用于城市交通疏导的管理系统,它是现代城市交通监控指挥系统中最重要的组成部分。交通信号灯指挥着人和各种车辆的安全运行,实现红、黄、绿灯的自动指挥是城乡交通管理现代化的重要课题。在城乡街道的十字交叉路口,为了保证交通秩序和行人安全,一般在每条道路上各有一组红、黄、绿交通信号灯。交通灯控制电路自动控制十字路口两组红、黄、绿交通灯的状态转换,指挥各种车辆和行人安全通行,实现十字路口城乡交通管理自动化。设计一个十字路口交通控制器,方向分为东南西北四个方向。东西方向的红绿灯状态一样,南北方向的红绿灯状态一样。每个方向上,有四盏灯,分别是左转灯、红灯、绿灯和黄灯。左拐灯亮表示左转车辆可以通行;红灯亮表示左转和直行车辆禁行;绿灯亮表示直行车辆和右转的车辆可以通行;黄灯亮表示左转和直行的车辆即将禁行。
本论文简要介绍了FPGA器件的特点和设计意义,以QuartusII软件为开发平台,通过VHDL硬件描述语言以及原理图的输入方式来设计交通灯。交通灯控制器用于自动控制十字路口交通灯和计时器。
系统的主要功能模块方框图如图2-1所示
桂林电子科技大学实训说明书用纸
图2-1 系统主要功能模块
2.2交通灯的设计原理
交通灯控制电路的原理框图如图1.3所示。其中,clkgen是分频器,将EDA实训仪主板提供的20MHz的主频经20000000分频后,得到电路所需的1Hz(秒)时钟。Cnt10de(两个)是十进制减法计数器,产生道路东西和南北通行和禁止的倒计时时间。Contr是控制电路,控制整个系统的工作。控制器接收倒计时的结果,当倒计时归0时,改变电路的控制模式,输出倒计时的初始时间和交通灯亮灭控制信号。
图2-2 交通灯控制电路的原理图 系统各个模块的的设计与仿真
3.1 分频器模块的设计
由于采用的FPGA芯片的时钟频率是50MHz,需要将其分频为1Hz。该模块即是实现50M的分频,将频率变为1Hz的脉冲波,从而得到周期为1s的脉冲波。如果要真正的实现分频50M,在仿真结果图中是很难观察的,甚至是没有办法验证的,故在仿真过程中,将分频的倍数变小,变为20分频,这样从图中可容易的得到并验证对时钟输入信号的20分频,如图3-1所示,Reset是复位信号,CLK_50MHz是输入时钟频率,CLK_1Hz是
桂林电子科技大学实训说明书用纸
输出时钟频率,从图中可以看出,输出频率CLK_1Hz确实是输入时钟频率CLK_50MHz的20分频。
图3-1 分频器仿真图
3.2 状态控制模块的设计
状态控制模块根据输入CLK_1Hz的脉冲信号输出不同的STATUS值,下游的模块依据STATUS的值来确定红绿灯的状态;于此同时对倒计时信号赋初值。在状态控制模块仿真图中,输入信号CLK是一个频率为1Hz的时钟脉冲信号,RESET是复位信号;输出信号STATUS是状态转换信号,控制着下游交通信号灯显示模块的显示情况;LOAD_EW、LOAD_SN是东西、南北方向倒计时开始控制信号,DJS_EW、DJS_SN是东西、南北方向倒计时间信号。其仿真结果图如图3-2所示,由图可得,STATUS共有000(S1)、001(S2)、010(S3)、011(S4)、100(S5)、101(S6)共6个状态,80s为红灯和左转灯的倒计时间,45s为绿灯的倒计时间,5s是黄灯的倒计时间,和状态转换表的状态一致。
图3-2 状态控制模块仿真图
3.3 交通灯信号灯显示模块的设计
交通信号灯显示模块根据输入的STATUS信号,输出对应的红绿黄灯信号,并直接驱动交通信号灯的亮灭。在交通灯信号灯显示模块程序仿真结果图中,STATUS为输入信号,而它依赖于状态控制模块产生的信号STATUS信号,一种六种状态,依次为000(S1)、001(S2)、010(S3)、011(S4)、100(S5)、101(S6);EW_LRGY(8位)是东西方向上交通信号灯的状态,SN_LRGY(8位)是南北方向上交通信号灯的状态,依次为左转、红、绿、黄,对应着EW_LRGY、SN_LRGY的前四位,‘1’表示点亮,‘0’表示熄灭,后四位均为0,表示四个灯的阴极接负极。例如,在STATUS为001时,对应的是东西方向红灯亮,南北方向绿灯亮,仿真结果符合预期,完全正确。其仿真图如3-3所示:
图3-3 信号灯显示模块仿真图
桂林电子科技大学实训说明书用纸
3.4东西方向倒计时模块设计
东西方向倒计时模块用来接收状态控制模块的输出并作为初值,每检测到一个CLK脉冲信号,就进行减一动作,最后把减一结果输出。在该模块仿真图中,CLK为1Hz的输入信号,LOAD_EW为计数器的装载信号,当其为高电平时,将输入信号DJS_EW_IN的值装载到计数器中,并开始进行减一操作,每遇一个CLK脉冲,进行一次减一操作,并将结果输出,由于输入的时钟频率是1Hz,所以显示的时间间隔是1s,与现实生活中的时间保持一致。其仿真结果如图3-4所示,由图可得,该模块首先将80秒的倒计时信号装载进去,并进行减一操作。
图3-4 东西方向倒计时仿真图
3.5 南北方向倒计时模块设计
南北方向倒计时模块用来接收状态控制模块的输出并作为初值,每检测到一个CLK脉冲信号,就进行减一动作,最后把减一结果输出。在该模块仿真图中,CLK为1Hz的输入信号,LOAD_SN为计数器的装载信号,当其为高电平时,将输入信号DJS_SN_IN的值装载到计数器中,并开始进行减一操作,每遇一个CLK脉冲,进行一次减一操作,并将结果输出,由于输入的时钟频率是1Hz,所以显示的时间间隔是1s,与现实生活中的时间保持一致。其仿真结果如图3-5所示,由图可得,该模块将45秒的倒计时信号装载进去,并进行减一操作。
图3-5南北方向倒计时仿真图
3.6 译码模块设计
译码模块程序用来将输入的两位倒计时数值,分解成两个整形数值,以此供后面的译码显示模块译码显示。在译码程序TO_8421_BCD模块仿真图中,DJS_EW_OUT,DJS_SN_OUT为上一倒计时模块的输出信号,其范围在0~80,所有倒计时的范围都包含其内;DJS_EW_OUT_SW,DJS_EW_OUT_GW,DJS_SN_OUT_SW,DJS_SN_OUT_GW为输出信号,其范围为0~9,代表了各个方向的倒计时的十位和个位,且数码管所有显示数字的范围均在其内。例如图中DJS_EW_OUT的值不断变化,相应的依次将其分解为十位(DJS_EW_OUT_SW)和个位(DJS_EW_OUT_GW),并依次递减,仿真结果符合预期,完全正确。仿真结果如图3-6所示:
桂林电子科技大学实训说明书用纸
图3-6 译码仿真结果图
3.7 译码显示模块设计
译码显示模块将上一模块译码模块输出的四个一位数译码成相对应的七位数码管段码,完成倒计时的译码和显示。在译码显示模块仿真图中,DJS_ EW_OUT_ SW,DJS_EW_OUT_GW,DJS_SN_OUT_SW,DJS_SN_OUT_GW是四位的输入信号,也是上一模块TO_8421_BCD的输出信号,它们的范围为数字0~9,DJS_EW_ OUT_SW1,DJS_ EW_ OUT_GW1,DJS_SN_OUT_SW1,DJS_SN_OUT_GW1对应的是相应的七位数码管显示段码的值。图中输出信号的值随着输入信号的变化而相应的变化,例如DJS_EW_OUT_SW为7,DJS_EW_OUT_GW为5时,DJS_EW_OUT_SW1为00000111(a、b、c、d、e、f、g依次对应着1110000,最高位的0表示是数码管的类型是共阴的),表示数码管显示7,DJS_EW_OUT_GW1为01101101,表示数码管显示5。仿真完全正确,符合预期。其仿真结果如图3-7所示:
图3-7 译码显示模块仿真图
3.8 顶层文件模块设计
顶层设计采用VHDL语言描述方式实现,并在工程文件仿真过后通过工具菜单自动生成原理图文件,从而是设计原理更加清晰明朗。
在顶层设计VHDL描述中,共包含7个元件,分别是:
1、分频器模块,2、状态控制模块,3、交通信号灯显示模块,4、东西方向倒计时模块设计,5、南北方向倒计时模块设计,6、译码模块设计,7、译码显示模块设计。这7个模块经过程序设计、编译仿真,结果均能够达到设计要求。最后在顶层设计中,通过元件例化语句将这7个模块连接起来,生成顶层文件。在顶层设计中,RESET是复位信号,输入的时钟频率CLK是50MHz,经过分频50M的分频器后,变为频率为1Hz的时钟信号,周期为1s,用此时钟信号来控制整个系统的步调,与现实生活中交通灯的步调保持一致。EW_LRGY、SN_LRGY分别为东西和南北方向上交通信号灯的状态,EW_DJS_DISPLAY、SN_DJS_DISPLAY为东西
桂林电子科技大学实训说明书用纸
和南北方向红绿灯倒计时间。另外,所有的数码管和二极管均为共阴极显示。例如,在EW_LRGY为01000000(即东西方向红灯亮)、SN_LRGY为10000000(即南北方向左转灯亮)时,EW_DJS_DISPLAY的前八位表示倒计时的十位,后八位表示倒计时的个位;图中EW_DJS_DISPLAY的前八位都是00000111表示7,后八位01111101表示6,后八位01101101表示5,后八位01100110表示4;SN_DJS_DISPLAY的前八位是01001111表示3,后八位01011011表示2,后八位00000110表示1,后八位00111111表示0,以上表明红绿灯和倒计时时间显示符合预期。仿真结果如图3-8所示:
图3-8 顶层文件波形仿真图 实训心得体会
本次EDA技术实训的交通灯采用的是Altera公司CycloneII系列的EP2C5T144芯片作为核心最小系统,它可以方便嵌入到实际的交通灯应用系统中,可以完成简单的逻辑控制、数据采集、信号处理、数学计算等功能;使用QuartusII软件作为开发平台;采用自顶向下的设计思路对系统进行模块化设计和综合,并通过波形仿真和硬件实现两种方式实现并验证交通灯的功能。为期两周的实训,我利用网络和图书馆的有效资源,搜集并下载了大量的关于用FPGA做交通灯设计的资料;然后精心阅读,在老师的指导督促下,并和周围同学进行有效学习和沟通,最终确定了自己的设计方案;最后按照既定的设计方案,通过努力有步骤的实现了交通灯的设计。
通过此次实训设计,让我加深了FPGA的理解,更加熟练了VHDL语言,同时,我深深体会到了通过FPGA设计数字电路的方便、简洁的特点,这让我相信未来数字电路的应用必将更加广泛。另外,我还体会到:从事开发设计工作,一定要保持个勤奋、踏实、严谨的工作态度,这样才能更好的完成工作。最后,我觉得在交通灯控制系统设计中还可以增加一些实用功能,如:
1、针对弱视或色盲人群进行声音提示;
2、在遇到突发状况时,可以将红绿灯改为紧急模式控制;
3、当有119、120等特种车辆通过时,系统可转为特种车放行,其他车辆禁行。
但是这次实训我也发现自己的很多不足之处。在设计过程中我发现自己考虑问题很不全面,自己的专业知识掌握的很不牢靠,所掌握的编程语句还不够,很多程序都看不懂,我希望自己的这些不足之处能在今后的工作和学习中得到改善。而且,通过这次实训,我懂得了学习的重要性,学会了坚持和努力,这将为以后的学习做出了最好的榜样!
桂林电子科技大学实训说明书用纸
还有光有知识是不行的,还得有能力、有技术,单干也是不行的,要适当寻求合作,那样才能更好实现我们的价值。在实训中及社会上,我们都要懂得虚心地向别人学习,即使你觉得自己很厉害,但总有一些东西你是不懂的,所以不懂要多向别人请教,这样才能更好地提高自己的水平和能力,全面发展自己。
桂林电子科技大学实训说明书用纸
谢 辞
在这短短的两周EDA实训中,在这期间同学们都在努力学习,认真做自己各自的实训。在此我要特别感谢各位指导老师们对我的指导,还有各位同学对我的帮助,尤其感谢老师在百忙之中抽出时间为我们讲解设计原理,同时,还要感谢和我一起努力的各位同学,在他们对我的帮助很我自己的努力下,我才能顺利地完成这次实训。
这次实训我受匪颇多,但这多是得益于老师无微不至的关心和细心的教导。在实训中,让我学到了不少知识,给了我一次复习学过的知识的机会,巩固了基础知识。也多亏同学们的无私的帮助和支持,在我无助的时候还是他们伸出他们的友爱之手,帮我渡过难关,在此我也真心的多谢他们默默的帮助。最后再次对老师们说声:谢谢!
桂林电子科技大学实训说明书用纸
参考文献
[1] 潘松,黄继业.EDA技术实用教程(第三版).北京:科学出版社,2010.1 [2] 刘江海,涂传威,陈玮.EDA技术课程设计.武汉:华中科技大学出版社,2009.5 [3] 夏路易.基于EDA的电子技术课程设计.北京:电子工业出版社,2009.1 [4] 王金明,周顺.数字系统设计与VHDL.北京:电子工业出版社,2010.5 [5] 邹彦,庄严,邹宁.EDA技术与数字系统设计.北京:电子工业出版社,2007.4 [6] 林明权,马维旻.VHDL数字控制系统设计范例.北京:电子工业出版社,2003.1