基于Verilog HDL描述语言实现交通灯系统控制器的设计

EDA/IC设计

1048人已加入

描述

  本文采用EDA技术,应用目前广泛应用的Verilog HDL硬件电路描述语言,实现交通灯系统控制器的设计,利用MAX+PLUS 集成开发环境进行综合、仿真,并下载到CPLD可编程逻辑器件中,完成系统的控制作用。

  1 引言

  EDA技术是依靠功能强大的电子计算机,在EDA工具软件平台上,对以硬件描述语言HDL(Hardware Description Language)为系统逻辑描述手段完成的设计文件,自动地完成逻辑编辑、化简、分割、综合、优化和仿真,直至下载到可编程逻辑器件CPLD/FPGA或专用集成电路ASIC(Application Specific Integrated Circuit)芯片中,实现既定的电子电路设计功能。EDA技术使得电子电路设计者的工作仅限于利用硬件描述语言和EDA软件平台来完成对系统硬件功能的实现,极大地提高了设计效率,缩短了设计周期,节省了设计成本。

  实现路口交通灯系统的控制方法很多,可以用标准逻辑器件,可编程控制器PLC,单片机等方案来实现。但是这些控制方法的功能修改及调试都需要硬件电路的支持,在一定程度上增加了功能修改及系统调试的困难。因此,在设计中采用EDA技术,应用目前广泛应用的Verilog HDL硬件电路描述语言,实现交通灯系统控制器的设计,利用MAX+PLUS 集成开发环境进行综合、仿真,并下载到CPLD可编程逻辑器件中,完成系统的控制作用。

  2 Verilog HDL硬件描述语言的介绍

  Verilog HDL是目前应用最广泛的一种硬件描述语言。Verilog HDL是在1983年由GDA(GateWay Design Automation)公司的Phil Moorby首创的。1986年,他对Verilog HDL的发展又作出了另一个巨大贡献:提出了用于快速门级仿真的XL算法。Verilog-XL算法的成功,使Verilog HDL语言得到迅速发展。基于Verilog HDL的优越性,IEEE于1995年制定了Verilog HDL 的IEEE标准,即Verilog HDL1364-1995。Verilog HDL语言具有以下特点:

  基本逻辑门,例如and,or和nand等都内置在语言中。

  用户定义原语(UDP)创建的灵活性。用户定义的原语既可以是组合逻辑原语,也可以是时序逻辑原语。

  开关级基本结构模型,例如pmos和nmos等也被内置在语言中。

  提供显示语言结构制定设计中的端口到端口的时延及路径和设计的时序检查。

  可以用三种不同方式或混和方式对设计建模这些方式包括:行为描述方式—— 使用过程化结构建模;数据流方式—— 使用连续赋值语句方式建模;结构化方式—— 使用门和模块实例语句描述建模。

  能够描述层次设计,可使用模块实例结构描述任何层次。

  Verilog HDL的描述能力能够通过使用编程语言接口(PLI)机制进一步扩展。PLI是允许外部函数访问Verilog模块内信息,允许设计者与模拟器交互的例程集合。

  设计能够在多个层次相加以描述,从开关级,门级,寄级器传送级(RTL)到算法级,包括进程和队列级。

  能够监控拟验证的执行,即模拟验证执行过程这设计的值能够被监控和显示。

  在行为级描述中,Verilog HDL不仅能够在RTL级上进行设计描述,而且能够在体系结构描述及其算法级行为上进行设计描述。

  3 交通灯系统控制器的设计

  3.1 控制器的设计要求

  按照路口交通运行的实际情况,在本系统中,设定系统的工作情况如下:

  A 方向和B方向各设红(R)、黄(Y)、绿(G)和左拐(L)四盏灯按合理的顺序亮灭,并能将灯亮的时间以倒计时的形式显示出来。两个方向各种灯亮的时间应该能够非常方便地进行设置和修改,此外假设A方向是主干道,车流量大,因此A方向通行的时间应比B方向长一些。其示意图如图1所示。

