《课程设计(论文)-基于FPGA的交通灯控制器》由会员分享,可在线阅读,更多相关《课程设计(论文)-基于FPGA的交通灯控制器(15页珍藏版)》请在金锄头文库上搜索。
1、 基于 FPGA 的交通灯控制器 课 程 设 计学生姓名: 王军峰 学 号: 专业班级: 集成电路 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 位十
4、进制数。50Mflagretr1 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,则输入七段显
6、示码是“”(低电平点亮),而且这个码字的每个位所对应位置和如图 2 相同,顺序是“pgfedcba”。依此类推可得到 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.分
8、频器的仿真:由于分频器将 50MHZ 的时钟信号分频为 1HZ 的时钟信号仿真时耗时大,故仿真时采用 100ns时钟并进行分频,End time 设为 100ms,耗时 5min 左右。仿真结果如下:仿真波形 1仿真波形 2仿真波形 32.结果仿真:主干道显示 45 秒支干道显示 40 秒时,主干道显示 44 秒支干道显示 39 秒时,主干道显示 43 秒支干道显示 38 秒时,主干道显示 42 秒支干道显示 37 秒时,经功能仿真测试,符合预期结果,程序设计正确。五、程序设计1.端口声明:module tra (clk,ret,flag,led0,led1,led2,led3,red1,ye
9、llow1,green1,red2,yellow2,green2);input clk,ret,flag;output 7:0 led0,led1,led2,led3;output red1,yellow1,green1,red2,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,
10、num2;reg 25:0 count=26b0;reg 15:0 mount;reg clk_1hz,en,en1,en2;2.分频模块:分频器实现的是将高频时钟信号转换成低频的时钟信号,用于触发控制器和显示器。 ,因为开发板上的时钟比较大,如果要想观察到结果必须对它进行分频,在分频的时候由于开发板上的时钟是 50M 的所以采用了一个 32 的计数器,当时钟的上升沿到来的时候判断计数器是不是为 ,如果是的话清零,否侧加一然后在进行判断。分频器是将 50MHZ 的时钟信号分频成1HZ 的时钟信号,程序代码如下:always (posedge clk )if(count26b 0000)coun
11、t=count+1;elsebegincount=0;clk_1hz=clk_1hz;end3.交通灯控制模块:两个方向各种灯亮的时间能够进行设置与修改,此外假设 A 方向是主干道,车流量最大,因此 A 方向通行的时间应该比 B 方向长。A 方向和 B 方向的红,黄,绿分别用red1,yellow1 ,green1 ;red2 ,yellow2, green2 来表示。每个方向四种灯按以下顺序点亮,并不断循环:红灯黄灯绿灯。并且每个方向红灯亮的时间应该与另一方向绿,黄灯亮的时间相等。黄灯所起的作用是用来在绿灯后进行缓冲,以提醒行人该方向马上要禁止了。程序代码如下:assign h_sec1,l
12、_sec1,h_sec2,l_sec2=num1,num2;always (posedge clk_1hz or negedge ret)if (!ret)beginstate=2d0;red1,yellow1,green1,red2,yellow2,green2=6b;num1=8b;num2=8b;en=1b0;en1=1b1;en2=1b1;endelsebegin if(!flag)beginif(en)beginnum1,num2=mount;red1,yellow1,green1,red2,yellow2,green2=light;en=1d0;en1=1b1;endelsecas
13、e(state)2d0:beginred2=1b0;red1=1b1;yellow1=1b0;yellow2=1b0;green2=1b1;num1=8b;num2=8b;state=2b1;end2d1:beginif(!num13:0) if(!num17:4)beginstate=2d2;endelse beginnum17:4=num17:4-4d1;num13:0=4d9;endelsenum13:0=num13:0-4d1;if(!num23:0)if(!num27:4)if(en2)begingreen2=1d0;yellow2=1d1;num23:0=4d4;en2=1b0;e
14、ndelsebegingreen1=1b1;red1=1b0;yellow2=1b0;red2=1b1;num1=8b;num2=8b;en2=1b1;endelse beginnum27:4=num17:4-4d1;num23:0=4d9;endelse num23:0=num23:0-4d1;end2d2:beginif(!num23:0)if(!num27:4)beginstate=2d1;endelse beginnum27:4=num27:4-4d1;num23:0=4d9;endelsenum23:0=num23:0-4d1;if(!num13:0)if(!num17:4)if(en2)begingreen1=1d0;yellow1=1d1;num13:0=4d4;en2=1b0;endelsebeginred2=1b0;red1=1b1;yellow1=1b0;yellow2=1b0;green2=1b1