汽车尾灯控制电路代码

汽车尾灯发出的信号主要是给后面行驶汽车的司机看的,通常汽车驾驶室有刹车开关(HAZ)、左转弯开关(LEFT)和右转弯开关(RIGHT),司机通过操作这3个开关给出车辆的行驶状态。假设在汽车尾部左、右两侧各有3个指示灯,分别用LA、LB、LC、RA、RB、RC表示。这些灯的亮、灭规律如下:

1)汽车正常行驶时,尾部两侧的6个灯全部熄灭。

2)刹车时,汽车尾灯工作在告警状态,所有6个灯按一定频率闪烁。

3)左转弯时,左侧3个灯轮流顺序点亮,其规律如图(a)所示,右侧灯全灭。

4)右转弯时,右侧3个灯轮流顺序点亮,其规律如图(b)所示,左侧灯全灭。

假设电路的输入时钟信号为CP,CP的频率对应于汽车尾灯所要求的闪烁频率。试根据上述要求设计出一个时钟同步的状态机来控制汽车的尾灯,并进行仿真测试。

在这里插入图片描述

采用三段式状态机
汽车尾灯控制电路代码

module carlight_541_V3(CP,nCR,HAZ,LEFT,RIGHT,LA,LB,LC,RA,RB,RC);
input nCR,CP;
input HAZ,LEFT,RIGHT;
output reg LA,LB,LC,RA,RB,RC;
 
reg [2:0]Current_state,Next_state;
parameter [2:0]IDLE=3'b000,L1=3'b001,L2=3'b010,L3=3'b011,R1=3'b100,R2=3'b101,R3=3'b110,LR3=3'b111;
//时序逻辑
always @(posedge CP or negedge nCR) 
begin
    if (~nCR) 
        Current_state<=IDLE;
    else
        Current_state<=Next_state;
end
//组合逻辑
always @(Current_state or HAZ or LEFT or RIGHT)
begin
    Next_state=3'bxxx;
    case(Current_state)
    IDLE:begin        
    if(LEFT&&(!HAZ)&&(!RIGHT))    Next_state=L1;
    else if (HAZ+LEFT&&RIGHT)   Next_state=LR3;
    else if (RIGHT&&(!HAZ)&&(!LEFT))  Next_state=R1;
    else Next_state=IDLE;  //
    end
 
    L1:begin        
    if(!HAZ)       Next_state=L2;
    else  Next_state=LR3;
    end
     
    L2:begin    
    if(!HAZ)       Next_state=L3;
    else  Next_state=LR3;
    end
 
    L3:begin 
         Next_state=IDLE;        
    end
 
    R1:begin  
    if(!HAZ)       Next_state=R2;
    else  Next_state=LR3;
    end
 
    R2:begin  
    if(!HAZ)       Next_state=R3;
    else  Next_state=LR3;
    end
 
    R3:begin 
         Next_state=IDLE;        
    end
 
    LR3:begin  
     Next_state=IDLE;
    end
    endcase
end
 
//输出逻辑
always @(posedge CP or negedge nCR) 
begin
    if(~nCR) 
    begin
        LC=1'b0;LB=1'b0;LA=1'b0;RC=1'b0;RB=1'b0;RA=1'b0;
    end
    else begin
        LC=1'b0;LB=1'b0;LA=1'b0;RC=1'b0;RB=1'b0;RA=1'b0;
case(Current_state)
    IDLE:begin        LC=1'b0;LB=1'b0;LA=1'b0;RC=1'b0;RB=1'b0;RA=1'b0;    end
    L1:begin        LC=1'b0;LB=1'b0;LA=1'b1;RC=1'b0;RB=1'b0;RA=1'b0;    end
    L2:begin        LC=1'b0;LB=1'b1;LA=1'b1;RC=1'b0;RB=1'b0;RA=1'b0;    end
    L3:begin          LC=1'b1;LB=1'b1;LA=1'b1;RC=1'b0;RB=1'b0;RA=1'b0;    end
    R1:begin          LC=1'b0;LB=1'b0;LA=1'b0;RC=1'b0;RB=1'b0;RA=1'b1;    end
    R2:begin          LC=1'b0;LB=1'b0;LA=1'b0;RC=1'b0;RB=1'b1;RA=1'b1;    end
    R3:begin           LC=1'b0;LB=1'b0;LA=1'b0;RC=1'b1;RB=1'b1;RA=1'b1;    end
    LR3:begin          LC=1'b1;LB=1'b1;LA=1'b1;RC=1'b1;RB=1'b1;RA=1'b1;    end
    endcase
        end
end 
 
endmodule
  1. 测试文件
`timescale 1ns/1ns
module carlight_541_V3_test;
reg CP,nCR,HAZ,LEFT,RIGHT;
wire LA,LB,LC,RA,RB,RC;
carlight_541_V3  u0(CP,nCR,HAZ,LEFT,RIGHT,LA,LB,LC,RA,RB,RC);
 
initial
begin
nCR=1'b0;
nCR= #20 1'b1;
HAZ=1'b0;LEFT=1'b0;RIGHT=1'b0;
    #200 HAZ=1'b0;LEFT=1'b0;RIGHT=1'b0;
    #200 HAZ=1'b0;LEFT=1'b0;RIGHT=1'b1;  //RIGHT
    #200 HAZ=1'b0;LEFT=1'b1;RIGHT=1'b0;  //LEFT
    #200 HAZ=1'b0;LEFT=1'b1;RIGHT=1'b1;  
    #200 HAZ=1'b1;LEFT=1'b0;RIGHT=1'b0;  //HAZ
    #200 HAZ=1'b1;LEFT=1'b0;RIGHT=1'b1;
    #200 HAZ=1'b1;LEFT=1'b1;RIGHT=1'b0;
    #200 HAZ=1'b1;LEFT=1'b1;RIGHT=1'b1;
#200 $stop;    
end
 
always 
 begin
CP=1'b0;
CP= #10 1'b1;
#10;
    end
endmodule

3.仿真结果
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Summertrainxy/article/details/105272118