课程设计(论文)基于FPGA的交通灯控制器.doc

上传人:仙人指路1688 文档编号:3993415 上传时间:2023-03-30 格式:DOC 页数:15 大小:646.50KB
返回 下载 相关 举报
课程设计(论文)基于FPGA的交通灯控制器.doc_第1页
第1页 / 共15页
课程设计(论文)基于FPGA的交通灯控制器.doc_第2页
第2页 / 共15页
课程设计(论文)基于FPGA的交通灯控制器.doc_第3页
第3页 / 共15页
课程设计(论文)基于FPGA的交通灯控制器.doc_第4页
第4页 / 共15页
课程设计(论文)基于FPGA的交通灯控制器.doc_第5页
第5页 / 共15页
点击查看更多>>
资源描述

《课程设计(论文)基于FPGA的交通灯控制器.doc》由会员分享,可在线阅读,更多相关《课程设计(论文)基于FPGA的交通灯控制器.doc(15页珍藏版)》请在三一办公上搜索。

1、 基于FPGA的交通灯控制器课程设计学生姓名: 王军峰 学 号: 04076026 专业班级: 集成电路0701 指导教师: 刘有耀 2010 年 7月 2日目 录 一、 设计任务:3二、 题目分析与整体构思:3三、 硬件电路设计4四、 验证仿真 6五、 程序设计8六、 验证设计13七、 故障及问题分解 14八、 心得体会:14九、参考文献:15一、 设计任务(一)有一条主干道和一条支干道的汇合点形成十字交叉路口,主干道为东西向,支干道为南北向。为确保车辆安全,迅速地通行,在交叉道口的每个入口处设置了红,绿,黄3色信号灯。(二)要求:(1)主干道绿灯亮时,支干道红灯亮,反之亦然,两者交替允许通

2、行,主干道每次放行45s,支干道每次放行40s。每次由绿灯变为红灯的过程中,黄灯亮5s作为过渡。(2)能实现正常的倒计时显示功能。(3)能实现总体清零功能:计数器由初始状态开始计数,对应状态的指示灯亮。(4)能实现特殊状态的功能显示:进入特殊状态时,东西、南北路口均显示红灯状态。二、题目分析与整体构思(一)该交通灯控制器应具备的功能主干道绿灯45sec,支干道绿灯40sec,黄灯5sec过渡。同时用数码管指示当前状态(红、黄、绿)剩余时间。另外,设计一个紧急状态和复位状态,当紧急状态出现时,两个方向都禁止通行,指示红灯;紧急状态解除后,指示紧急状态前的时间。当复位状态出现时,整个系统恢复起始状

3、态。 (二)实现方案从题目中计数值与交通灯的亮灭的关系如图(1)所示。当主干道绿灯40秒和5秒黄灯过渡时,支干道必须禁止通行,即支干道红灯亮40+5=45秒;当支干道由红灯转为绿灯时,支干道亮40秒绿灯和5秒黄灯过渡,此时主干道红灯应亮40+5=45秒。 0 40s 45s 90s 绿灯亮 黄灯亮 红灯亮 主干道时间 支干道红灯亮 绿灯亮 黄灯亮 45s 85s 90s 图1图(2)为各个模块组成图,显示器模块其功能是输出主干道和支干道的倒计时数。该模块输入为1KHZ的动态扫描时钟信号和4个09的十进制数;输出由LED七段数码管显示输入的4位十进制数。显示模块 控制器分频器50Mflag re

4、tr1 y1 g1 r2 y2 g2 红绿灯显示 图2三硬件电路设计动态LED显示的设计方法是将不同LED模块的所有的LED的驱动端一对一地连接到一起,而将其公共极(阴极或阳极)分别由不同的IO口来驱动(主要针对7段码和LED点阵模块)。动态显示方式主要是出于简化电路和产品成本考虑在大多数场合都可以达到用户要求。动态显示虽然占用的CPU时间多,但使用的硬件少,能节省线路板空间。另外,本设计显示需要使用的是4个七段显示数码管。在计时结果显示电路中,七段数码管显示部分是一个不容忽视的环节,如若处理不得当,可能引起系统功率过大,产生散热问题,严重时甚至会导致系统的烧毁。为了解决好以上问题,下面就对七

