查看: 1204|回复: 0
打印 上一主题 下一主题

分享一个简单的Verilog状态机交通灯控制器,高手绕路、、、

[复制链接]
跳转到指定楼层
沙发
发表于 2016-4-23 22:51:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
module traffic_state
(
        clk_1Hz,
        nrst,        
        one_data,
        ten_data,
        led_zhu,
        led_zhi
);

        input clk_1Hz, nrst;
        
        output [2:0]led_zhu;                //led_zhu[0] 红,led_zhu[1] 黄,led_zhu[2] 绿
        output [2:0]led_zhi;                //led_zhi[0] 红,led_zhi[1] 黄,led_zhi[2] 绿
        output [3:0]one_data;        //倒计时个位
        output [3:0]ten_data;        //倒计时十位
                        
        /***************四种工作状态***************/
        
        parameter        state_0 = 2'b00,
                                        state_1 = 2'b01,
                                        state_2 = 2'b10,
                                        state_3 = 2'b11;

        /******************************交通状态转换*****************************/
        
        reg [2:0]light_zhu;                 //light_zhu[0] 红,light_zhu[1] 黄,light_zhu[2] 绿
        reg [2:0]light_zhi;                 //light_zhi[0] 红,light_zhi[1] 黄,light_zhi[2] 绿

        reg [1:0]CS;                        
        reg [1:0]flag;
        reg [3:0]count_H, count_L;
        
        always @ ( posedge clk_1Hz or negedge nrst )
                if( !nrst )
                        begin
                                CS <= state_0;
                                flag <= 2'b00;
                                state_0_init;
                        end
                else
                        case( CS )
                                state_0:        if( flag == 2'b00 )        //状态state_0, 主干道通行35s
                                                                begin
                                                                        if( !count_H && ( count_L == 4'b0110 ) ) //最后5s黄灯亮
                                                                                begin
                                                                                        flag <= 2'b01;
                                                                                        CS <= state_1;
                                                                                        state_1_init;        //初始化state_1        
                                                                                end
                                                                        else if( !count_L )
                                                                                begin
                                                                                        count_L <= 4'b1001;
                                                                                        count_H <= count_H-1'b1;
                                                                                end
                                                                        else
                                                                                begin
                                                                                        count_L <= count_L-1'b1;
                                                                                end
                                                                end
                                       
                                state_1: if( flag == 2'b01 )        //状态state_1,主干道黄灯倒计时5s
                                                                begin
                                                                        if( !count_L )
                                                                                begin
                                                                                        flag <= 2'b10;
                                                                                        CS <= state_2;
                                                                                        state_2_init;        //初始化state_2                                                                                       
                                                                                end
                                                                        else
                                                                                begin
                                                                                        count_L <= count_L-1'b1;
                                                                                end
                                                                end
                                                                        

                                state_2: if( flag == 2'b10 ) //状态state_2,支干道通行25s
                                                                begin
                                                                        if( !count_H && ( count_L == 4'b0110 ) )        //最后5s黄灯亮
                                                                                begin
                                                                                        flag <= 2'b11;
                                                                                        CS <= state_3;
                                                                                        state_3_init;        //初始化state_3                                                                                       
                                                                                end
                                                                        else if( !count_L )
                                                                                begin
                                                                                        count_L <= 4'b1001;
                                                                                        count_H <= count_H-1'b1;
                                                                                end
                                                                        else
                                                                                begin
                                                                                        count_L <= count_L-1'b1;
                                                                                end
                                                                end

                                state_3:        if( flag == 2'b11 )  //状态state_3,支干道黄灯倒计时5s
                                                                begin
                                                                        if( !count_L )                        
                                                                                begin
                                                                                        flag <= 2'b00;
                                                                                        CS <= state_0;                                                                                       
                                                                                        state_0_init;        //初始化state_0                                                                                       
                                                                                end
                                                                        else
                                                                                begin
                                                                                        count_L <= count_L-1'b1;
                                                                                end
                                                                end
                                                               
                                default: begin
                                                                flag <=2'b00;
                                                                CS <= state_0;
                                                        end
                                                        
                        endcase        
        
        /*************************************/
        
        task state_0_init;
                begin
                        count_H <= 4'b0011;        //高位为3
                        count_L <= 4'b0101;        //低位为5        
                        light_zhu <= 3'b100;        //light_zhu[0]:0 , light_zhu[1]:0 , light_zhu[2]:1
                        light_zhi <= 3'b001;        //light_zhi[0]:0 , light_zhi[1]:0 , light_zhi[2]:1
                end
        endtask

        /*************************************/
        
        task state_1_init;
                begin
                        count_H <= 4'b0000;        //高位为0
                        count_L <= 4'b0101;        //低位为5
                        light_zhu <= 3'b010;
                        light_zhi <= 3'b001;        
                end
        endtask        

        /*************************************/
        
        task state_2_init;
                begin
                        count_H <= 4'b0010;        //高位为2
                        count_L <= 4'b0101;        //低位为5
                        light_zhu <= 3'b001;
                        light_zhi <= 3'b100;
                end
        endtask
        
        /*************************************/

        task state_3_init;
                begin        
                        count_H <= 4'b0000;        //高位为0
                        count_L <= 4'b0101;        //低位为5               
                        light_zhu <= 3'b001;
                        light_zhi <= 3'b010;
                end
        endtask        
        
        /**************************/
        
        assign one_data = count_L;
        assign ten_data = count_H;
        
        assign led_zhu = light_zhu;
        assign led_zhi = light_zhi;

        /**************************/        
        
endmodule







回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入中科因仑

本版积分规则

快速回复 返回顶部 返回列表