您好,欢迎来到刀刀网。
搜索
您的当前位置:首页FPGA课程设计交通灯信号控制器的设计报告

FPGA课程设计交通灯信号控制器的设计报告

来源:刀刀网


课程设计 报 告

交通灯信号控制器的设计报告

学 院 专 业 班 级 学 号 姓 名

交通灯信号控制器的设计

1、实验目的

(1)熟悉QuartusⅡ/ISE Design Suite/ispLEVER软件的基本

使用方法。

(2)熟悉GW48-CK或其他EDA实验开发系统的基本使用方法。 (3)学习和掌握Verilog HDL过程区块语句、if条件语句、case选择语句、for循环语句和元件实例化语句等的综合使用。 (4)学习计数器、分频器、选择器等Verilog HDL基本逻辑电路、动态扫描显示电路和状态机控制电路的综合设计应用。

2、实验要求

设计并调试好一个十字交叉口的交通灯信号控制器,要求为: (1)设置两个开关SW1、SW2,其中固定开关实现交通人为监督交通秩序和无人自动控制交通秩序之间的切换,默认开关置于高电平端,为自动控制模式—交通灯按事先的规定工作,开关置于低电平时,为人为监督控制模式(交通灯不再工作)。点动开关SW2用于整个系统的总复位,如系统出现故障,则需要总复位。 (2)当交通灯处于无人控制自动状态时,若方向灯1绿灯亮,则方向2红灯亮。计数55s后,方向1的绿灯熄灭、黄灯亮,再计数5s后,方向1的红灯亮,黄灯灭,同时方向2的绿灯亮,然后方向2重复方向1的工作过程,这样就实现了无人自动控制交通灯。有关控制的定时使用倒计时方式,计时过程用数码管显示。 3、总体设计思路

3.1系统组成

交通灯控制器拟由单片的CPLD/FPGA来实现,结合设计任务要求和确定的实现方案,按照自顶向下的层次化设计方法,整个系统可分为6个模块组成。

①主控制模块control:根据外部输入控制信号及来自内部计时模块的控制信号,控制两个方向道路信号灯的亮与灭。

②55s倒计时模块cnt55:实现55s绿灯点亮时间的倒计时。 ③5s倒计时模块cnt05:实现5s黄灯点亮时间的倒计时。

④时钟信号分频模块fdiv:将给定的主频时钟信号经分频得到频率分别是1KHZ和1HZ.

⑤显示数据多路选择模块datasel:根据来自control模块的控制信号进行倒计时模块cnt55和cnt05计时结果的显示数据选择。

⑥数据动态显示驱动模块display:使用动态扫描的方式,进行显示数据的选择及显示驱动译码。

3.2功能模块设置及实现

系统采用的是系统级层次设计方法,对整个系统进行方案设计和功能划分,系统的关键电路用一片FPGA芯片实现,首先用VHDL语言编写各个功能模块程序,最后通过综合器和适配器生成最终的目标器件,然后用顶层原理图将各个功能模块连接起来。下面分别来介绍各个功能模块的实现和调试过程。 ◆主控制模块

输入端口:

en0、en1:分别来自cnt55、cnt5的定时溢出信号 sw1:交通控制转换开关 rst:复位信号 输出端口:

ce0、ce1:用于cnt05、cnt55模块是否定时的控制信号 sel:用于datasel模块进行数据选择的控制信号 red1、red2、gre1、gre2、yel1、yel2:信号灯控制

该模块主要完成根据外部输入信号rst、sw1控制输出,用于控

制交通灯的信号Red1,Red2,Yellow1,Yellow2,Green1,Green2。这中间包含了必要的内部模块之间的信号EN(来自倒计时时间选择驱动模块)。

◆55s定时模块

输入端口:

clk:时钟脉冲信号 rst:复位信号

ce:来自控制模块的计数使能信号 输出端口:

dout1、dout0:分别为定时值的高4位和低四位

cout:定时计数溢出信号

