基于VerilogHDL的通行时间可变的交通灯控制器.docx
文本预览下载声明
通行时间可变的交通灯控制器设计module tr1(ng,clk,reset,resets,emergency,lighta,lightb,seg,select);input ng,clk,reset,emergency,resets;output[6:0]seg;//显示用的output[3:0] lighta,lightb;//a是主干道,b是支干道output [3:0] select;//选择那一个管子进行显示reg clk1,clk2;//clk1要5HZ clk2要几千HZreg [3:0] select;reg tim1,tim2;//这是看你的等有没有变过颜色的控制信号reg [1:0] cont;reg[2:0]state1,state2,ste;两个控制颜色变化状态的信号。reg[3:0]lighta,lightb;//a是主干道,b是支干道reg[3:0]num;//译码器是根据这个东西来译码的reg [35:0] fout;reg[6:0]seg;//显示reg[7:0] numa,numb;reg[7:0] red1,red2,green1,green2,yellow1,yellow2,left1,left2;always @(ng )if(!ng)begin //设置计数初值green1 =8//30Sred1=8//51Syellow1=8//3Sleft1 =8 //15Sgreen2 =8//30Sred2=8//51S yellow2=8//3Sleft2 =8 //15Sendalways @ (posedge clk) beginif (fout==36b111111111111111111111111111111111111)fout=0;else begin fout=fout+1;clk1=fout[23];5HZclk2=fout[13];几千HZendendalways @(posedge clk1 )beginif(reset) //复位与特殊情况控制 这是主干道的复位 begin lighta=4b1000; //lighta是主干道的交通灯,lightb是支干道的交通灯,1000是红灯,0100是直行绿灯,0010是黄灯,0001是左转绿灯 numa=red1; //主干道的数码管从红灯开始记state1=0;//这时候灯变化的控制信号为0 end else if(emergency)//紧急情况 beginlighta=4b1000;//主干道红了 numa=red1;//计时也从红灯记 end else if(ng)//这下开始正常工作了 begin //使能有效开始控制计数 if(!tim1) //你有没有变过颜色啊?没有?那开始变颜色吧。 begin //主干道交通灯点亮控制 tim1=1;//主干道的灯的开关,行了,我变过了。 case(state1)//state1是用来控制主干道亮灯的各个状态的。//1000(8)是红灯,0100(4)是直行绿灯,0010(2)是黄灯,0001(1)是左转绿灯 3b000:begin numa=green1; lighta=4; state1=3b001;end//直行绿 3b001:begin numa=yellow1;lighta=2; state1=3b010;end//黄 3b010:begin numa=left1; lighta=1; state1=3b011;end//左转绿 3b011:begin numa=yellow1;lighta=2; state1=3b100;end//黄 3b100:begin numa=red1; lighta=8; state1=3b000;end//红 default:lighta=8;//接二极管正极,负极接地endcase end else//tm1=1,我变过颜色了,可以开始计数了。 begin //倒数计时 if(numa0) 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==1) tim1=0;好了,差不多计完了,再让我变一次吧。 end end else //如果电路没有启动 begin lighta=4b0100;//默认为直行绿灯 numa=0;//默认计数为0 tim1=0; //默认我没有变过颜色 end endalways
显示全部