您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 交通信号灯控制器的verilog实现
HHaarrbbiinnIInnssttiittuutteeooffTTeecchhnnoollooggyyVVeerriilloogg实实验验报报告告((22))实验内容:交通信号灯控制器班级:姓名:学号:哈尔滨工业大学2015年6月一、功能描述本设计利用VerilogHDL语言,对一个十字路口的交通信号灯进行控制,可控制4个路口的红、黄、绿、左转四盏信号灯,让其按特定的规律进行变化。并通过ModelSim软件对系统进行了仿真。仿真结果表明系统可自动实现十字路口红绿灯及左转弯信号灯的控制。实现设计目标如下:(1)设计一个十字路口的交通灯控制电路,每条路配有红、黄、绿、左转四盏交通信号灯。通过控制器对四个路口的四组交通灯的状态实现自动循环控制;(2)实现两主干道车辆交替运行,每次通行直行时间为30秒;左转时间为10秒,右转不受信号灯控制。(3)黄灯作为绿灯转为左转灯,左转灯转为红灯的过渡信号灯,过渡时间为5s。(4)系统设有总复位开关,可在任意时间对系统进行复位。二、设计方案1.设计思路我们对图1所示的十字路口进行设计,路口A和路口C的车辆同时行驶,路口B和路口D的车辆同时行驶,所以虽然要控制4组信号灯,但其实它们可以俩俩合并,这样大大简化了设计。由于我们采用自动控制方式,两个方向的灯按照顺序依次交替循环显示,每种灯亮的时间结合实际生活合理设定。系统设有复位开关,可在任意时间内对系统进行复位。图1十字路口示意图由以上分析可知,该系统可视为一个状态机,而且共有8种状态,如表1所示。表1交通灯状态示意表由上表我们还可以得到状态转换图,如图2所示:S6S7S0000003S11S25S47S36S5图2状态转移示意图该状态机共有两个输入信号rstn和clk,rstn为复位信号,当该信号为低电平时,状态机处于S0,且状态不发生改变。当rstn为高电平时,这8个状态依次按时间顺序发生变化,每个状态保持多长时间由clk信号控制。三、关键代码1.我们通过宏定义来设置每个状态保持的时间,这样既增强了代码的可读性,又方便以后的更改。由于此实验不做硬件设计,只是通过仿真来验证,所以为了方便看波形,我们用一个时钟周期代表5s,具体代码如下:`defineG2YDELAY6//绿灯亮转到红灯亮的延迟,用一个时钟周期代替5s,//则此延迟为30s,这样做是为了仿真时容易看波形`defineY2LDELAY1//黄灯亮转到左转灯亮的延迟时间为5s`defineL2YDELAY2//左转灯亮转到黄灯亮的延迟时间为10s`defineY2RDELAY1//黄灯亮转到红灯亮的延迟时间为5s2.我们用一个16位的reg类型的向量light来代表16盏交通信号灯,light[15:12]代表A路口,light[11:8]代表B路口,light[7:4]代表C路口,light[3:0]代表D路口,高位到低位依次表示左转灯,红灯,绿灯,黄灯且每一位用1代表亮,0代表灭。3.用state表示当前状态,用next_state代表下一个状态,当rstn被拉低时,让系统处于S0状态,否则在时钟上升沿到来时将next_state赋给state。代码如下:always@(posedgeclk)if(!rstn)beginstate=S0;next_state=S0;endelsestate=next_state;//状态改变4.当系统处于某种状态时必须有确定的输出,通过运用case语句代码可读性更强,而且简介。代码如下:always@(state)begincase(state)S0:light=16'b0010_0100_0010_0100;S1:light=16'b0001_0100_0001_0100;S2:light=16'b1000_0100_1000_0100;S3:light=16'b0001_0100_0001_0100;S4:light=16'b0100_0010_0100_0010;S5:light=16'b0100_0001_0100_0001;S6:light=16'b0100_1000_0100_1000;S7:light=16'b0100_0001_0100_0001;endcaseend5.控制状态何时发生改变是关键,通过repeat语句来实现延时,而且只有当rstn为高电平是,状态才可以发生改变,代码如下:always@(stateorrstn)beginif(rstn)begincase(state)S0:beginrepeat(`G2YDELAY-1)@(posedgeclk);next_state=S1;endS1:beginrepeat(`Y2LDELAY-1)@(posedgeclk);next_state=S2;endS2:beginrepeat(`L2YDELAY-1)@(posedgeclk);next_state=S3;endS3:beginrepeat(`Y2RDELAY-1)@(posedgeclk);next_state=S4;endS4:beginrepeat(`G2YDELAY-1)@(posedgeclk);next_state=S5;endS5:beginrepeat(`Y2LDELAY-1)@(posedgeclk);next_state=S6;endS6:beginrepeat(`L2YDELAY-1)@(posedgeclk);next_state=S7;endS7:beginrepeat(`Y2RDELAY-1)@(posedgeclk);next_state=S0;endendcaseendend四、仿真与验证1.首先写一个testbench,由于输入信号少,而且状态是通过延时状态自动发生改变的,所以比较简单。详细代码见附录2。2.通过modelsim进行仿真,仿真时间设为500ns,波形图如图3,从图中我们可以看到该系统基本实现了功能。图3仿真波形图3.放大局部,我们更细致地观察,可以确保它的正确性,如图5。图4局部放大图五、结论通过对交通信号控制器进行功能仿真,本设计达到了预定设计的目的,实现了利用verilog语言设计自动控制十字路口交通灯这样一个简单的数字系统,各交通灯设计任务要求正常运行。不过这是在理想状态下进行的仿真,如果考虑到实际门延时,该系统是否可靠,有待于进一步验证。附录1交通信号灯的verilog代码:`defineG2YDELAY6//绿灯亮转到红灯亮的延迟,用一个时钟周期代替5s,//则此延迟为30s,这样做是为了仿真时容易看波形`defineY2LDELAY1//黄灯亮转到左转灯亮的延迟时间为5s`defineL2YDELAY2//左转灯亮转到黄灯亮的延迟时间为10s`defineY2RDELAY1//黄灯亮转到红灯亮的延迟时间为5smodulesign_control(light,rstn,clk);output[15:0]light;inputrstn,clk;reg[15:0]light;//light[15:12]代表A路口//light[11:8]代表B路口//light[7:4]代表c路口//light[3:0]代表D路口//高位到低位依次表示左转灯,红灯,绿灯,黄灯且每一位用1//代表亮,0代表灭//状态定义parameterS0=3'd0,S1=3'd1,S2=3'd2,S3=3'd3,S4=3'd4,S5=3'd5,S6=3'd6,S7=3'd7;//内部状态变量reg[2:0]state;reg[2:0]next_state;//状态只能在时钟的上升沿改变always@(posedgeclk)if(!rstn)beginstate=S0;next_state=S0;endelsestate=next_state;//状态改变always@(state)begincase(state)S0:light=16'b0010_0100_0010_0100;S1:light=16'b0001_0100_0001_0100;S2:light=16'b1000_0100_1000_0100;S3:light=16'b0001_0100_0001_0100;S4:light=16'b0100_0010_0100_0010;S5:light=16'b0100_0001_0100_0001;S6:light=16'b0100_1000_0100_1000;S7:light=16'b0100_0001_0100_0001;endcaseendalways@(state)begincase(state)S0:beginrepeat(`G2YDELAY-1)@(posedgeclk);next_state=S1;endS1:beginrepeat(`Y2LDELAY-1)@(posedgeclk);next_state=S2;endS2:beginrepeat(`L2YDELAY-1)@(posedgeclk);next_state=S3;endS3:beginrepeat(`Y2RDELAY-1)@(posedgeclk);next_state=S4;endS4:beginrepeat(`G2YDELAY-1)@(posedgeclk);next_state=S5;endS5:beginrepeat(`Y2LDELAY-1)@(posedgeclk);next_state=S6;endS6:beginrepeat(`L2YDELAY-1)@(posedgeclk);next_state=S7;endS7:beginrepeat(`Y2RDELAY-1)@(posedgeclk);next_state=S0;endendcaseendendmodule附录2激励块代码如下:`timescale1ns/100psmodulestimulus;regclk,rstn;wire[15:0]light;sign_controlil(light,rstn,clk);initialbeginclk=1'b1;forever#2.5clk=~clk;endinitialbeginrstn=1'b0;#60rstn=1'b1;#200rstn=1'b0;#100rstn=1'b1;endendmodule
本文标题:交通信号灯控制器的verilog实现
链接地址:https://www.777doc.com/doc-6990356 .html