该模块主要完成55 秒的倒计时,控制红灯的点亮时间。实际中在1 分钟内 还要有绿到黄灯的转换以提醒车辆与行人,所以选择了55 秒作为绿灯的点亮时 间。

◆5s定时模块

输入端口:

clk:时钟脉冲信号 rst:复位信号

ce:来自控制模块的计数使能信号 输出端口:

dout1、dout0:分别为定时值的高4位和低四位

cout:定时计数溢出信号

该模块主要完成5 秒的倒计时,控制黄灯的点亮时间。实际中在1 分钟内还 要有红到黄灯的转换以提醒车辆与行人,所以选择了55 秒作为红灯的点亮时间 后,黄灯的点亮时间必定为5 秒。

◆分频器模块

输入端口:

clk:输入主频时钟脉冲信号,假设为10MHZ 输出端口:

clk1Khz:分频后为1Khz的输出信号

clk1hz:分频后为1hz的输出信号

该模块完成从10MHz 的主频时钟信号经过分频得到1KHz的时钟信号,即完成一个10000 分频的分频器,完成从模块1KHz 中的1KHz 时钟信号经过分频得到1Hz 的计数时钟信号,即完成一个1000 分频的分频器。

◆显示数据多路选择模块

输入端口:

din:数据显示选择信号 sel:控制选择信号 输出端口:

dout1、dout0:选择输出

该模块主要完成两组不同倒计时时间数据的选择输出到后续显示模块中。

4 总体调试与结果说明

4.1 顶层电路

在设计完各个模块后,需要将各个模块有机地组合成一个整体,最后 来实现系统的功能在数字频率计的设计中,同时采用了电路原理图的设计 以及Verilog HDL语言来编写的顶层电路。电路原理图见下图

总系统电路图

4.2 系统仿真图

4.3 管脚分配

4.4 硬件仿真

通过试验箱下载程序调试之后,基本满足了要求。

5 心得与体会

本次实验所学的VHDL和QUARTUSII的知识的巩固和应用,通过对一个综合性的课题的分析、设计、编写代码、调试和实践来检验学习的成果和提高思考能力和动手实践能力。并且,我们在实验课中继续学习了综合性课题的设计方法----自顶向下的设计方法,从单一性的设计到模块化的设计,在深入理解VHDL语言的同时,锻炼了个人的逻辑思维和设计能力,提高了个人的自学能力个学习素质。虽然在设计的过程中也会出现一些问题,但是通过和同学们的交流和对程序的调试和改进,最终成功完成了课题任务的设计和实践,基本上算是一次成功的实验经历。

本次实验是对VHDL语言的深入学习,主要学习并实践了VHDL的自顶向下的设计方法。在学习和实践的过程中,体会到各种语言的共同性。如C++高级语言程序设计也是利用自顶向下的设计方法来完成课题功能的设计,从这一点可以看出各个高级语言的逻辑互通性。这给我们今后的思维和学习一个很大的启示。

程序:

//control.v

module control (en0,en1,sw1,rst,ce0,ce1,sel,red1,red2,yel1,yel2,gre1,gre2); input en0,en1; input sw1,rst; output ce0,ce1; output [1:0]sel;

output red1,red2,yel1,yel2,gre1,gre2; wire en; reg ce1,ce0; reg[1:0]sel;

reg red1,red2,yel1,yel2,gre1,gre2,dout; assign en=en1|en0;

always @(posedge en) begin

sel<=sel+2'b01; end always begin case(sel)

2'b00:{ce1,ce0}<=2'b10; 2'b01:{ce1,ce0}<=2'b01; 2'b10:{ce1,ce0}<=2'b10; 2'b11:{ce1,ce0}<=2'b01; default:{ce1,ce0}<=2'b00; endcase end

always @(sel,rst,sw1) begin

if(sw1==0||rst==0)

{red1,red2,yel1,yel2,gre1,gre2}=6'b0; else begin

case(sel)

