您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 交通运输 > 数电课程设计——交通灯
数电课程设计课程名称:交通灯控制器姓名:车宣豪学号:1240308209专业:测控技术与仪器交通灯控制器设计一、设计任务和要求1.设计一个交通灯控制器,由两条主干道汇合成十字路口,在每个入口处设置两相位信号灯;分别为直行—红、黄、绿等;左转—红、黄、绿灯,六盏信号灯。2.每个路口信号灯亮灭次序和时间为直行—绿灯30秒,黄灯5秒,红灯85秒;左转—绿灯20秒,黄灯5秒,红灯95秒。3.各路口有两个倒计时显示器,分别显示直行和左拐倒计时状态。4.黄灯亮时,为闪烁点亮方式。二、方案论证1.各变量含义clk为单位脉冲信号,reset为清零信号,HSR、HSG、Y1分别为东西直行红黄绿灯,HLR、HLG、Y2分别为东西左拐红黄绿灯,SSR、SSG、Y3分别为南北直行红黄绿灯,SLR、SLG、Y4分别为南北左拐红黄绿灯;HS0,HL0,SS0,SL0分别为东西直行、东西左拐、南北直行、南北左拐倒计时。2.信号灯状态表及每个状态倒计时状态s0s1s2s3s4s5s6s7东西直行绿30-1黄5-1红85-66红65-61红60-31红30-26红25-6红5-1东西左拐红35-6红5-1绿20-1黄5-1红60-31红30-26红25-6红5-1南北直行红60-31红30-26红25-6红5-1绿30-1黄5-1红25-6红5-1南北左拐红95-66红65-61红60-41红40-36红35-6红5-1绿20-1黄5-13.显示器倒计时的实现通过设计一个逐渐递增的数x(从1不断加1,一直加到120),然后用一个数减去x就得到一个递减的数来作为计时器上显示的数。例如:第一个状态为东西直行绿灯亮30秒,那么就用31—x(此时x从1一直加1到30)来表示绿灯的剩余倒计时时间;而到第二个状态则为东西左拐黄灯亮5秒,那么就用36—x(由于x是不断加1的数,那么此时x变为从31不断加1到35)来实现黄灯亮5秒的倒计时显示。其他状态及其他方向倒计时与这两个例子一样,都是通过一个数减去x来实现的倒计时。具体每个状态倒计时如下:case(z)8'd1:beginHS=31-x;HL=36-x;SS=61-x;SL=96-x;end8'd2:beginHS=36-x;HL=36-x;SS=61-x;SL=96-x;end8'd3:beginHS=121-x;HL=56-x;SS=61-x;SL=96-x;end8'd4:beginHS=121-x;HL=61-x;SS=61-x;SL=96-x;end8'd5:beginHS=121-x;HL=121-x;SS=91-x;SL=96-x;end8'd6:beginHS=121-x;HL=121-x;SS=96-x;SL=96-x;end8'd7:beginHS=121-x;HL=121-x;SS=121-x;SL=116-x;end8'd8:beginHS=121-x;HL=121-x;SS=121-x;SL=121-x;endz的取值分别表示8个状态,HS表示东西直行倒计时显示,HL表示东西左拐倒计时显示,SS表示南北直行倒计时显示,SL表示南北左拐倒计时显示。4.黄灯闪烁的实现通过把黄灯的输出信号与上clk信号来实现黄灯的闪烁,例如Y1=clk&HSY,HSY为东西直行黄灯信号,当它与上clk时则可实现黄灯的闪烁信号Y1。5.状态转换。S0S1S2S3S7S6S5S4状态机分为8个状态,分别为S0、S1、S2、S3、S4、S5、S6、S7,每个状态灯亮灭如下:s0:{HSR,HSG,HSY}=3'b010;{HLR,HLG,HLY}=3'b100;{SSR,SSG,SSY}=3'b100;{SLR,SLG,SLY}=3'b100;s1:{HSR,HSG,HSY}=3'b001;{HLR,HLG,HLY}=3'b100;{SSR,SSG,SSY}=3'b100;{SLR,SLG,SLY}=3'b100;s2:{HSR,HSG,HSY}=3'b100;{HLR,HLG,HLY}=3'b010;{SSR,SSG,SSY}=3'b100;{SLR,SLG,SLY}=3'b100;s3:{HSR,HSG,HSY}=3'b100;{HLR,HLG,HLY}=3'b001;{SSR,SSG,SSY}=3'b100;{SLR,SLG,SLY}=3'b100;s4:{HSR,HSG,HSY}=3'b100;{HLR,HLG,HLY}=3'b100;{SSR,SSG,SSY}=3'b010;{SLR,SLG,SLY}=3'b100;s5:{HSR,HSG,HSY}=3'b100;{HLR,HLG,HLY}=3'b100;{SSR,SSG,SSY}=3'b001;{SLR,SLG,SLY}=3'b100;s6:{HSR,HSG,HSY}=3'b100;{HLR,HLG,HLY}=3'b100;{SSR,SSG,SSY}=3'b100;{SLR,SLG,SLY}=3'b010;s7:{HSR,HSG,HSY}=3'b100;{HLR,HLG,HLY}=3'b100;{SSR,SSG,SSY}=3'b100;{SLR,SLG,SLY}=3'b001;HSR,HSG,HSY分别表示东西直行红、黄、绿、灯;HLR,HLG,HLY分别表示东西左拐红、黄、绿、灯;SSR,SSG,SSY分别表示南北直行红、黄、绿、灯;SLR,SLG,SLY分别表示南北左拐红、黄、绿、灯。0表示灯灭,1表示灯亮。6、进制转换的实现把计时器输出的数转化成可在2个7段显示器上显示的两位数,利用/和%可把倒计时输出转化为十位和个位。例如:assignHS0[7:4]=HS/4'b1010;assignHS0[3:0]=HS%4'b1010;把东西直行倒计时信号HS转化为HS0的十位和个位,这样即可在显示器上显示倒计时的两位数。7.倒计时随8个状态变化而变化的实现当x为1,31,36,56,61,91,96,116时y为1,其他情况y都为0,这样当y为1时都会产生一个上升沿,设z的初始值为0,当每遇到一个y的上升沿时z就会加1,z为8时当遇到下一个y的上升沿时z为1,依次循环,这样就会产生1、2、3、4、5、6、7、8这8个数,这8个数刚好可以根据8个状态的转换而同时转换,这样就能实现在不同的z时倒计时时间的转换。三、源程序代码及文字说明moduleJTD(clk,reset,HSR,HSG,HLR,HLG,SSR,SSG,SLR,SLG,Y1,Y2,Y3,Y4,HS0,HL0,SS0,SL0);//模块声明inputclk,reset;//定义输入信号outputHSR,HSG,HLR,HLG,SSR,SSG,SLR,SLG,Y1,Y2,Y3,Y4;//定义输出信号output[7:0]HS0,HL0,SS0,SL0;//定义为8位宽的输出信号regHSR,HSG,HSY,HLR,HLG,HLY,SSR,SSG,SSY,SLR,SLG,SLY;//定义为reg类型reg[2:0]CS,NS;//定义为3位宽的reg型reg[7:0]HS,HL,SS,SL;//定义为8位宽的reg型reg[7:0]x;//定义为8位宽的reg型regy;//定义为reg型reg[3:0]z;//定义为4位宽的reg型assignY1=clk&HSY;//赋值语句,令clk与上HSY等于Y1,实现黄灯的闪烁assignY2=clk&HLY;//赋值语句,令clk与上HLY等于Y2,实现黄灯的闪烁assignY3=clk&SSY;//赋值语句,令clk与上SSY等于Y3,实现黄灯的闪烁assignY4=clk&SLY;//赋值语句,令clk与上SLY等于Y4,实现黄灯的闪烁parameters0=3'b000,s1=3'b001,s2=3'b011,s3=3'b010,s4=3'b110,s5=3'b111,s6=3'b101,s7=3'b100;//定义符号状态值always@(posedgeclkornegedgereset)//边沿敏感beginif(!reset)x=8'd0;//若reset为0,则x为0elseif(x==8'd120)//若reset为1,且x为120x=8'd1;//那么x为1elsex=x+8'b00000001;//否则x加1赋给xendalways@(x)//敏感变量为xbegincase(x)//case语句,x为敏感变量8'd1:y=1;//若x=1,则y=18'd31:y=1;//若x=1,则y=18'd36:y=1;//若x=1,则y=18'd56:y=1;//若x=1,则y=18'd61:y=1;//若x=1,则y=18'd91:y=1;//若x=1,则y=18'd96:y=1;//若x=1,则y=18'd116:y=1;//若x=1,则y=1default:y=0;//除此之外,y=0endcaseendalways@(posedgeyornegedgereset)//边沿敏感beginif(!reset)//如果reset=0z=4'b0000;//那么z=0elseif(z==4'b1000)//若reset=1,且z==4'b1000z=4'b0001;//那么z为1elsez=z+4'b0001;//否则z加1endalways@(posedgeclkornegedgereset)//边沿敏感beginif(!reset)//若reset为0CS=s0;//那么现态为s0elseCS=NS;//否则现态到次态翻转endalways@(CSorreset)//敏感变量为CS和resetbegincase(CS)s0:begin//当前为s0状态NS=(30-x==0)?s1:s0;//若30-x为0,则转换到s1,否则仍为s0ends1:begin//当前为s1状态NS=(35-x==0)?s2:s1;//若35-x为0,则转换到s2,否则仍为s1ends2:begin//当前为s2状态NS=(55-x==0)?s3:s2;//若55-x为0,则转换到s3,否则仍为s2ends3:begin//当前为s3状态NS=(60-x==0)?s4:s3;//若60-x为0,则转换到s4,否则仍为s3ends4:begin//当前为s4状态NS=(90-x==0)?s5:s4;//若90-x为0,则转换到s5,否则仍为s4ends5:begin//当前为s5状态NS=(95-x==0)?s6:s5;//若95-x为0,则转换到s6,否则仍为s5ends6:begin//当前为s6状态NS=(115-x==0)?s7:s6;//若115-x为0,则转换到s7,否则仍为s6ends7:begin//当前为s7状态NS=(120-x==0)?s0:s7;//若120-x为0,则转换到s0,否则仍为s7endendcaseendalways@(posedgeclkornegedgereset)//边沿敏感begincase(z)//case语句8'd1:beginHS=31-x;HL=36-x;SS=61-x;SL=96-x;end//当z=1时,各倒计时的表达式8'd2:beginHS=36-x;HL=36-x;SS=61-x;SL=96-x;end//当z=2时,各倒计时的表达式8'd3:beginHS=121-x;HL=56-x;SS=61-x;SL=96-x;end//当z=3时,各倒计时的表达式8'd4:beginHS=121-x;HL=61-x;SS=61-x;SL=96-x;end//当z=4时,各倒计时的表达式8'd5:beginHS=121-x;HL=121-x;SS=91-x;SL=96-x;end//当z=5时,各倒计时的表达式8'd6:beginHS=121-x;HL=1
本文标题:数电课程设计——交通灯
链接地址:https://www.777doc.com/doc-7318035 .html