FPGA 交通灯控制器的课程设计.docx

上传人:b****8 文档编号:9861016 上传时间:2023-02-07 格式:DOCX 页数:21 大小:441.50KB
下载 相关 举报
FPGA 交通灯控制器的课程设计.docx_第1页
第1页 / 共21页
FPGA 交通灯控制器的课程设计.docx_第2页
第2页 / 共21页
FPGA 交通灯控制器的课程设计.docx_第3页
第3页 / 共21页
FPGA 交通灯控制器的课程设计.docx_第4页
第4页 / 共21页
FPGA 交通灯控制器的课程设计.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

FPGA 交通灯控制器的课程设计.docx

《FPGA 交通灯控制器的课程设计.docx》由会员分享,可在线阅读,更多相关《FPGA 交通灯控制器的课程设计.docx(21页珍藏版)》请在冰豆网上搜索。

FPGA 交通灯控制器的课程设计.docx

FPGA交通灯控制器的课程设计

基于FPGA的交通灯控制器

目录

一、设计任务:

………………………………………………………3

二、题目分析与整体构思:

………………………………………3

三、硬件电路设计…………………………………………………4

四、验证仿真………………………………………………………6

五、程序设计………………………………………………………8

六、验证设计………………………………………………………13

七、故障及问题分解……………………………………………14

八、心得体会:

……………………………………………………14

九、参考文献:

……………………………………………………15

一、设计任务

(一)有一条主干道和一条支干道的汇合点形成十字交叉路口,主干道为东西向,支干道为南北向。

为确保车辆安全,迅速地通行,在交叉道口的每个入口处设置了红,绿,黄3色信号灯。

(二)要求:

(1)主干道绿灯亮时,支干道红灯亮,反之亦然,两者交替允许通行,主干道每次放行45s,支干道每次放行40s。

每次由绿灯变为红灯的过程中,黄灯亮5s作为过渡。

(2)能实现正常的倒计时显示功能。

(3)能实现总体清零功能:

计数器由初始状态开始计数,对应状态的指示灯亮。

(4)能实现特殊状态的功能显示:

进入特殊状态时,东西、南北路口均显示红灯状态。

二、题目分析与整体构思

(一)该交通灯控制器应具备的功能

主干道绿灯45sec,支干道绿灯40sec,黄灯5sec过渡。

同时用数码管指示当前状态(红、黄、绿)剩余时间。

另外,设计一个紧急状态和复位状态,当紧急状态出现时,两个方向都禁止通行,指示红灯;紧急状态解除后,指示紧急状态前的时间。

当复位状态出现时,整个系统恢复起始状态。

(二)实现方案

从题目中计数值与交通灯的亮灭的关系如图

(1)所示。

当主干道绿灯40秒和5秒黄灯过渡时,支干道必须禁止通行,即支干道红灯亮40+5=45秒;当支干道由红灯转为绿灯时,支干道亮40秒绿灯和5秒黄灯过渡,此时主干道红灯应亮40+5=45秒。

040s45s90s

绿灯亮黄灯亮红灯亮

主干道

时间

支干道

红灯亮绿灯亮黄灯亮

45s85s90s图1

(2)为各个模块组成图,显示器模块其功能是输出主干道和支干道的倒计时数。

该模块输入为1KHZ的动态扫描时钟信号和4个0~9的十进制数;输出由LED七段数码管显示输入的4位十进制数。

50M

flag

ret

r1y1g1r2y2g2

红绿灯显示图2

三﹑硬件电路设计

动态LED显示的设计方法是将不同LED模块的所有的LED的驱动端一对一地连接到一起,而将其公共极(阴极或阳极)分别由不同的IO口来驱动(主要针对7段码和LED点阵模块)。

动态显示方式主要是出于简化电路和产品成本考虑在大多数场合都可以达到用户要求。

动态显示虽然占用的CPU时间多,但使用的硬件少,能节省线路板空间。

另外,本设计显示需要使用的是4个七段显示数码管。

在计时结果显示电路中,七段数码管显示部分是一个不容忽视的环节,如若处理不得当,可能引起系统功率过大,产生散热问题,严重时甚至会导致系统的烧毁。

为了解决好以上问题,下面就对七段数码管显示电路做简要的分析和介绍。

通常点亮一个LED所需的电流是5~50mA,通电的电流愈大,LED的亮度愈高,相对的也会使其寿命缩短。

一般以10mA的导通电流来估算它所必须串联的阻值,其计算方式参考如图1所示。

  图1单个LED的串接电阻计算方式

