《EDA技术与VHDL语言设计》
课程设计
题目:交通灯控制器
姓名: *****
院系:电子信息工程系
专业:电子信息工程
班级:电信112班
学号: ******
指导教师: ******
2013年6 月
交通灯控制器
***
(电子信息工程学系指导教师:**)
摘要:传统的交通灯控制器多数由单片机实现,本文介绍基于EDA技术设计交通灯控制器的
一种方案。
EDA技术的一个重要特征是使用硬件描述语言来完成系统的设计文件,这在电子
设计领域已得到设计者的广泛采用。
给出了交通灯控制器的源程序和仿真结果,仿真结果表明
该设计方案可行。
关键词:交通灯控制器;仿真;设计
1.设计原理
1.1设计要求
设计一个十字路口交通控制器,器示意图如图1.1所示,A方向和B方向歌设红(R)、黄(Y)、
绿(G)、和左拐(L)四盏灯,四种灯按合理的顺序亮灭,并能将灯亮的时间以倒计时的形式显示出来。
A方向红、绿、黄、左拐灯亮的时间分别为65s、40s、5s、和15s,B方向红、绿、黄、左拐灯亮的时
间分别为55s、30s、5s、和15s。
1.2功能要求
两个方向各种灯亮的时间能够进行设置和修改,此外假设A方向是主干路,车流大,因此在
表1.2 交通灯控制器的状态
1.3设计思路和原理
根据交通灯控制器要求实现的功能,考虑用两个并行执行的always模块来分别控制A和B两个方向的四盏灯,这两个always模块使用同一个时钟信号,以进行同步。
也就是说,两个always模块的敏感信号是同一个,每个模块控制一个方向的四种灯按如下顺序点亮,并往复循环:绿灯→黄灯→左拐灯→黄灯→红灯。
每种灯亮的时间采用一个减法计数器进行计数,计数器用同步预置法设计,这样只需改变计数器的
模,因此每个方向只要一个计数器进行计时即可。
为便于显示灯亮的时间,计数器的输出均采用BCD 码,显示由四个数码管来完成,A方向和B方向各用两个数码管。
2.Verilog HDL程序设计
根据整体设计要求,编写各个功能部分Verilog HDL程序,设置各输入输出变量说明如下:
LAMPA:控制A方向四盏灯的亮灭,其中,LAMPA0~LAMPA3,分别控制A方向的左拐灯、绿灯、黄灯和红灯;
LAMPB:控制B方向四盏灯的亮灭,其中,LAMPB0~LAMPB3,分别控制B方向的左拐灯、绿灯、黄灯和红灯;
ACOUNT:用于A方向灯的时间显示,8位,可驱动两个数码管;
BCOUNT:用于B方向灯的时间显示,8位,可驱动两个数码管。
程序清单如下:
module traffic(CLK,EN,LAMPA,LAMPB,ACOUNT,BCOUNT);
input CLK,EN; //输入同步时钟和使能信号
output[3:0] LAMPA,LAMPB;
output[7:0] ACOUNT,BCOUNT;
reg tempa,tempb;
reg[2:0] counta,countb;
reg[3:0] LAMPA,LAMPB;
reg[7:0] ared,ayellow,agreen,aleft,bred,byellow,bgreen,bleft;
reg[7:0] numa,numb;
always @(EN)
if(!EN)
begin //设置各种灯的计数器的预置数
ared <=8'd30; ayellow <=8'd5; //设置各种灯的计数器的预置数A方向红
agreen <=8'd45; aleft <=8'd15;
bred <=8'd50; byellow <=8'd5; //设置各种灯的计数器的预置数B方向红
bleft <=8'd10; bgreen <=8'd30;
end
assign ACOUNT=numa;
assign BCOUNT=numb;
always @(posedge CLK) //该进程控制A方向的四种灯
begin
if(EN)
begin
if(!tempa)
begin tempa<=1;
case(counta) //控制亮灯的顺序
0:begin numa<=agreen;LAMPA<=2;counta<=1;end
1:begin numa<=ayellow;LAMPA<=4;counta<=2;end
2:begin numa<=aleft;LAMPA<=1;counta<=3;end
3:begin numa<=ayellow;LAMPA<=4;counta<=4;end
4:begin numa<=ared;LAMPA<=8;counta<=0;end
default: LAMPA<=8;
endcase
end
else begin //倒计时
if(numa>1)
if(numa[3:0]==0)
begin numa[3:0]<=4'b1001;numa[7:4]<=numa[7:4]-1;end
else numa[3:0]<=numa[3:0]-1;
if(numa==2) tempa<=0;
end
end
else begin LAMPA<=4'b1000;counta<=0;tempa<=0;end
end
always @(posedge CLK) //该进程控制B方向的四种灯
begin
if(EN)
begin
if(!tempb)
begin tempb<=1;
case (countb) //控制亮灯的顺序
0:begin numb<=bred;LAMPB<=8;countb<=1;end
1:begin numb<=bgreen;LAMPB<=2;countb<=2;end
2:begin numb<=byellow;LAMPB<=4;countb<=3;end
3:begin numb<=bleft;LAMPB<=1;countb<=4;end
4:begin numb<=byellow;LAMPB<=4;countb<=0;end
default LAMPB<=8;
endcase
end
else begin //倒计时
if(numb>1)
if(!numb[3:0])
begin numb[3:0]<=9;numb[7:4]<=numb[7:4]-1;end
else numb[3:0]<=numb[3:0]-1;
if(numb==2) tempb<=0;
end
end
else begin LAMPB<=4'b1000;tempb<=0;countb<=0;end
end
Endmodule
3.仿真
在maxplus2软件下创建工程,新建编辑设计文件,将程序输入,整体编译后,新建波形仿真文件。
设置仿真时间,时钟周期,输入输出端口,进行波形仿真。
具体仿真波形图及说明如下所示:
图1 交通灯控制器仿真波形
4.结束语:
在设计中采用V erilog HDL语言设计交通灯控制系统, 借助其功能强大的语言结构, 简明的代码描述复杂控制逻辑设计, 在提高工作效率的同时达到求解目的, 并可以通过V erilog HDL 语言的综合工
具进行相应硬件电路生成, 具有传统逻辑设计方法所无法比拟的优越性。
使用MAX+PLUS2编写代码并进行时序仿真,发现有问题的地方及时改掉,经过反复的操作终于达到目的。
时序仿真时经常遇到错误,不是没有波形就是没有延迟,或者是波形不能完整出现。
但经过反复修改程序,考虑各个可能出现的问题并解决,尽量与实际实用性接轨,最终基本完成设计要求。
实践证明,在编写一个较复杂的程序时,一开始一定要画流程图,弄清楚各个功能及实现它们的逻辑算法,做到心中有数后在开始下笔写编写程序。
在编写的时候要尤其要注意语言的规范,首先程序要逻辑清晰,简洁明了,避免不必要的嵌套与条用,其次要适当地给程序加上注解文字,提高可读性,以方便之后的程序出错时进行查找,最后充分利用仿真软件提供的各项编译工具与报错消息,按图索骥,有方向的完成程序调试。
通过这次课程设计,熟悉了简单EDA设计的整个流程,加深了对Verilog HDL硬件描述语言的理解,提高了动手能力,并且锻炼了自己的耐心,收获颇丰,我会把在本次课程设计中学到的东西应用到今后的工作学习中。
参考资料
[1] 俞定玖, 刘湘慧. GSM 数字蜂窝移动交换系统测试[J ]. 电信科学, 2000
[2] 张明. V erilog HDL 实用教程[M ]. 成都: 电子科技大学出版社, 1999
[3] 康华光. 电子技术基础(数字部分) [M ]. 北京: 高等教育出版社, 1988
[4]EDA技术与Verilog设计王金明、冷自强编著科学出版社。