交通灯设计-verilog.
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
.
基于Verilog语言交通灯设计报告
院系:工学院自动化系
年级:14级
班级:10班
姓名:***
学号:********
这学期我学习了EDA技术及其创新实践这门课程,通过自己学习的内容和自己查找的一些资料用Verilog语言编写交通灯的程序,并且完成了仿真。Verilog HDL是工业和学术界的硬件设计者所使用的两种主要的HDL之一,另一种是VHDL。现在它们都已成为IEEE标准。两者各有特点,但Verilog HDL拥有更悠久的历史、更广泛的设计群体,资源也远比VHDL丰富,且非常容易学习掌握。一、设计背景和意义
交通灯控制系统主要是实现城市十字交叉路口红绿灯的控制。在现代化的大城市中,十字交叉路口越来越多,在每个交叉路口都需要使用红绿灯进行交通指挥和管理,红、黄、绿灯的转换要有一个准确的时间间隔和转换顺序,这就需要有一个安全、自动的系统对红、黄、绿灯的转换进行管理,本系统就是基于此目的而开发的。
二、设计任务
(1)设计一个交通红绿灯。要求分主干道和支干道,每条道上安装红(主:red1,支:red2)绿(主:green1,支:green2)黄(主:yellow1,支:yellow2)三种颜色灯,由四种状态自动循环构成;
(2)在交通灯处在不同的状态时,设计一个计时器以倒计时方式显示计时,主干道上绿灯亮30S,支干道上绿灯亮20S。每个干道上,在绿灯转为红灯时,要
求黄灯先亮5S。
在完成基本要求的基础上,可进一步增加功能、提高性能,如绿灯亮的时间可调。
三、设计方案
1.工作原理:
城市十字交叉路口红绿灯控制系统主要负责控制主干道走向和从干道走向的红绿灯的状态和转换顺序,关键是各个状态之间的转换和进行适当的时间延时,正是基于以上考虑,采用如下设计:
S0:当主干道走向的绿灯亮时,从干道走向的红灯亮,并保持30s
S1:当主干道走向的黄灯亮时,从干道走向的黄灯亮,并保持5s
S2:当主干道走向的红灯亮时,从干道走向的绿灯亮,并保持20s
S3:当主干道走向的黄灯亮时,从干道走向的黄灯亮,并保持5s
在S3结束后又回到(1)状态,并周期重复进行。
状态图如下:
30秒
5秒5秒
2.系统设计方案:
根据设计要求和系统所具有功能,并参考相关的文献资料经行方案设计画出如下所示的十字路口交通灯控制器系统框图,及为设计的总体方案,框图如下图所示:
20秒
四、设计源程序
1.verilog源程序:
module traffic(en,clk,rst,num1,num2,light1,light2,out1,out2,out3,out4,in1,in2); input en,clk,rst,in1,in2; //en为使能端。in1,in2控制绿灯和红灯亮时间
output [7:0] num1,num2;
output [2:0] light1,light2;
output [6:0]out1,out2,out3,out4;//输出四个数码管
reg [6:0]out1,out2,out3,out4;
reg tim1,tim2;
reg [1:0]state1,state2;
reg [2:0]light1,light2;
reg [7:0] num1,num2;
reg [7:0] red1,red2,green1,green2,yellow1,yellow2;
parameter s0=2'b00,s1=2'b01,s2=2'b10,s3=2'b11;//四个循环状态
reg[25:0]count;reg div;
always @(en )
if(en)
begin //设置计数初值
if (!in1)begin green1<=8'b00110000;red2<=8'b00110000; end//30H,即30秒else begin green1<=8'b01100000;red2<=8'b01100000;end//60s
if (!in2)begin red1<=8'b00100000;green2<=8'b00100000; end//20s else begin red1<=8'b01000000;green2<=8'b01000000; end//40s yellow1<=8'b00000101; yellow2<=8'b00000101;//05s
end
always@(posedge clk)//分频
if (count==25000000) begin div<=1;count<=count+1;end
else if(count==50000000)begin div<=0;count<=0;end
else count<=count+1;
always @(posedge div)
begin
if(rst) //复位情况控制
begin
light1<=3'b001;
num1<=green1;
end
else if(en)
begin //使能有效开始控制计数
if(!tim1) //开始控制
begin //主干道交通灯点亮控制
tim1<=1;
case(state1)//状态机
s0:begin num1<=green1;light1<=3'b001;state1<=s1;end s1:begin num1<=yellow1;light1<=3'b010;state1<=s2;end s2:begin num1<=red1;light1<=3'b100;state1<=s3;end
s3:begin num1<=yellow1;light1<=3'b010;state1<=s0;end default:light1<=3'b100;
endcase
end
else
begin //倒数计时
if(num1>0)
if(num1[3:0]==0)
begin
num1[3:0]<=4'b1001;
num1[7:4]<=num1[7:4]-1;//十位减1
end
else num1[3:0]<=num1[3:0]-1; //个位减1 if(num1==1) tim1<=0;
end
end