基于FPGA交通灯设计.docx

上传人:b****6 文档编号:5258144 上传时间:2022-12-14 格式:DOCX 页数:15 大小:200.95KB
下载 相关 举报
基于FPGA交通灯设计.docx_第1页
第1页 / 共15页
基于FPGA交通灯设计.docx_第2页
第2页 / 共15页
基于FPGA交通灯设计.docx_第3页
第3页 / 共15页
基于FPGA交通灯设计.docx_第4页
第4页 / 共15页
基于FPGA交通灯设计.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

基于FPGA交通灯设计.docx

《基于FPGA交通灯设计.docx》由会员分享,可在线阅读,更多相关《基于FPGA交通灯设计.docx(15页珍藏版)》请在冰豆网上搜索。

基于FPGA交通灯设计.docx

基于FPGA交通灯设计

河南科技学院新科学院

数字系统课程设计报告书

 

课题名称

基于FPGA的交通灯设计

院系

新科学院

姓名学号

夏文平、2013280218

专业班级

通信工程、通信132

指导教师

刘艳昌、雷进辉

设计时间

2014-2015学年第2学期12、13周

 

2015年6月5日

 

摘要

交通灯信号控制器通常要实现自动控制和手动控制其红绿灯的变化,基于FPGA设计的交通灯信号控制器电路简单、可靠性好。

本设计可控制2个路口的红、黄、绿三盏灯.让其按特定的规律进行变化。

利用QuartusⅡ对设计结果进行仿真,发现系统工作性能良好。

据此设计而成的硬件电路,也实现了控制要求。

关键词:

交通灯自动控制手动控制

Ⅰ课程设计目的。

巩固加深所学电子技术课程的基本知识,提高综合运用所学知识的能力。

同时培养学生选用参考书、查阅手册、图表和文献资料的能力,提高解决实际问题的能力。

并且,在设计方案分析比较、设计计算、电路安装等缓解掌握使用电路的设计方法。

然后提高学生的动手能力,掌握仪器设备的正确使用方法。

最后了解与课题有关的电路以及元器件的工程技术规范,能按课程设计任务数的要求编写设计说明书,可以正确反映设计和实验成果,能正确绘制电路图等。

Ⅱ设计任务及要求。

设计一个十字路口的交通灯控制电路,要求甲车道和乙车道两条交叉道路上的车辆交替运行,每次的通行时间都设为25秒。

要求黄灯先亮5秒,才能变换运行车道并且黄灯亮时另一干道的红灯按1Hz的频率闪烁。

要求通行时间及黄灯亮的时间均可在60秒内任意设定。

要求交通灯控制电路可以手动控制立即进入特殊运行状态,即两条道上红灯全亮,时钟停止计时。

当特殊运行状态结束后,系统复原,继续正常运行。

Ⅲ系统设计总体方案。

由设计要求可得如下交通控制器的状态转换表:

甲车道

乙车道

时间

绿灯

红灯

6S

黄灯

红灯

5S

红灯

绿灯

11S

红灯(闪烁)

黄灯

5S

Ⅳ各模块具体实现。

1分频模块。

如图为分频模块。

模块功能:

实现分频功能,输入50MHz的时钟信号,对上升沿进行计数,每50M个脉冲的上升沿输出一次高电平脉冲信号,从而实现分频。

模块程序如下:

moduleone_second_clk(reset,clk,cout);

inputreset,clk;

integercount;

outputregcout;

always@(posedgeclk)

if(reset)begincount=0;cout=0;end

elseif(count==50000000-1)begincount=0;cout=1;end

elsebegincount=count+1;cout=0;end

endmodule

moduletimer_NS(clk,reset,set,ld,en,state,q_NS,done_NS);

inputclk,reset,set,ld,en;

input[3:

0]state;

output[7:

0]q_NS;

outputdone_NS;

reg[7:

0]q_NS;

parameterred_NS=8'd10,green_NS=8'd5,yellow_NS=8'h04;

parameterst0=4'b0001,st1=4'b0010,st2=4'b0100,st3=4'b1000;

assigndone_NS=~(|q_NS)&&en;

always@(posedgeclk)

if(reset)q_NS<=green_NS;

elseif(ld)

case(state)

st0:

q_NS<=yellow_NS;

st1:

q_NS<=red_NS;