5、段数码管显示电路做简要的分析和介绍。通常点亮一个LED所需的电流是550 mA,通电的电流愈大,LED的亮度愈高,相对的也会使其寿命缩短。一般以10 mA的导通电流来估算它所必须串联的阻值,其计算方式参考如图1所示。图1 单个LED的串接电阻计算方式七段显示器可分为共阳极、共阴极型两种,它们都可以等效成8个LED的连接电路,其中如图2就是共阴极型七段显示器的等效电路和每节LED的定义位置图。 因此,若要点亮七段显示器以实现一个3的数字符号并不点亮P点LED,则输入七段显示码是“10110000”(低电平点亮),而且这个码字的每个位所对应位置和如图2相同,顺序是“pgfedcba”。依此类推可得

6、到09的显示码。 图2 共阴极型七段显示器的LED位置定义和等效电路由于本设计的目标是设计倒计时显示系统,要求显示4个09的数字,依照图1的计算方式,同时点亮个七段显示器的8节LED,结果将需电流为10 mA880 mA。若再进步同时点亮4个七段显示器,这时所需电流为80 mA4=320mA。这对于一般的电子电路来说,是一个不小的电流,不但CPLDFPGA无法负荷这样的电流驱动,而且这个功率也太大,散热也是问题,电路容易被烧毁。因此显示电路部分不能直接实现各个计时结果同时显示,只能另外通过一个扫描电路对计时输出进行逐个扫描,使七段数码管以两个为一个组,逐个进行显示。只要每个扫描频率超过人的眼睛

7、视觉暂留频率24 Hz,就可以达到点亮两个七段数码管,却能享有所有七段数码管同时显示的视觉效果,而且显示也不致闪烁抖动,从而间接实现计时结果同时显示。故输入除了四个十进制数外,还需要1KHZ的时钟信号进行扫描显示。对于输出,则需要设置一个片选信号(高电平选中),如下图所示要点亮4个数码显示灯则需要4位的片选信号,即如右图所示的ledout30,在1KHZ的时钟频率扫描下即可显示出主干道和支干道的倒计时数。四、验证仿真1.分频器的仿真:由于分频器将50MHZ的时钟信号分频为1HZ的时钟信号仿真时耗时大,故仿真时采用100ns时钟并进行分频,End time设为100ms,耗时5min左右。仿真结

8、果如下: 仿真波形1仿真波形2仿真波形32.结果仿真:主干道显示45秒支干道显示40秒时,主干道显示44秒支干道显示39秒时,主干道显示43秒支干道显示38秒时,主干道显示42秒支干道显示37秒时,经功能仿真测试,符合预期结果,程序设计正确。五、程序设计1.端口声明:module tra (clk,ret,flag,led0,led1,led2,led3,red1,yellow1,green1,red2,yellow2,green2);input clk,ret,flag;output 7:0 led0,led1,led2,led3;output red1,yellow1,green1,red

9、2,yellow2,green2; wire clk,ret,flag;reg red1,yellow1,green1,red2,yellow2,green2;reg 7:0 led0,led1,led2,led3;wire 3:0 h_sec1,l_sec1,h_sec2,l_sec2;reg 1:0 state;reg 5:0 light;reg 7:0 num1,num2;reg 25:0 count=26b0;reg 15:0 mount;reg clk_1hz,en,en1,en2;2.分频模块:分频器实现的是将高频时钟信号转换成低频的时钟信号,用于触发控制器和显示器。,因为开发板上

10、的时钟比较大,如果要想观察到结果必须对它进行分频,在分频的时候由于开发板上的时钟是50M的所以采用了一个32的计数器,当时钟的上升沿到来的时候判断计数器是不是为 500000,如果是的话清零,否侧加一然后在进行判断。分频器是将50MHZ的时钟信号分频成1HZ的时钟信号,程序代码如下:always (posedge clk )if(count26b 01011111010111100001000000) count=count+1;else begin count=0; clk_1hz=clk_1hz;end3.交通灯控制模块:两个方向各种灯亮的时间能够进行设置与修改,此外假设A方向是主干道,车