七段显示器可分为共阳极、共阴极型两种,它们都可以等效成8个LED的连接电路,其中如图2就是共阴极型七段显示器的等效电路和每节LED的定义位置图。

  

因此,若要点亮七段显示器以实现一个3的数字符号并不点亮P点LED,则输入七段显示码是“10110000”(低电平点亮),而且这个码字的每个位所对应位置和如图2相同,顺序是“pgfedcba”。

依此类推可得到0~9的显示码。

图2共阴极型七段显示器的LED位置定义和等效电路

由于本设计的目标是设计倒计时显示系统,要求显示4个0~9的数字,依照图1的计算方式,同时点亮-个七段显示器的8节LED,结果将需电流为10mA×8=80mA。

若再进-步同时点亮4个七段显示器,这时所需电流为80mA×4=320mA。

这对于一般的电子电路来说,是一个不小的电流,不但CPLD&FPGA无法负荷这样的电流驱动,而且这个功率也太大,散热也是问题,电路容易被烧毁。

因此显示电路部分不能直接实现各个计时结果同时显示,只能另外通过一个扫描电路对计时输出进行逐个扫描,使七段数码管以两个为一个组,逐个进行显示。

只要每个扫描频率超过人的眼睛视觉暂留频率24Hz,就可以达到点亮两个七段数码管,却能享有所有七段数码管同时显示的视觉效果,而且显示也不致闪烁抖动,从而间接实现计时结果同时显示。

故输入除了四个十进制数外,还需要1KHZ的时钟信号进行扫描显示。

对于输出,则需要设置一个片选信号(高电平选中),如下图所示

要点亮4个数码显示灯则需要4位的片选信号,即如右图所示的ledout[3…0],在1KHZ的时钟频率扫描下即可显示出主干道和支干道的倒计时数。

 

四、验证仿真

1.分频器的仿真:

由于分频器将50MHZ的时钟信号分频为1HZ的时钟信号仿真时耗时大,故仿真时采用100ns时钟并进行分频,Endtime设为100ms,耗时5min左右。

仿真结果如下:

仿真波形1

仿真波形2

仿真波形3

2.结果仿真:

主干道显示45秒支干道显示40秒时,

主干道显示44秒支干道显示39秒时,

主干道显示43秒支干道显示38秒时,

主干道显示42秒支干道显示37秒时,

经功能仿真测试,符合预期结果,程序设计正确。

五、程序设计

1.端口声明:

moduletra(clk,ret,flag,led0,led1,led2,led3,red1,yellow1,green1,red2,yellow2,green2);

inputclk,ret,flag;

output[7:

0]led0,led1,led2,led3;

outputred1,yellow1,green1,red2,yellow2,green2;

wireclk,ret,flag;

regred1,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=26'b0;

reg[15:

0]mount;

regclk_1hz,en,en1,en2;

2.分频模块:

分频器实现的是将高频时钟信号转换成低频的时钟信号,用于触发控制器和显示器。

,因为开发板上的时钟比较大,如果要想观察到结果必须对它进行分频,在分频的时候由于开发板上的时钟是50M的所以采用了一个32的计数器,当时钟的上升沿到来的时候判断计数器是不是为500000,如果是的话清零,否侧加一然后在进行判断。

分频器是将50MHZ的时钟信号分频成1HZ的时钟信号,程序代码如下:

always@(posedgeclk)