交通灯

  图1 十字路口交通灯示意图

  交通灯控制器的状态转换如表1所示。表中1表示灯亮,0表示灯灭。A方向和B方向的红、黄、绿和左拐灯分别用R1、Y1、G1、L1和R2、Y2、G2、L2来表示。

交通灯

  表1 交通灯控制器状态转换

  从状态转换表中可以看出,每个方向四种灯依次按如下顺序点亮,并不断循环:

  绿灯→黄灯→左拐灯→黄灯→红灯。

  并且每个方向红灯亮的时间应该与另一方向绿、黄、左拐、黄灯亮的时间相等。黄灯所起的作用是用来在绿灯和左拐灯后进行缓冲,以提醒行人该方向马上要禁行了。

  3.2 控制器的Verilog HDL程序设计

  根据交通灯控制器要实现的功能,考虑用两个并行执行的always模块来分别控制A和B两个方向的四盏灯,这两个always模块使用同1个时钟信号,以进行同步,也就是说,两个always模块的敏感信号是同1个。例如A方向的控制程序描述如下:

  ……

  always@(posedge CLK)//该always模块控制A方向的4种灯

  begin

  if(EN)

  begin

  if(!tempa)

  begin

  tempa《= 1;

  ……

  每个always模块控制1个方向的4种灯按如下顺序点亮,并往复循环:

  绿灯→黄灯→左拐灯→黄灯→红灯。程序描述如下:

  ……

  case(counta)//控制亮灯的顺序

  0:begin numa《=agreen;LAMPA《=2;counta《=1;end

  1:begin numa《=ayellow;LAMPA《=4;counta《=2;end

  2:begin numa《=alert;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

  ……

  每盏灯亮的时间采用一个减法计数器进行计数,该计数器采用同步预置法设计,这样只需改变预置数据,就可以改变计数器的模,因此每个方向只需要1个计数器进行计时即可。为便于显示灯亮的时间,计数器的输出均采用BCD码,显示由4个数码管来完成,A方向和B方向各用两个数码管。可用如下程序描述:

  ……

  else begin//倒计时

  if(numa》1)

  if(numa[3:0]==0)begin

  numa[-3:0]《=4b1001;

  numa[7:4]《=numa[7:4]-1;

  end

  else numa[3:0]《=numa[3:0]-1;

  if(numa==2) tempa《=0;

  end

  此外,本设计中还设定A方向红、绿、黄、左拐灯亮的时间分别为65秒、40秒、5秒和15秒,B方向红、绿、黄、左拐灯亮的时间分别为:55秒、30秒、5秒和15秒。假如要改变这些时间只须改变计数器的预置数即可。程序描述如下:

  ……

  begin//设置各种灯的计数器的预置数

  ared《=8b01010101;//65s

  ayellow 《=8b00000101;//5s

  agreen 《=8b01000000; //40s

  aleft 《=8b00010101; //15s

  bred 《=8b01100101; //55s

  byellow 《=8b00000101; //5s

  bleft 《=8b00010101; //15s

  bgreen 《=8b00110000; //30s

  end

  为了更直观地加以描述,将上面的文本模块编译生成一个符号,并加上输入输出引脚,构成完整的交通灯控制器顶层电路。如图2所示。

交通灯

  图2 交通灯控制器电路

  4 仿真结果

  仿真运行是HDL的强大功能之一,虽然与现场环境不可能完全一致,但可以帮助设计者解决逻辑错误,如果在设计时能够将器件时序和时延时间考虑完整,并作好准确的描述,就可以最大程度的模拟真实环境,对最后生成的电路改动较少,节约了成本。本设计对整个交通灯控制器用MAX+PLUS软件编译并进行时序仿真。

  5 总结

  erilog HDL有着类似C语言的风格,易于学习和掌握。与传统的原理图输入设计方法相比较,Verilog HDL更适用于规模日益增大的数字系统,用Verilog HDL等硬件描述语言进行数字系统的设计是当前EDA发展的趋势,也是一种具有广阔前景的集成电路开发工具。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分