您的当前位置:首页正文

基于FPGA的交通灯设计——数字系统课程设计实习报告书

2022-03-08 来源:九壹网
河南科技学院信息工程学院

数字系统课程设计报告书

课题名称:院系:基于FPGA的交通灯设计信息工程学院**、2***通信工程、通信刘艳昌、左现刚20**-20**学年第2学期**-**周姓名学号:专业班级:指导教师:设计时间:2016年*月**日目录

摘要............................................11234

设计目的.....................................2设计内容及要求...............................2系统设计总体方案及设计原理...................2各模块电路设计与实现.........................34.1分频模块设计与实现.......................34.2减法计数模块设计与实现...................44.3数码管驱动模块设计与实现.................756

系统仿真及硬件下载...........................8设计总结....................................10

参考文献

摘要

FPGA技术在数字电子系统设计领域越来越普及,并且FPGA技术实现在实际应用时也非常方便。它是作为专用集成电路(ASIC)领域的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。VerilogHDL语言作为一种规范的硬件描述语言,被广泛应用于电路的设计中。利用VerilogHDL语言自顶而下的设计方法设计交通灯控制系统,实现道路的正常畅通,并通过QuartusII9.1完成综合仿真。将程序下载到FPGA芯片上,可应用于现实生活中的交通灯控制系统。

【关键词】FPGA,VerilogHDL,ASIC,可编程器件

11、设计目的

(1)掌握运用QuartusII9.1软件进行可编程逻辑器件设计的方法。(2)掌握FPGA进行计数器以及数码管驱动电路设计的方法。(3)熟练掌握可编程逻辑器件的文本输入(Verilog)的设计方法。(4)掌握QuartusII9.1进行仿真以及可编程器件进行硬件下载方法。

2、设计内容及要求

设计并实现交通灯控制电路,下载到芯片EP2C8Q208C8。

设计一个交通红路灯。分为A、B两个路口,每个路口安装红、黄、绿三种颜色的灯。设计一个计时器用倒计时的方法显示时间,A路口红灯(ared)、黄灯(ayellow)、绿灯(agreen)亮灯时间依次是40秒、5秒、30秒,B路口红灯(bred)、黄灯(byellow)、绿灯(bgreen)亮灯时间依次是40秒、5秒、30秒。

用Verilog语言在QuartusII9.1上编写程序模块,连接电路进行波形仿真。仿真成功后添加数码管驱动模块,然后分配引脚下载到开发板上进行演示。

3、系统设计总体方案及设计原理

交通灯控制系统以倒计时显示A、B路口亮灯时间以及红绿灯的状态变换设计了共3个模块,即分频模块、减法计数模块、数码管驱动模块。红绿灯的状态变换如下:

S0:A路口红灯亮时,B路口路绿灯亮,保持35秒;S1:A路口红灯亮时,B路口路黄灯亮,保持5秒;S2:A路口绿灯亮时,B路口路红灯亮,保持35秒;S3:A路口黄灯亮时,B路口路红灯亮,保持5秒;S3结束后重新回到S0,一直循环进行。

根据设计要求用Visio画出A、B路口的交通灯控制系统的框图,红绿灯状态变换如图3.1所示,总体方案如图3.2所示

图3.1红绿灯状态转换图

2图3.2总体方案图

4、各模块电路设计与实现

4.1分频模块设计与实现分频模块原理图如图4.1所示

fenpinclkclk_1Hzclk_1KHzinst图4.1分频模块原理图

分频模块原理图的输入端clk为50MHz,与开发板内部50MHz相连接,输出端clk_1Hz与减法计数器的输入端连接,clk_1KHz与数码管驱动的输入端连接。分频模块的Verilog程序如下:modulefenpin(clk,clk_1Hz,clk_1KHz);inputclk;

outputclk_1Hz,clk_1KHz;regclk_1Hz,clk_1KHz;reg[25:0]cout1;reg[25:0]cout2;always@(posedgeclk)begin

if(cout1==24999999)

3begincout1<=0;clk_1Hz=~clk_1Hz;end

elsecout1=cout1+1;end

always@(posedgeclk)begin

if(cout2==24999)begincout2<=0;

clk_1KHz=~clk_1KHz;end

elsecout2=cout2+1;endendmodule

4.2减法计数模块设计与实现计数器原理图如图4.2所示