if(count<26'b01011111010111100001000000)

count<=count+1;

else

begin

count<=0;

clk_1hz<=~clk_1hz;

end

3.交通灯控制模块:

两个方向各种灯亮的时间能够进行设置与修改,此外假设A方向是主干道,车流量最大,因此A方向通行的时间应该比B方向长。

A方向和B方向的红,黄,绿分别用red1,yellow1,green1;red2,yellow2,green2来表示。

每个方向四种灯按以下顺序点亮,并不断循环:

红灯——黄灯——绿灯。

并且每个方向红灯亮的时间应该与另一方向绿,黄灯亮的时间相等。

黄灯所起的作用是用来在绿灯后进行缓冲,以提醒行人该方向马上要禁止了。

程序代码如下:

assign{h_sec1,l_sec1,h_sec2,l_sec2}={num1,num2};

always@(posedgeclk_1hzornegedgeret)

if(!

ret)

begin

state<=2'd0;

{red1,yellow1,green1,red2,yellow2,green2}<=6'b010010;

num1<=8'b00000000;

num2<=8'b00000000;

en<=1'b0;

en1<=1'b1;

en2<=1'b1;

end

else

begin

if(!

flag)

begin

if(en)

begin

{num1,num2}<=mount;

{red1,yellow1,green1,red2,yellow2,green2}<=light;

en<=1'd0;

en1<=1'b1;

end

else

case(state)

2'd0:

begin

red2<=1'b0;

red1<=1'b1;

yellow1<=1'b0;

yellow2<=1'b0;

green2<=1'b1;

num1<=8'b01000101;

num2<=8'b01000000;

state<=2'b1;

end

2'd1:

begin

if(!

num1[3:

0])

if(!

num1[7:

4])

begin

state<=2'd2;

end

else

begin

num1[7:

4]<=num1[7:

4]-4'd1;

num1[3:

0]<=4'd9;

end

else

num1[3:

0]<=num1[3:

0]-4'd1;

if(!

num2[3:

0])

if(!

num2[7:

4])

if(en2)

begin

green2<=1'd0;

yellow2<=1'd1;

num2[3:

0]<=4'd4;

en2<=1'b0;

end

else

begin

green1<=1'b1;

red1<=1'b0;

yellow2<=1'b0;

red2<=1'b1;

num1<=8'b01000000;

num2<=8'b01000101;

en2<=1'b1;

end

else

begin

num2[7:

4]<=num1[7:

4]-4'd1;

num2[3:

0]<=4'd9;

end

else

num2[3:

0]<=num2[3:

0]-4'd1;

end

2'd2:

begin

if(!

num2[3:

0])

if(!

num2[7:

4])

begin

state<=2'd1;

end

else

begin

num2[7:

4]<=num2[7:

4]-4'd1;

num2[3:

0]<=4'd9;

end

else

num2[3:

0]<=num2[3:

0]-4'd1;

if(!

num1[3:

0])

if(!

num1[7:

4])

if(en2)

begin

green1<=1'd0;

yellow1<=1'd1;

num1[3:

0]<=4'd4;

en2<=1'b0;

end

else

begin

red2<=1'b0;

red1<=1'b1;

yellow1<=1'b0;

yellow2<=1'b0;

green2<=1'b1;

en2<=1'b1;

num1<=8'b01000101;

num2<=8'b01000000;

end

else

begin

num1[7:

4]<=num1[7:

4]-4'd1;

num1[3:

0]<=4'd9;

end

else

num1[3:

0]<=num1[3:

0]-4'd1;

end

endcase

end

else

begin

if(en1)

begin

en1<=1'b0;

en<=1'b1;

mount<={num1,num2};

light<={red1,yellow1,green1,red2,yellow2,green2};

end

else

begin

{num1,num2}<=16'b1000100010001000;

{red1,yellow1,green1,red2,yellow2,green2}<=6'b100100;

end

end

end

4.显示器模块:

本模块的设计是在FPGA开发板上设置输出与输入来验证自己的设计是不是正确。

采用的是静态数码管显示。

程序代码如下:

always@(posedgeclk_1hz)

begin

case(h_sec1)

4'b0000:

led0<=8'b00000011;

4'b0001:

led0<=8'b10011111;

4'b0010:

led0<=8'b00100101;

4'b0011:

led0<=8'b00001101;

4'b0100:

led0<=8'b10011001;

4'b0101:

led0<=8'b01001001;

4'b0110:

led0<=8'b01000001;

4'b0111:

led0<=8'b00011111;

4'b1000:

led0<=8'b00000001;

4'b1001:

led0<=8'b00001001;

endcase

case(l_sec1)

4'b0000:

led1<=8'b00000011;

4'b0001:

led1<=8'b10011111;

4'b0010:

led1<=8'b00100101;

4'b0011:

led1<=8'b00001101;

4'b0100:

led1<=8'b10011001;

4'b0101:

led1<=8'b01001001;

4'b0110:

led1<=8'b01000001;

4'b0111:

led1<=8'b00011111;

4'b1000:

led1<=8'b00000001;

4'b1001:

led1<=8'b00001001;

endcase

case(h_sec2)

4'b0000:

led2<=8'b00000011;

4'b0001:

led2<=8'b10011111;

4'b0010:

led2<=8'b00100101;

4'b0011:

led2<=8'b00001101;

4'b0100:

led2<=8'b10011001;

4'b0101:

led2<=8'b01001001;

4'b0110:

led2<=8'b01000001;

4'b0111:

led2<=8'b00011111;

4'b1000:

led2<=8'b00000001;

4'b1001:

led2<=8'b00001001;

endcase

case(l_sec2)

4'b0000:

led3<=8'b00000011;

4'b0001:

led3<=8'b10011111;

4'b0010:

led3<=8'b00100101;

4'b0011:

led3<=8'b00001101;

4'b0100:

led3<=8'b10011001;

4'b0101:

led3<=8'b01001001;

4'b0110:

led3<=8'b01000001;

4'b0111:

led3<=8'b00011111;

4'b1000:

led3<=8'b00000001;

4'b1001:

led3<=8'b00001001;

endcase

end

endmodule

六、验证设计;

通过在quartus2软件里布局布线然后把程序下载到FPGA开发板上在数码管上观察显示的结果是不是符合自己的设计。

布局布线的结果如下:

七、故障及问题分解:

1.开始时,对实验及模块概念理解不透彻,以致思路不够清楚,处于模糊状态,通过查看参考资料,对模块及实验对象有了清楚的认识,重新设计各模块,使条理清楚、思路明朗,程序后来的编制也就容易了很多。

2.计时模块,是显示部件的核心。

开始时,在赋值及输出控制信号部分无法正确配合,状态机各状态之间的转换成为最大的问题(各模块编译成功后,顶层编译也能通过,可就是总体仿真出问题,问题主要是它总是处于一个状态不改变)。

分析原因是交通灯的状态由计时模块输出的使能信号确定,因此问题就出在计时模块上。

后来发现只需在控制模块加一个输出信号即可。

3.开关的连接方式很多,对于不同的要求有不同的连接方法。

八、心得体会:

这次EDA课程设计历时两个星期,在整整两个星期的日子里,可以说是苦多于甜,但是可以学的到很多很多的东西,同时不仅可以巩固以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。

通过这次设计,进一步加深了对EDA的了解,让我对它有了更加浓厚的兴趣。

特别是当每一个子模块编写调试成功时,心里特别的开心。

但是在编写顶层文件的程序时,遇到了不少问题,特别是各元件之间的连接,以及信号的定义,总是有错误,在细心的检查下,终于找出了错误和警告,排除困难后,程序编译就通过了,心里终于舒了一口气。

在波形仿真时,也遇到了一点困难,想要的结果不能在波形上得到正确的显示:

在设定输入的时钟信号后,始终看不到主干道按绿-黄-红而同时支干道按红-绿-黄的周期变化。

后来,在数十次的调试之后,才发现是因为输入的时钟信号对于一个红绿灯显示的周期时间来说太短了。

经过屡次调试,终于找到了比较合适的输入数值:

时钟周期设置在100us左右比较合适。

另外,Endtime的值需要设置的长一点:

100ms左右,这样就可以观察到完整的仿真结果;如果不想看到因时间设置得较小时序仿真时出现微小延时,则进行功能仿真。

其次,在连接各个模块的时候一定要注意各个输入、输出引脚的线宽,因为每个线宽是不一样的,只要让各个线宽互相匹配,才能得出正确的结果,否则,出现任何一点小的误差就会导致整个文件系统的编译出现错误提示,在器件的选择上也有一定的技巧,只有选择了合适当前电路所适合的器件,编译才能得到完满成功。

再次,设置黄灯5秒过渡时始终显示的是从4~0而不是从5~0,如果设置了从5~0,相比之下接着的红灯就会慢了一秒亮。

刚开始以为这是程序的错误,经过仔细的思考才发现其实从4~0变化已经是5秒了,并不是错误。

通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。

在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。

总的来说,整体模块的设计还是比较成功的,在设计中遇到了很多问题,最后在同学和老师的帮助下,终于游逆而解,有点小小的成就感,终于觉得平时所学的知识有了实用的价值,达到了理论与实际相结合的目的,不仅学到了不少知识,而且锻炼了自己的能力,使自己对以后的路有了更加清楚的认识。

最后,对给过我帮助的所有同学和指导老师表示忠心的感谢。

九、参考文献:

[1]黄智伟,FPGA系统设计与实践,电子工业出版社,2005年1月,P260~263

[2]刘昌华,数字逻辑EDA设计与实践(第1版),国防工业出版社,2006年8月,P332~P344     

[3]潘松、黄继业,EDA技术与VHDL(第2版),清华大学出版社,2007年1月,P141~P143

[4]江思敏,VHDL数字电路及系统设计,机械工业出版社,2006年8月,P175~P177     

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

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1