orange-208 发表于 2012-9-13 21:52:28

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

module traffic_state
(
        clk_1Hz,
        nrst,       
        one_data,
        ten_data,
        led_zhu,
        led_zhi
);

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

        /******************************交通状态转换*****************************/
       
        reg light_zhu;                 //light_zhu 红,light_zhu 黄,light_zhu 绿
        reg light_zhi;                 //light_zhi 红,light_zhi 黄,light_zhi 绿

        reg CS;                       
        reg flag;
        reg 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 , light_zhu:0 , light_zhu:1
                        light_zhi <= 3'b001;        //light_zhi:0 , light_zhi:0 , light_zhi: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

orange-208 发表于 2012-9-13 21:53:31

整个工程如下@

orange-208 发表于 2012-9-13 21:54:05

顶起      

lgg88 发表于 2012-9-14 08:34:34

顶楼主   

xiazai4607 发表于 2012-9-14 08:47:36

顶起来。

ccc 发表于 2012-9-14 09:46:44

不错,顶楼主

残无 发表于 2012-9-16 15:58:20

帮你顶吧

simpleh 发表于 2012-9-17 09:59:13

新手学起

Jianglg3 发表于 2012-9-28 14:11:46

顶一下。。。。。。。。。。。。。。。。。

lrw1992lrw 发表于 2012-12-8 15:37:55

quartus ii seetings file contains one or more errors楼主共享的工程打不开这是怎么回事??

lrw1992lrw 发表于 2012-12-8 15:56:30

顶楼主! 求人来教教我 感激不尽

lrw1992lrw 发表于 2012-12-8 16:08:28

跪求楼主共享顶层原理图!

fwd112 发表于 2012-12-8 16:10:46

跪求楼主指导 quartus ii seetings file contains one or more errors 这问题,感激不尽
页: [1]
查看完整版本: 分享一个简单的Verilog状态机交通灯控制器,高手绕路、、、