trafficCLKENled1[2..0]led2[2..0]ACOUNT[7..0]BCOUNT[7..0]inst图4.2计数器原理图

输入端的clk与分频输出端的clk_1Hz连接,使能端EN接VCC,输出端led1[2..0]接A路口的红、黄、绿三个灯,led2[2..0]接B路口的红、黄、绿三个灯,ACOUNT[7..0]和BCOUNT[7..0]分别对应接在数码管输入端的smg1[7..0]和smg2[7..0]。

计数模块的Verilog程序如下:

moduletraffic(CLK,EN,led1,led2,ACOUNT,BCOUNT);output[7:0]ACOUNT,BCOUNT;output[2:0]led1,led2;inputCLK,EN;

4reg[7:0]numa,numb;regtempa,tempb;reg[2:0]counta,countb;reg[2:0]led1,led2;always@(EN)if(!EN)beginared<=8'h40;ayellow<=8'h5;agreen<=8'h35;bred<=8'h40;byellow<=8'h5;bgreen<=8'h35;end

assignACOUNT=numa;assignBCOUNT=numb;always@(posedgeCLK)beginif(EN)beginif(!tempa)begintempa<=1;case(counta)

//寄存数据

//灯状态

reg[7:0]ared,ayellow,agreen,bred,byellow,bgreen;

//设置各种灯的计数器的预置数

//控制A方向的三种灯

//控制亮灯的顺序

0:beginnuma<=agreen;led1<=1;counta<=1;end1:beginnuma<=ayellow;led1<=2;counta<=2;end2:beginnuma<=ared;led1<=4;counta<=0;enddefault:led1<=4;endcaseendelsebeginif(numa>1)if(numa[3:0]==0)

5//倒计时

begin

numa[3:0]<=4'b1001;numa[7:4]<=numa[7:4]-1;end

elsenuma[3:0]<=numa[3:0]-1;if(numa==2)tempa<=0;endendelsebeginled1<=3'b100;counta<=0;tempa<=0;endend

always@(posedgeCLK)//控制B方向的四种灯beginif(EN)beginif(!tempb)begintempb<=1;case(countb)

//控制亮灯的顺序

0:beginnumb<=bred;led2<=4;countb<=1;end1:beginnumb<=bgreen;led2<=1;countb<=2;end2:beginnumb<=byellow;led2<=2;countb<=0;enddefault:led2<=4;endcaseendelsebeginif(numb>1)

if(numb[3:0]==0)beginnumb[3:0]<=9;

numb[7:4]<=numb[7:4]-1;end

6//倒计时

elsenumb[3:0]<=numb[3:0]-1;if(numb==2)tempb<=0;endendelsebeginled2<=3'b100;tempb<=0;countb<=0;endendendmodule

4.3数码管驱动模块设计与实现数码管驱动原理图如图4.3所示

xianshiclk_1KHzsmg1[7..0]smg2[7..0]instseg[7..0]dig[7..0]图4.3数码管驱动原理图

数码管驱动的输入端clk_1KHz与分频模块的输出端clk_1KHz连接,smg1[7..0],smg2[7..0]分别与计数器模块输出端ACOUNT[7..0]和BCOUNT[7..0]连接,seg[7..0]与数码管位选端连接,dig[7..0]与数码管段选连接。数码管驱动的Verilog程序如下所示:

modulexianshi(clk_1KHz,smg1,smg2,seg,dig);inputclk_1KHz;input[7:0]smg1,smg2;output[7:0]seg;output[7:0]dig;reg[7:0]seg_reg;reg[7:0]dig_reg;reg[3:0]dat_reg;reg[2:0]cout;

always@(posedgeclk_1KHz)begin

if(cout==5)cout<=0;

7elsecout=cout+1'b1;end

always@(posedgeclk_1KHz)begin

case(cout)

3'd0:begindat_reg<=smg1[7:4];dig_reg<=8'b01111111;end3'd1:begindat_reg<=smg1[3:0];dig_reg<=8'b10111111;end3'd2:begindat_reg<=smg2[7:4];dig_reg<=8'b11011111;end3'd3:begindat_reg<=smg2[3:0];dig_reg<=8'b11101111;enddefault:begindat_reg<=0;dig_reg<=8'b11111111;end

endcaseend

always@(dat_reg)begin

case(dat_reg)