2'b00:{red1,red2,yel1,yel2,gre1,gre2}=6'b010010; 2'b01:{red1,red2,yel1,yel2,gre1,gre2}=6'b011000; 2'b10:{red1,red2,yel1,yel2,gre1,gre2}=6'b100001; 2'b11:{red1,red2,yel1,yel2,gre1,gre2}=6'b100100; default:{red1,red2,yel1,yel2,gre1,gre2}=6'b0;

endcase

end end Endmodule //cnt05s.v

module cnt05s(clk,rst,ce,dout1,dout0,cout); input clk,rst,ce; output [3:0]dout1,dout0;

output cout;

reg [3:0]dout1,dout0; reg cout;

reg [3:0]cdata1,cdata0; reg [7:0]data; always @(posedge clk) begin

if(rst==0||ce==0)

begin cout<=1'b0;cdata1<=4'b0000;cdata0<=4'b0000;end else begin

if(cdata0!=4'b0101)

begin cdata0<=cdata0+1;cout<=1'b0;end else

begin cdata1<=4'b0000;cdata0<=4'b0000;cout<=1'b1; end end end always begin

data<=8'b00000101-((cdata1<<4)+cdata0); dout1<=4'b0000;

if((data&4'b1111)>4'b0101) dout0<=data&4'b1111-4'b1011; else

dout0<=data&4'b1111; end endmodule //cnt55s.v

module cnt55s(clk,rst,ce,dout1,dout0,cout); input clk,rst,ce; output [3:0]dout1,dout0; output cout;

reg [3:0]dout1,dout0;

reg cout;

reg [3:0]cdata1,cdata0; reg [7:0]data; always @(posedge clk) begin

if(rst==0||ce==0)

begin cdata1<=4'b0000;cdata0<=4'b0000;cout<=1'b0;end else begin

if(cdata0==4'b0101&&cdata1==4'b0101)

begin cdata1<=4'b0000;cdata0<=4'b0000;cout=1'b1; end else if(cdata0!=4'b1001)

begin cdata0<=cdata0+1;cout<=1'b0;end else if(cdata0==4'b1001&&cdata1!=4'b0110)

begin cdata1<=cdata1+1;cdata0<=4'b0000;cout<=1'b0; end else

begin cdata1<=4'b0000;cdata0<=4'b0000;cout=1'b1; end end end always begin

data<=8'b01010101-((cdata1<<4)+cdata0); if(((data>>4)&4'b1111)>4'b0101) dout1<=(data>>4)&4'b1111-4'b1111; else

dout1<=(data>>4)&4'b1111; if((data&4'b1111)>4'b1001) dout0<=(data&4'b1111)-4'b0110; else

dout0<=data&4'b1111; end Endmodule

//datasel.v

module datasel(din0,din1,din2,din3,sel,dout0,dout1); input[3:0] din0,din1,din2,din3; input[1:0] sel;

output[3:0] dout0,dout1; reg [3:0] dout0,dout1; always begin

if(sel==2'b00)

begin dout1<=din2;dout0<=din3;end else if(sel==2'b01)

begin dout1<=din0;dout0<=din1;end else if(sel==2'b10)

begin dout1<=din2;dout0<=din3;end else if(sel==2'b11)

begin dout1<=din0;dout0<=din1;end else

begin dout1<=4'b0000;dout0<=4'b0000;end end endmodule //fdiv.v

module fdiv(clk,clk1khz,clk1hz); input clk;

output clk1khz,clk1hz; reg clk1khz,clk1hz; integer cnt1=0; integer cnt2=0; always@(posedge clk) begin if(cnt1<9999) //if(cnt1<19) begin

cnt1=cnt1+1;clk1khz<=1'b0; end

else begin

cnt1=0;clk1khz<=1'b1; end end

always@(posedge clk1khz) begin if(cnt2<999) //if(cnt2<9) begin

cnt2=cnt2+1;clk1hz<=1'b0; end else begin

cnt2=0;clk1hz<=1'b1; end end endmodule

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

Copyright © 2019- gamedaodao.com 版权所有 湘ICP备2022005869号-6

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务