st2:

q_NS<=8'h00;

st3:

q_NS<=green_NS;

default:

q_NS<=8'h00;

endcase

elseif(en&&~set)

begin

q_NS<=q_NS-1;

end

endmodule

2倒计时模块。

由于是东西南北两条道路,固有两个倒计时器。

模块功能:

在相应状态下实现倒序计数。

程序如下:

moduletimer_EW(clk,reset,set,ld,en,state,q_EW,done_EW);

inputclk,reset,set,ld,en;

input[3:

0]state;

output[7:

0]q_EW;

outputdone_EW;

reg[7:

0]q_EW;

parameterred_EW=8'd10,green_EW=8'd5,yellow_EW=8'h04;

parameterst0=4'b0001,st1=4'b0010,st2=4'b0100,st3=4'b1000;

assigndone_EW=~(|q_EW)&&en;

always@(posedgeclk)

if(reset)q_EW<=red_EW;

elseif(ld)

case(state)

st0:

q_EW<=8'h00;

st1:

q_EW<=green_EW;

st2:

q_EW<=yellow_EW;

st3:

q_EW<=red_EW;

default:

q_EW<=8'h00;

endcase

elseif(en&&~set)

begin

q_EW<=q_EW-1;

end

endmodule

3转码模块。

模块功能:

将计数器输出的的二进制数转换为bcd码表示的十进制数。

转码程序如下:

modulebin_to_bcd(data,units,tens,hundreds);

input[7:

0]data;

output[3:

0]units,tens,hundreds;

reg[3:

0]units_r,tens_r,hundreds_r;

reg[7:

0]dat_r;

reg[11:

0]temp;

integeri;

assignunits=units_r;

assigntens=tens_r;

assignhundreds=hundreds_r;

always@(data)

begin

dat_r=data;

temp=0;

for(i=0;i<7;i=i+1)

begin

temp={temp[10:

0],dat_r[7]};

