课程设计课程名称__EDA技术综合设计与实践__ 题目名称交通灯控制系统学生学院信息工程学院专业班级通信工程08(4)学号 **********学生姓名高高指导教师李学易2011 年12 月26 日基于FPGA 的交通灯控制器的设计摘要:Verilog 是广泛应用的硬件描述语言,可以用在硬件设计流程的建模、综合和模拟等多个阶段。
随着硬件设计规模的不断扩大,应用硬件描述语言进行描述的CPLD 结构,成为设计专用集成电路和其他集成电路的主流。
现代城市在日常运行控制中,越来越多的使用红绿灯对交通进行指挥和管理。
而一套完整的交通灯控制系统通常要实现自动控制和手动控制去实现其红绿灯的转换。
基于FPGA 设计的交通灯控制系统电路简单、可靠性好。
本设计利用Verilog HDL 语言、采用层次化混合输入方式,可控制4个路口的红、黄、绿、左转四盏信号灯,让其按特定的规律进行变化。
在QUARTUSⅡ下对系统进行了综合与仿真。
仿真结果表明系统可实现十字路口红绿灯及左转弯控制和倒计时显示,并能够自动控制交通灯转变。
通过应用Verilog HDL 对交通灯控制器的设计,达到对Verilog HDL 的理解关键词:FPGA ;交通灯自动控制;Verilog HDL;Quartus Ⅱ1.交通信号控制器设计要求与思路1.1设计要求在交通灯系统中(图1),路口1、2、3、4均需要红、黄、绿、左转四盏灯(用RYGL分别表示) ,并且每个路口都需要一个倒数的计时器,假设绿灯每次维持的时间是40 s ,黄灯为5 s ,左转灯10s,红灯60s,黄灯亮时以一定的频率闪动。
交通灯系统大多是自动控制来指挥交通的,但有时需要由交警手动控制红绿灯,所以要求设计的该交通信号系统需要具有该功能。
实现设计目标如下:(1)设计一个十字路口的交通灯控制电路,每条路配有红、黄、绿交通信号灯,通过电路对十字路口的两组交通灯的状态实现自动循环控制;(2)实现东西车道和南北车道上的车辆交替运行,绿灯每次维持的时间是40 s ,黄灯为5 s ,左转灯10s,红灯60s;(3)要求黄灯亮5 秒后,红灯才能转为绿灯,黄灯亮时以一定的频率闪动;(4)东西车道和南北车道每次通行的时间不同且可调;图1 交通灯系统示意图1.2设计思路为了便于讨论,我们只讨论路口1(用A表示)和路口4(用B表示)。
此交通灯控制系统一共设计有5种工作模式。
分别为:方式1 :A 向绿灯长亮,B 向红灯亮。
方式2 :A 向左转灯长亮,B 向红灯亮。
方式3 :B 向绿灯长亮,A 向红灯亮。
方式4 :B 向左转灯长亮,A 向红灯亮。
方式5 :自动工作方式,两个方向的灯按照显示的顺序,交替循环显示。
系统设有总复位开关,可在任意时间内对系统进行复位。
利用M2M1M0对系统工作的状态进行控制(见表1)。
A路口和B路口均需要红黄绿加左转四盏灯。
所以输出显示可以用8个LED灯代替。
又因为最大显示时间为60s,故用两个数码管即可承担显示一个倒数计时器的任务。
由以上分析可知,系统的输入确定为CLK、RST、M2、M1、M0,输出确定为8个LED灯和4个数码管。
在这种情况下,设AB方向状态转换如表2。
S1: M2=1,M1=X,M0=X A绿B红。
S2: M2=1,M1=X,M0=X A黄B红S3: M2=1,M1=X,M0=X, A左转B红S4: M2=1,M1=X,M0=X, A黄B红S5: M2=1,M1=X,M0=X, A红B绿S6: M2=1,M1=X,M0=X, A红B黄S7: M2=1,M1=X,M0=X, A红B左转S8: M2=1,M1=X,M0=X, A红B黄S9: M2=0,M1=0,M0=0, A长绿B长红S10: M2=0,M1=0,M0=1, A长左转B长红S11: M2=0,M1=1,M0=0, A长红B长绿S12: M2=0,M1=1,M0=1, A长红B长左转1.3系统设计框图系统采用的时钟频率为10KHZ ,经分频为1HZ 后送入控制计时电路,同时送入控制计时电路的还有控制信号M2M1M0以及复位信号RST ,控制交通灯的运行状态。
经处理后输出LED 灯以及数码管显示电路的控制信号,从而完成整个电路的控制与实现。
图3 系统设计示意图2.交通信号控制器具体模块设计 2.1时钟分频模块设计系统的时钟输入为10KHZ 的脉冲,而系统时钟计时模块需要1HZ 的脉冲。
分频模块主要为系统提供所需的时钟计时脉冲。
该模块将10KHZ 的脉冲信号进行分频,产生1S 的方波(占空比为50%),作为系统时钟计时信号。
计时模块用来设定路口计时器的初值,并为扫描显示译码模块提供倒计时时间。
2.2控制模块设计控制模块根据外部输入信号,产生系统的状态机,控制其他部分协调工作。
控制模块采用状态机进行设计,可定义出5种工作方式。
当进入自动工作方式时,一共有8种状态。
2.3扫描显示译码模块设计扫描显示译码模块可以根据控制信号,驱动交通信号灯以及倒计时数码管的显示,其中数码管的显示采用动态扫描显示。
2.4.顶层文件设计交通灯的顶层文件是一个原理图文件,它包含3个元件,每一个元件均是由一个模块程序生成。
3个元件分别为:fenpinqi模块、control模块、xianshi模块。
这些模块均经过设计、编译、仿真,结果正确。
最后生成可视化元件。
然后将各个模块用具体电气性质的导线连接起来,这样原理图文件就建好了。
保存编译。
在建立一个vwf波形文件,保存并仿真。
实验证明,仿真结果正确,符合预期3.交通信号控制器功能仿真与测试利用QUARTUSⅡ仿真测试,结果显示,当rst=1时,此时状态led显示为00100100,意思是A向绿灯亮,B向红灯亮数码管输出均为39(图5)。
图5 QUARTUSⅡ仿真结果示意图(一)当M2M1M0处于000时,时间输出为0,LED灯显示为A向绿灯,B向红灯。
当M2M1M0处于001时,时间输出为0,LED灯显示为A向左转,B向红灯。
当M2M1M0处于010时,时间输出为0,LED灯显示为A向红灯,B向绿灯。
当M2M1M0处于011时,时间输出为0,LED灯显示为A向红灯,B向左转(图6)。
图6 QUARTUSⅡ仿真结果示意图(二)当M2等于1时,控制系统进入自动控制状态,数码管倒计时正常,LED灯进入循环状态(图7)。
图7 QUARTUSⅡ仿真结果示意图(三)4.采用的CPLD器件的型号:EP2C8T144C75.结论通过交通信号控制器功能仿真与测试,本设计达到了预定设计的目的,实现了利用可编程门阵列自动控制十字路口交通灯和计时器,各交通灯及计时器均按设计任务要求正常运行。
再一次的体验到了细心对一个编程者的重要性,和程序的规范性对于程序的重要性,这些平时我们忽略的问题,其实有时候关乎着我们编程的成功率;还有,verilog HDL设计语言是一门很好的硬件描述语言,可以直白的描述实际的电路,实际的系统模型,易懂而且易于实现,我觉得在以后多加练习,可以对以后的学习和工作带来莫大的帮助。
这次期末的课程设计就是对我们的一次考核,也可以说是一次考验,在平时做题目比较简单,而这次课程设计综合考核了我们的学习结果。
课程设计培养了学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程。
参考文献[1]王正勇.基于FPGA 的交通信号控制器的设计《电子测量技术》第31 卷第10期2008 .10[2] 蓝运维.基于FPGA 的交通灯控制系统的仿真《现代电子技术》2006年第9 期总第224 期[3]《基于CPLD/FPGA 的数字通信系统建模与设计》作者:段吉海黄智伟电子工业出版社出版日期:2004年8月书号:ISBN 7121002124附录:程序源代码分频模块源代码:module fenpin(clk10k,rst,clk1); //将10K的频率分频为1input clk10k,rst;output clk1;reg [7:0]j;reg clk1;always@(posedge clk10k or posedge rst)if(rst)beginclk1<=0;j<=0;endelse if(j==9999)beginj<=0;clk1<=~clk1;endelse j<=j+1;endmodule控制计时模块源代码:module control(rst,clk1,M1,M2,M0, //control moodled, //traffic lightS_NS, //ns seg shiweiM_NS, //ns seg geweiS_WE, //M_WE //);input rst,clk1,M1,M2,M0;output [7:0]led;//8 LEDs;00000000means"al,ar,ag,ay;bl,br,bg,by"all off;output [3:0]S_NS,M_NS,S_WE,M_WE;reg [7:0]led;reg [3:0]S_NS,M_NS,S_WE,M_WE;wire [2:0]a; //判断此时的控制位reg [11:0]state;parameter S1=12'b000000000001,S2=12'b000000000010,S3=12'b000000000100,S4=12'b000000001000,S5=12'b000000010000,S6=12'b000000100000,S7=12'b000001000000,S8=12'b000010000000,S9=12'b000100000000,S10=12'b001000000000,S11=12'b010*********,S12=12'b100000000000;assign a={M2,M1,M0};always@(posedge clk1 or posedge rst)if(rst)beginstate<=S1;led<=8'b00100100;S_NS<=3;M_NS<=9;S_WE<=3;M_WE<=9;endelse begincasex(a)3'b000:beginstate<=S9;led<=8'b00100100;S_NS<=0;M_NS<=0;S_WE<=0;M_WE<=0;end3'b001:beginstate<=S10;led<=8'b10000100;S_NS<=0;M_NS<=0;S_WE<=0;M_WE<=0;end3'b010:beginstate<=S11;led<=8'b01000010;S_NS<=0;M_NS<=0;S_WE<=0;M_WE<=0;end3'b011:beginstate<=S12;led<=8'b01001000;S_NS<=0;M_NS<=0;S_WE<=0;M_WE<=0;end3'b1xx:begincase(state)S1:if(S_NS==0&&M_NS==0)beginstate<=S2;led<=8'b00010100;S_NS<=0;M_NS<=4;S_WE<=0;M_WE<=4;endelse if(M_NS) beginM_NS<=M_NS-1;M_WE<=M_WE-1;endelse if(S_NS) beginM_NS<=9;M_WE<=9;S_NS<=S_NS-1;S_WE<=S_WE-1;endS2:if(S_NS==0&&M_NS==0)beginstate<=S3;led<=8'b10000100;S_NS<=0;M_NS<=9;S_WE<=0;M_WE<=9;endelse if(M_NS) beginled[4]<=~led[4];led[5]<=0;M_NS<=M_NS-1;M_WE<=M_WE-1;endelse if(S_NS) beginM_NS<=9;M_WE<=9;S_NS<=S_NS-1;S_WE<=S_WE-1;endS3:if(S_NS==0&&M_NS==0)begin state<=S4;led<=8'b00010100;S_NS<=0;M_NS<=4;S_WE<=0;M_WE<=4;endelse if(M_NS) beginM_NS<=M_NS-1;M_WE<=M_WE-1;endelse if(S_NS) beginM_NS<=9;M_WE<=9;S_NS<=S_NS-1;S_WE<=S_WE-1;endS4:if(S_NS==0&&M_NS==0)begin state<=S5;led<=8'b01000010;S_NS<=3;M_NS<=9;S_WE<=3;M_WE<=9;endelse if(M_NS) beginled[4]<=~led[4];led[7]<=0;M_NS<=M_NS-1;M_WE<=M_WE-1;endelse if(S_NS) beginM_NS<=9;M_WE<=9;S_NS<=S_NS-1;S_WE<=S_WE-1;endS5:if(S_NS==0&&M_NS==0)begin state<=S6;led<=8'b01000001;S_NS<=0;M_NS<=4;S_WE<=0;M_WE<=4;endelse if(M_NS) beginM_NS<=M_NS-1;M_WE<=M_WE-1;endelse if(S_NS) beginM_NS<=9;M_WE<=9;S_NS<=S_NS-1;S_WE<=S_WE-1;endS6:if(S_NS==0&&M_NS==0)begin state<=S7;led<=8'b01001000;S_NS<=0;M_NS<=9;S_WE<=0;M_WE<=9;endelse if(M_NS)beginled[0]<=~led[0];led[1]<=0;M_NS<=M_NS-1;M_WE<=M_WE-1;endelse if(S_NS) beginM_NS<=9;S_WE<=S_WE-1;M_WE<=9;S_NS<=S_NS-1;endS7:if(S_NS==0&&M_NS==0)begin state<=S8;led<=8'b01000001;S_NS<=0;M_NS<=4;S_WE<=0;M_WE<=4;endelse if(M_NS) beginM_WE<=M_WE-1;M_NS<=M_NS-1;endelse if(S_NS) beginS_WE<=S_WE-1;M_WE<=9;M_NS<=9;S_NS<=S_NS-1;endS8:if(S_NS==0&&M_NS==0)beginstate<=S1;led<=8'b00100100;S_NS<=3;M_NS<=9;S_WE<=3;M_WE<=9;endelse if(M_NS) beginled[0]<=~led[0];led[3]<=0;M_WE<=M_WE-1;M_NS<=M_NS-1;endelse if(S_NS) beginM_NS<=9;S_NS<=S_NS-1;S_WE<=S_WE-1;M_WE<=9;enddefault: beginstate<=S1;led<=8'b00100100;S_NS<=3;M_NS<=9;S_WE<=3;M_WE<=9;endendcaseendendcaseendendmodule显示模块源代码:module xianshi(rst,clk,S_NS,M_NS,S_WE,M_WE,sel,seg); input rst,clk;input [2:0]S_NS,M_NS,S_WE,M_WE;output [6:0]sel;output [3:0]seg;reg [6:0]sel;reg [3:0]seg;reg [15:0] count;reg [1:0] cnt;reg [3:0] data;reg clk_odd;always@(posedge clk or posedge rst)beginif(rst)begincount<=0;clk_odd<=0;endelse if(count==9)beginclk_odd<=~clk_odd;count<=0;endelsecount<=count+1;endalways @(posedge rst or posedge clk_odd) if (rst)begincnt<=2'b00;endelse cnt<=cnt+1;always@(posedge rst or posedge clk_odd) if(rst) beginseg = 4'b1111 ;endelse begincase (cnt)2'b00: beginseg =4'b1110 ;data=S_NS;end2'b01: beginseg = 4'b1101 ;data =M_NS;end2'b10:beginseg= 4'b1011 ;data=S_WE;end2'b11: beginseg= 4'b0111 ;data=M_WE;enddefault :beginseg = 4'b1111 ;endendcaseendalways @ (data or seg)begincase(data)4'b0000:sel=7'b1111110;4'b0001:sel=7'b0110000;4'b0010:sel=7'b1101101;4'b0011:sel=7'b1111001;4'b0100:sel=7'b0110011;4'b0101:sel=7'b1011011;4'b0110:sel=7'b1011111;4'b0111:sel=7'b1110000;4'b1000:sel=7'b1111111;4'b1001:sel=7'b1111011;default:sel=7'b1111110;endcaseendendmodule顶层模块:module mylight(clk10k,rst,M2,M1,M0,led,seg,sel);input clk10k,rst,M2,M1,M0;output [3:0] seg;output [6:0] sel;output [7:0] led;wire [2:0]S_NS,M_NS,S_WE,M_WE;wire clk_odd,M2,M1,M0;wire [3:0] seg;wire [6:0] sel;control control1(.led(led),.rst(rst),.clk1(clk_odd),.S_NS(S_NS),.M_NS(M_NS),.S_WE(S_WE),.M_WE(M_WE),.M2(M2),.M1(M1),.M0(M0));Xianshi xianshi1(.rst(rst),.clk(clk10k),.S_NS(S_NS),.M_NS(M_NS),.S_WE(S_WE),.M_WE(M_WE),.sel(sel),.seg(seg));fenpin fenpin1(.clk10k(clk10k),.rst(rst),.clk1(clk_odd));endmodule。