11、流量最大,因此A方向通行的时间应该比B方向长。A方向和B方向的红,黄,绿分别用red1,yellow1,green1;red2,yellow2, green2来表示。每个方向四种灯按以下顺序点亮,并不断循环:红灯黄灯绿灯。并且每个方向红灯亮的时间应该与另一方向绿,黄灯亮的时间相等。黄灯所起的作用是用来在绿灯后进行缓冲,以提醒行人该方向马上要禁止了。程序代码如下:assign h_sec1,l_sec1,h_sec2,l_sec2=num1,num2;always (posedge clk_1hz or negedge ret)if (!ret)beginstate=2d0;red1,yello

12、w1,green1,red2,yellow2,green2=6b010010;num1=8b00000000;num2=8b00000000;en=1b0;en1=1b1;en2=1b1;endelsebegin if(!flag) begin if(en) begin num1,num2=mount; red1,yellow1,green1,red2,yellow2,green2=light; en=1d0; en1=1b1; end else case(state) 2d0: begin red2=1b0; red1=1b1; yellow1=1b0; yellow2=1b0; green

13、2=1b1; num1=8b01000101; num2=8b01000000; state=2b1; end 2d1: begin if(!num13:0) if(!num17:4) begin state=2d2; end else begin num17:4=num17:4-4d1; num13:0=4d9; end else num13:0=num13:0-4d1; if(!num23:0) if(!num27:4) if(en2) begin green2=1d0; yellow2=1d1; num23:0=4d4; en2=1b0; end else begin green1=1b

14、1; red1=1b0; yellow2=1b0; red2=1b1; num1=8b01000000; num2=8b01000101; en2=1b1; end else begin num27:4=num17:4-4d1; num23:0=4d9; end else num23:0=num23:0-4d1; end2d2: begin if(!num23:0) if(!num27:4) begin state=2d1; end else begin num27:4=num27:4-4d1; num23:0=4d9; end else num23:0=num23:0-4d1; if(!nu

15、m13:0) if(!num17:4) if(en2) begin green1=1d0; yellow1=1d1; num13:0=4d4; en2=1b0; end else begin red2=1b0; red1=1b1; yellow1=1b0; yellow2=1b0; green2=1b1; en2=1b1; num1=8b01000101; num2=8b01000000; end else begin num17:4=num17:4-4d1; num13:0=4d9; end else num13:0=num13:0-4d1; endendcaseendelse begin

16、if (en1) begin en1=1b0; en=1b1; mount=num1,num2; light=red1,yellow1,green1,red2,yellow2,green2; end else begin num1,num2=16b1000100010001000; red1,yellow1,green1,red2,yellow2,green2=6b100100; endendend4. 显示器模块:本模块的设计是在FPGA开发板上设置输出与输入来验证自己的设计是不是正确。采用的是静态数码管显示。程序代码如下:always (posedge clk_1hz) begin cas

17、e(h_sec1)4b0000: led0=8b00000011;4b0001:led0=8b10011111;4b0010:led0=8b00100101;4b0011: led0=8b00001101;4b0100:led0=8b10011001;4b0101:led0=8b01001001; 4b0110:led0=8b01000001;4b0111:led0=8b00011111;4b1000: led0=8b00000001;4b1001:led0=8b00001001; endcasecase(l_sec1)4b0000: led1=8b00000011;4b0001:led1=8

18、b10011111;4b0010:led1=8b00100101;4b0011: led1=8b00001101;4b0100:led1=8b10011001;4b0101:led1=8b01001001; 4b0110:led1=8b01000001; 4b0111:led1=8b00011111;4b1000: led1=8b00000001;4b1001:led1=8b00001001; endcasecase(h_sec2)4b0000: led2=8b00000011;4b0001:led2=8b10011111;4b0010:led2=8b00100101;4b0011: led2

19、=8b00001101;4b0100:led2=8b10011001;4b0101:led2=8b01001001; 4b0110:led2=8b01000001;4b0111:led2=8b00011111;4b1000: led2=8b00000001;4b1001:led2=8b00001001; endcasecase(l_sec2)4b0000: led3=8b00000011;4b0001:led3=8b10011111;4b0010:led3=8b00100101;4b0011: led3=8b00001101;4b0100:led3=8b10011001;4b0101:led3