if(temp[3:

0]>4'd4)

temp[3:

0]=temp[3:

0]+4'd3;

if(temp[7:

4]>4'd4)

temp[7:

4]=temp[7:

4]+4'd3;

if(temp[11:

8]>4'd4)

temp[11:

8]=temp[11:

8]+4'd3;

dat_r=dat_r<<1;

{hundreds_r,tens_r,units_r}={temp[10:

0],data[0]};

end

end

endmodule

4交通控制模块。

模块功能:

把以上五个模块连接起来形成一个完整的电路,从而实现交通灯控制功能。

交通控制模块程序如下:

moduletraffic_control(clk,clk_1hz,reset,set,done_NS,done_EW,red1,yellow1,green1,red2,yellow2,green2,sload_NS,sload_EW,state_cnt);

inputclk,clk_1hz,reset,set;

inputdone_NS,done_EW;

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

outputsload_NS,sload_EW;

output[3:

0]state_cnt;

parameters0=4'b0001,s1=4'b0010,s2=4'b0100,s3=4'b1000;

reg[3:

0]current_state,next_state;

regred1,yellow1,green1,red2,yellow2,green2;

regsload_NS,sload_EW;

assignstate_cnt=current_state;

always@(posedgeclkorposedgereset)

begin

if(reset)

current_state<=s0;

else

current_state<=next_state;

end

always@(current_stateordone_NSordone_EW)

begin:

fsmtr

case(current_state)

s0:

begin

if(done_NS)next_state<=s1;

elsenext_state<=s0;

end

s1:

begin

if(done_NS)next_state<=s2;

elsenext_state<=s1;

end

s2:

begin

if(done_EW)next_state<=s3;

elsenext_state<=s2;

end

s3:

begin

if(done_EW)next_state<=s0;

elsenext_state<=s3;

end

default:

next_state<=s0;

endcase

end

always@(*)

begin

if(set)begin

green1<=1'b0;yellow1<=1'b0;red1<=1'b1;

green2<=1'b0;yellow2<=1'b0;red2<=1'b1;

end

elsebegin

case(current_state)

s0:

begin

green1<=1'b1;yellow1<=1'b0;red1<=1'b0;

green2<=1'b0;yellow2<=1'b0;red2<=1'b1;

end

s1:

begin

green1<=1'b0;yellow1<=1'b1;red1<=1'b0;

green2<=1'b0;yellow2<=1'b0;if(clk_1hz)red2<=~red2;

end

s2:

begin

green1<=1'b0;yellow1<=1'b0;red1<=1'b1;

green2<=1'b1;yellow2<=1'b0;red2<=1'b0;

end

s3:

begin

green1<=1'b0;yellow1<=1'b0;if(clk_1hz)red1<=~red1;

green2<=1'b0;yellow2<=1'b1;red2<=1'b0;

end

default:

begin

green1<=1'b1;yellow1<=1'b0;red1<=1'b0;

green2<=1'b0;yellow2<=1'b0;red2<=1'b1;

end

endcase

end

end

always@(*)

begin

sload_NS<=1'b0;

sload_EW<=1'b0;

case(current_state)

s0:

begin

if(done_NS)

begin

sload_NS<=1'b1;

end

end

s1:

begin

if(done_NS)

begin

sload_NS<=1'b1;

sload_EW<=1'b1;

end

end

s2:

begin

if(done_EW)

begin

sload_EW<=1'b1;

end

end

s3:

begin

if(done_EW)

begin

sload_NS<=1'b1;

sload_EW<=1'b1;

end

end

default:

begin

sload_NS<=1'b1;

sload_EW<=1'b1;

end

endcase

end

endmodule

moduleSEG7_LUT(oSEG,iDIG);

input[3:

0]iDIG;

output[6:

0]oSEG;

reg[6:

0]oSEG;

always@(iDIG)

begin

case(iDIG)

4'h1:

oSEG=7'b1111001;

4'h2:

oSEG=7'b0100100;

4'h3:

oSEG=7'b0110000;

4'h4:

oSEG=7'b0011001;

4'h5:

oSEG=7'b0010010;

4'h6:

oSEG=7'b0000010;

4'h7:

oSEG=7'b1111000;

4'h8:

oSEG=7'b0000000;

4'h9:

oSEG=7'b0011000;

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;

4'hf:

oSEG=7'b0001110;

4'h0:

oSEG=7'b1000000;

endcase

end

endmodule

moduleSEG7_LUT_4(oSEG0,oSEG1,oSEG2,oSEG3,iDIG);

input[15:

0]iDIG;

output[6:

0]oSEG0,oSEG1,oSEG2,oSEG3;

 

SEG7_LUTu0(oSEG0,iDIG[3:

0]);

SEG7_LUTu1(oSEG1,iDIG[7:

4]);

SEG7_LUTu2(oSEG2,iDIG[11:

8]);

SEG7_LUTu3(oSEG3,iDIG[15:

12]);

Endmodule

Ⅴ系统仿真及硬件下载。

Ⅵ遇到的问题及分析。

1.我们在设计时使用了四个数码管,分别用来显示东西、南北方向的计数。

两个计数器模块的状态是不一样的。

经分析调试后发现两个计数器的状态应该是相对应的,调整后使计数器数值正确显示。

Ⅶ结论与心得。

通过这次课程设计,我们学习了VerilogHDL这种语言,并且学习完理论知识后能够直接用于解决实际问题,这使得我们的自学能力有了很大的提高;然后,通过使用QuartusⅡ进行编程,以及程序烧录,熟悉了这个软件的使用;接着,通过对FPGA的编程和控制,我们一定程度的学会了FPGA的使用。

经过这次课程设计,我们通过查阅资料,自学工具的使用,分析问题以及方案的设计,最后进行程序的编写和烧录,完成所给的设计任务,这是一次我们利用理论知识解决实际问题的尝试,这给我们以后解决更多的实际问题提供了经验。

同时在实践中我们也发现了自己的不足,因此在设计中,我们也在不断地改进设计中的不足之处。

参考文献:

[l]庄新敏《QuartusⅡ用户指南及仿真实现》国防工业出版社2001年

[2]张亦华《数字电路EDA入门-VHDL程序实例集》北京邮电大学出版社2003年

[3]马临超《基于VHDL语言的交通灯控制器设计》河南机电高等专科学校学报2008年

[4]侯伯亨《VHDL硬件描述语言与数字逻辑电路设计》西安电子科技大学出版社1999年

[5]任勇峰《VHDL与硬件实现速成》国防工业出版社2005年

 

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

当前位置:首页 > 高等教育 > 艺术

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

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