您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 交通运输 > 智能交通灯控制器的设计(verilog)
智能交通灯控制器的设计1、实验目的及要求实验目的:通过交通灯的设计与仿真综合,体会复杂时序的实现方法,学会用框图表示程序的设计思想,掌握中小规模集成电路的系统综合设计方法。实验要求:设计一个交通灯信号控制电路。具体要求为:输入为50MHz的时钟和复位信号,输出为红、绿、黄三个信号(高电平为亮)。复位信号(高电平)有效,红、绿、黄灯灭;接着进行如下循环:绿灯亮1分钟,黄灯闪烁10秒,红灯亮1分钟。在此基础上再加两个数码管,对倒计时的数显示。2、实验设备(环境)及要求实验EDA工具为:SynplifyPro9.6.2和ModelSimSE6.2b。3、实验内容与步骤3.1设计思路概述总体上分为三个大模块,即:顶层模块、控制模块、译码模块(包括显示模块)。他们各自的作用分别如下:顶层模块:此模块只做例化,即对底层的控制模块和译码模块进行例化,而不做逻辑设计。控制模块:此模块是本程序的主体,主要是控制各个灯颜色(此模块并不控制黄灯的闪烁)的转换,以及倒计时时间输出。首先要对时钟进行分频。由于系统时钟频率比较大,因此首先分频产生时钟,用于下面的电路的控制;然后是各种颜色之间的转换,在此在添加一个使能端enable,当使能端enable为0的时候,就开始进行状态循环以及倒计时,然后enable就立即变为1;状态用light_status(分别为0、1、2)表示,开始的时候,如果状态light_status为0,表示此时显示的是绿灯,便把绿灯亮的时间(60s)给统计灯亮时间的变量light_long,并且把显示灯亮的变量light_select赋值100(高电平表示亮),最后把状态标志位light_status赋1,但是此时并不能转向下一个状态(黄),因为绿灯亮的时间还没有控制,接下来会转到倒计时处。然后,我们这里用了BCD码表示倒计时时间。灯亮或闪烁时间(绿、黄、红分别为60s、10s、60s)用BCD码表示(分别为60h、10h、60h),倒计时的时候个位和十位分别是BCD码的高四位和低四位,首先是低四位倒数,当倒数到0时,给它重新赋值为9,且高四位减1,如此循环,直到这个数减到0,此时表示某一个灯亮的时间到,接着进行下一个状态,为了能使进入下一个状态,必须在时间减到0的时候,给使能端enable赋值0;由于用的BCD码,高四位和低四位就分别是我们要在译码模块的要用数码管显示的十位和个位。译码模块:此模块主要有两个作用,控制黄灯闪烁以及对倒计时时间进行译码输出。首先是控制黄灯闪烁。由于控制模块只是控制三个灯的亮与不亮,在此模块中首先是相当于产生一个分频时钟y_flicker(周期1s),然后是控制黄灯的闪烁,控制模块light_select只是控制了三个灯亮与不亮(三位二进制,高电平有效),最后显示灯的亮或者闪还用三位二进制表示(colour),控制时直接把light_select的最高位和最低位直接赋给colour的最高位和最低位(分别控制绿灯和红灯的亮),中间位当分频时钟y_flicker为高且输入light_select为高时,输出colour才为高(黄灯亮),别的情况colour中间位都为低(黄灯灭),至此可以完美实现黄灯的闪烁了(1s内亮0.5s灭0.5s),也就可以实现要求的各个灯的亮或者闪烁。然后就是七段译码的过程。采用了3—8译码器的设计原理,将倒计时时间译码,输出到LED晶体管,显示最终倒计时时间。LED中二极管对应的顺序编号如图1所示,并且是低电平有效。写出所有数字对应的字型码,就可以知道数字的控制电平。由于只有两位数字,考虑到成本以及复杂性,可不用扫描,直接用两个译码器就可以了。图1七段数码管显示字段的示意图3.2、总体设计框图及详细说明程序总体设计框图如图2所示。图2程序总体设计框图下面将对所做的系统框图进行详尽说明:首先,输入的50MHz的系统时钟和全局控制端reset,输出为个位数字的七段译码,十位数字七段译码以及各个灯最后状态。然后由于系统时钟频率很大,第一要进行分频,使其成为1Hz的时钟信号,第二利用分频后的时钟信号对电路进行控制,开始先对状态跳转进行控制,正如1问所述,用case语句控制三灯亮与灭,紧跟着进行倒计时的过程,第三输出个位和十位上的数即可,要显示倒计时是很容易实现的,直接用两个七段译码即可。最后要控制黄灯的闪烁,还是要先产生分频时钟,作为控制端,控制模块各灯亮与灭作为输入,即可产生黄灯闪烁的效果。另外,作为全局控制端,reset信号是清零用的,在有时钟信号的地方就有reset。3.3、时序说明假设在0时刻,加上系统时钟,首先要进行reset清零,这时在控制模块的计数器会清零,三个灯都是灭的状态,控制状态跳转的使能端enable等于0,等待着清零结束,开始工作;七段译码也不会显示。在reset变低之后,系统开始正常工作。首先是分频时钟开始工作,在计数器达到第一个25000000之前,分频时钟都是低电位,到25000000的时候分频时钟的第一个上升沿来临,此时状态控制开始运转,先工作的是绿灯,它会经过从59到0的倒计时过程,同时译码模块也开始工作,颜色控制colour是100,表征绿灯的点亮,经七段译码,这个倒计时数字也会同步显示出来。经过60s(也就是经过60*50M个系统时钟上升沿之后)绿灯亮的时间到,会自动转到黄灯状态,黄灯是9到0的倒计时过程,译码的显示跟绿灯一样,只是黄灯的亮会加一个1Hz的时钟控制端,1秒内只有半秒,黄灯是亮的,从9秒到8.5秒之间黄灯是亮的,然后8.5到8是灭的,如此继续下去,知道10秒结束。又经过10s(70*50M个系统时钟上升沿),状态转移到红灯,然后显示及七段译码过程与绿灯相似。至此一个周期已经完成,接下来就是循环执行以上步骤的过程,直到有reset清零端打断其正常工作。主要的时序是在三个灯不同状态之间跳转,这也是本程序的关键,他们之间的转换关系如图3所示。图3时序状态转化图3.4、模块设计框图、相关时序本程序分为三个模块,顶层模块、控制模块、译码模块,各模块的设计框图以及相关时序说明如下:顶层模块框图如图4所示。输出:color最终各灯状态(包括亮与闪)led_ctrl_1s个位七段译码led_ctrl_10s十位七段译码时序说明:加上时钟信号之后,首先用reset清零,然后控制模块会分频产生分频时钟,根据分频时钟的高与低,会控制各个状态之间的跳转,译码模块会同步通过数码管来显示倒计时数,并且会根据译码模块黄灯闪亮控制端来输出各灯的具体状态。控制模块框图如图5所示。顶层模块控制模块译码模块图5控制模块框图输入:sysclk_50MHz全局时钟信号,50MHzReset全局复位端,高电平有效输出:dout_1s倒计时个位上数字dout_10s倒计时十位上数字light_select各个灯状态light_select(只是控制亮与灭,不管黄灯闪烁)时序说明:首先还是加上系统时钟之后,用reset清零,则计数器清零、所有灯都不亮。但reset为1之后模块开始工作,首先是计数器开始计数,随之分频时钟会根据计数器的变化而周期变化,绿灯会先亮60秒,之后黄灯也会亮(闪烁在译码模块实现)10秒,然后就是红灯亮60秒,以后就是循环以上步骤的过程,同时在循环过程中,倒计数的数会同步输出,各灯亮与灭状态也会同步输出。译码模块框图如图6所示:图6译码模块框图输入端口:sysclk_50MHz全局时钟信号,50MHzreset全局复位端,高电平有效din_1s显示器个位数据,由控制模块输入din_10s显示器十位数据,由控制模块输入light_sel选择那盏灯亮,由控制模块的输入输出端口:colour最终显示哪盏灯亮,可与硬件相连led_data_1s显示器个位数据的译码led_data_10s显示器十位数据的译码时序说明:此模块接受(系统时钟)sysclk_50MHz和(全局复位)reset的控制,均为上升沿触发,当reset为高电平时,电路复位,重新开始工作。当reset为低电平时,电路正常工作。时钟上升沿触发,对[3:0]din_1s(显示器个位数据)进行译码,输出到[6:0]led_data_1s(显示器个位数据的译码),;对[3:0]din_10s(显示器十位数据)进行译码,输出到[6:0]led_data_10s(显示器十位数据的译码)。这两个译码输出端口最终连接到硬件上去,实现7段LED数码管的显示。时钟上升沿触发,对哪个灯亮进行译码输出,light_sel[2]将高电平传入到colour[2]中,红灯开始亮,light_sel[0]将高电平传入到colour[0]中,绿灯开始亮。黄灯的闪烁在顶层模块说明。系统结构和模块划分,关键子模块之间的接口实现定义。系统划分为三个模块,顶层模块、控制模块、译码模块,各个模块的相关功能已经在(1)中详细说明,这里详述子模块接口实现,控制模块里有三个输出,即倒计时时间的十位dout_10s,个位dout_1s,控制灯的亮与灭light_select,这三个都是作为译码模块的输入的,十位和个位直接在译码模块里直接使用,用七段译码,用于显示,灯的亮与灭light_select,最高位和最低位(分别控制绿灯和红灯)直接输出,中间位(控制黄灯)要再加上一个时钟信号,使其闪烁。测试平台设计在modelsim里进行仿真,testbench的书写很简单,从顶层模块来看,只有两个输入和三个输出,即输入系统时钟,控制清零端,输出个位的七段译码,十位的七段译码以及灯的颜色和状态。具体实现代码如下:`timescale1ns/1ns//clk周期应该20nsmoduletraffic_tb;regsysclk_50MHz;regreset;wire[2:0]color;//最后控制绿黄红三灯wire[6:0]led_ctrl_1s;//个位七段译码wire[6:0]led_ctrl_10s;//十位七段译码initialbeginreset=1;#1reset=0;endalwaysbegin#1sysclk_50MHz=0;//这里把系统时钟调为2ns#1sysclk_50MHz=1;endtraffic_lightU_traffic(//实例化.sysclk_50MHz(sysclk_50MHz),.reset(reset),.color(color),.led_ctrl_1s(led_ctrl_1s),.led_ctrl_10s(led_ctrl_10s));endmodule4、实验结果与数据处理Modelsim仿真结果,波形图,代码覆盖率图等首先要说明的是,由于系统时钟频率很大,运行起来很慢,并且时钟频率的大小与最后结果的正确与否关系并不是很大,于是我们在仿真的时候,把时钟周期调为了较小的2ns。由于结果很多很长,不可能一一列举,我们在此选择了几个有代表性的的点给予展示。首先来看看图7,正如上前面所说,我们的输入输出一共有5个但是一些中间的输出的显示能让我们更好的理解,为了更好的理解仿真结果,我们将截图的左边一列的信号从上到下的解释说明列在表1中。表1仿真结果信号解释说明信号解释备注sysclk_50MHz系统时钟,50MHz为了方便,这里取2nscolor最终三灯状态包括绿红灯亮,黄灯闪烁light_selected控制模块灯亮的标志只控制亮与不亮,不闪led_ctrl_1s倒计时个位七段译码系统时钟led_ctrl_10s倒计时十位七段译码系统输出dout_1s倒计时个位上的数字控制模块的输出dout_10s倒计时十位上的数字控制模块的输出y_flicker黄灯闪烁控制端高电平有效图7展示的是绿灯倒计时的某一瞬间,竖线所在的位置是56s,这时候color和light_selected是100,表示此时绿灯亮,而led_ctrl_1s是0010000,对照译码表可以发现它显示的数字6,led_ctrl_10s是0010100,对照译码表可以发现它显示的数字5,十位和个位合起来就是数字56,正好与dout_10s(5)和do
本文标题:智能交通灯控制器的设计(verilog)
链接地址:https://www.777doc.com/doc-5048398 .html