4'h0:seg_reg<=8'hc0;4'h1:seg_reg<=8'hf9;4'h2:seg_reg<=8'ha4;4'h3:seg_reg<=8'hb0;4'h4:seg_reg<=8'h99;4'h5:seg_reg<=8'h92;4'h6:seg_reg<=8'h82;4'h7:seg_reg<=8'hf8;4'h8:seg_reg<=8'h80;4'h9:seg_reg<=8'h90;default:seg_reg<=8'hff;

endcaseend

assignseg=seg_reg;assigndig=dig_reg;endmodule

5、系统仿真及硬件下载

首先各个模块用线分别连接起来,然后进行编译、生成网络表、再创建波形文件、添加所有的输入输出引脚、选择时钟,最后进行编译。

8交通灯总电路图如图5.1所示

OUTPUTOUTPUTled1[2..0]led2[2..0]PIN_58PIN_59PIN_60PIN_15PIN_14PIN_30fenpinclkINPUTVCCtrafficxianshiclk_1Hzclk_1KHzVCCclkPIN_23clk_1KHzCLKENled1[2..0]led2[2..0]ACOUNT[7..0]BCOUNT[7..0]A[7..0]B[7..0]clk_1Khzclk_1KHzsmg1[7..0]smg2[7..0]inst1seg[7..0]dig[7..0]OUTPUTOUTPUTseg[7..0]dig[7..0]instinst3PIN_74PIN_75PIN_76PIN_77PIN_80PIN_81PIN_82PIN_84PIN_72PIN_70PIN_69PIN_68PIN_67PIN_64PIN_63PIN_61图5.1交通灯电路图

系统仿真如图5.2所示

图5.2系统仿真

引脚分配图如图5.3所示

9图5.3引脚分配图

6、设计总结

在此次的交通灯设计过程中,从没有思路,然后到百度上查询一下对交通灯有了进一步的了解,在这基础上自己开始用Verilog语言编程,中间过程中也遇到了不少问题,如:在数码管显示时八个数码管同时隐约地显示0,前四位在这基础上又显示出倒计时时间,导致数码管乱码,这个问题将近困扰了我一天,绞尽脑汁也没想出解决办法,在老师的指导下,思路逐渐清晰,最终让数码管正确的显示出来,意识到自己在写数码管驱动时将数码管位选端接错了。还有就是在计数模块给红绿灯赋值时程序出现错误,刚开始无论初始值为多少,开发板初始值都从28和23开始显示,后来将这些数改为16进制就成功的解决了这一问题。这次实习让我更加进一步地熟悉并掌握了数字电路的知识和具体应用。了解并学会了使用VerilogHDL语言进行编程、对程序的仿真以及使用QuartusII软件进行模块的创建、原理图的绘制等。并能根据仿真结果分析设计存在的问题和缺陷,从而能够对程序进行调试和修改。程序最难的是顶层模块的设计,因为顶层模块需要将各个子模块按照电路原理有机地结合起来。但相比子模块设计更简单一些,之前我已经学了单片机,我感觉Verilog语言与C语言有许多相似的地方,所以许多地方比较容易理解。很多情况下,一长串的错误往往就是由于一个不经意的小错误引起的。所以在做让任何事时都要细心。在程序屡次调试错误的时候,和同学沟通一下,有时他们不经意的一句话就会给我们带来启发,或者找老师,

10让老师详细讲一下。

这次实习过程中老师给了我很大的帮助,又加上自己的好问,让自己学到了很多,程序遇到问题老师指导之后还会亲自问一下程序修改的是否成功,如果没有成功老师会耐心地再次给我讲解,谢谢老师的悉心指导。

参考文献

[1]王金明.数字系统设计与VerilogHDL(第四版)[M].北京:电子工业出版社,2011.

[2]王永维.一种基于FPGA的数字秒表设计方法[J].电子元器件应用,2012,14(1):10-13.

[3]刘爱华,王振成.EDA技术与CPLD/FPGA开发应用简明教程[M].清华大学出版社,2010.

[4]陈忠平,高金定,高见芳.基于QuartusII的FPGA/CPLD设计与实践[M].电子工业出版社,2010.

[5]张明.VerilogHDL实用教程[M].成都:电子科技大学出版社,1999.

11

因篇幅问题不能全部显示,请点此查看更多更全内容