20、=8b01001001; 4b0110:led3=8b01000001;4b0111:led3=8b00011111;4b1000: led3=8b00000001;4b1001:led3=8b00001001; endcaseendendmodule六、 验证设计;通过在quartus2软件里布局布线然后把程序下载到FPGA开发板上在数码管上观察显示的结果是不是符合自己的设计。布局布线的结果如下:七、故障及问题分解:1 开始时,对实验及模块概念理解不透彻,以致思路不够清楚,处于模糊状态,通过查看参考资料,对模块及实验对象有了清楚的认识,重新设计各模块,使条理清楚、思路明朗,程序后来的编制也就

21、容易了很多。2 计时模块,是显示部件的核心。开始时,在赋值及输出控制信号部分无法正确配合,状态机各状态之间的转换成为最大的问题(各模块编译成功后,顶层编译也能通过,可就是总体仿真出问题,问题主要是它总是处于一个状态不改变)。分析原因是交通灯的状态由计时模块输出的使能信号确定,因此问题就出在计时模块上。后来发现只需在控制模块加一个输出信号即可。3. 开关的连接方式很多,对于不同的要求有不同的连接方法。八、心得体会:这次EDA课程设计历时两个星期,在整整两个星期的日子里,可以说是苦多于甜,但是可以学的到很多很多的东西,同时不仅可以巩固以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过

22、这次设计,进一步加深了对EDA的了解,让我对它有了更加浓厚的兴趣。特别是当每一个子模块编写调试成功时,心里特别的开心。但是在编写顶层文件的程序时,遇到了不少问题,特别是各元件之间的连接,以及信号的定义,总是有错误,在细心的检查下,终于找出了错误和警告,排除困难后,程序编译就通过了,心里终于舒了一口气。在波形仿真时,也遇到了一点困难,想要的结果不能在波形上得到正确的显示:在设定输入的时钟信号后,始终看不到主干道按绿-黄-红而同时支干道按红-绿-黄的周期变化。后来,在数十次的调试之后,才发现是因为输入的时钟信号对于一个红绿灯显示的周期时间来说太短了。经过屡次调试,终于找到了比较合适的输入数值:时钟

23、周期设置在100us左右比较合适。另外,Endtime的值需要设置的长一点:100ms左右,这样就可以观察到完整的仿真结果;如果不想看到因时间设置得较小时序仿真时出现微小延时,则进行功能仿真。其次,在连接各个模块的时候一定要注意各个输入、输出引脚的线宽,因为每个线宽是不一样的,只要让各个线宽互相匹配,才能得出正确的结果,否则,出现任何一点小的误差就会导致整个文件系统的编译出现错误提示,在器件的选择上也有一定的技巧,只有选择了合适当前电路所适合的器件,编译才能得到完满成功。再次,设置黄灯5秒过渡时始终显示的是从40而不是从50,如果设置了从50,相比之下接着的红灯就会慢了一秒亮。刚开始以为这是程

24、序的错误,经过仔细的思考才发现其实从40变化已经是5秒了,并不是错误。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。总的来说,整体模块的设计还是比较成功的,在设计中遇到了很多问题,最后在同学和老师的帮助下,终于游逆而解,有点小小的成就感,终于觉得平时所学的知识有了实用的价值,达到了理论与实际相结合的目的,不仅学到了不少知识,而且锻炼了自己的能力,使自己对以后的路有了更加清楚的认识。最后,对给过我帮助的所有同学和指导老师表示忠心的感谢。九、参考文献:1黄智伟,FPGA系统设计与实践,电子工业出版社,2005年1月,P2602632刘昌华,数字逻辑EDA设计与实践(第1版),国防工业出版社,2006年8月,P332P3443潘松、黄继业,EDA技术与VHDL(第2版),清华大学出版社,2007年1月,P141P1434江思敏,VHDL数字电路及系统设计,机械工业出版社,2006年8月,P175P177

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 办公文档 > 其他范文


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号