orange-208 发表于 2012-9-13 15:39:25

帮忙看下这个状态机代码,数码管显示00的时间有点长,不...

如题   

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 flag;
        reg CS, NS;                       
        reg count_H, count_L;
       
        always @ ( posedge clk_1Hz or negedge nrst )
                if( !nrst )
                        begin
                                CS <= state_0;
                                flag <= 3'b000;
                        end
                else
                        case( CS )
                                state_0:        if( flag == 3'b000 )//状态state_0, 主干道通行35s
                                                                begin       
                                                                        flag <= 3'b001;
                                                                        state_0_init;                                                               
                                                                end
                                                        else if( flag == 3'b001 )
                                                                begin
                                                                        if( !count_H && !count_L )
                                                                                begin
                                                                                        flag <= 3'b010;
                                                                                        CS <= 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== 3'b010 )//状态state_1,主干道黄灯倒计时5s
                                                                begin       
                                                                        flag <= 3'b011;       
                                                                        state_1_init;
                                                                end
                                                        else if( flag == 3'b011 )
                                                                begin
                                                                        if( !count_L )
                                                                                begin
                                                                                        flag <= 3'b100;
                                                                                        CS <= state_2;
                                                                                end
                                                                        else
                                                                                begin
                                                                                        count_L <= count_L-1'b1;
                                                                                end
                                                                end
                                                                       

                                state_2:        if( flag == 3'b100 )//状态state_2,支干道通行25s
                                                                begin
                                                                        flag <= 3'b101;
                                                                        state_2_init;
                                                                end
                                                        else if( flag == 3'b101 )
                                                                begin
                                                                        if( !count_H && !count_L )
                                                                                begin
                                                                                        flag <= 3'b110;
                                                                                        CS <= 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 == 3'b110 )//状态state_3,支干道黄灯倒计时5s
                                                                begin
                                                                        flag <= 3'b111;
                                                                        state_3_init;
                                                                end
                                                        else if( flag == 3'b111 )
                                                                begin
                                                                        if( !count_L )                       
                                                                                begin
                                                                                        flag <= 3'b000;
                                                                                        CS <= state_0;
                                                                                end
                                                                        else
                                                                                begin
                                                                                        count_L <= count_L-1'b1;
                                                                                end
                                                                end                                                                                                       
                        endcase       
       
        /*************************************/
       
        task state_0_init;
                begin
                        count_H <= 4'b0011;        //高位为3
                        count_L <= 4'b0101;        //低位为5       
                        light_zhu <= 3'b001;
                        light_zhi <= 3'b100;       
                end
        endtask

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

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

        task state_3_init;
                begin       
                        count_H <= 4'b0000;        //高位为0
                        count_L <= 4'b0101;        //低位为5               
                        light_zhu <= 3'b100;
                        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 15:40:14

顶起!                     

orange-208 发表于 2012-9-13 15:56:20

刚才仔细看了下实验现象,就是递减至0时,要停1S才向下一个状态执行!

lgg88 发表于 2012-9-13 15:58:09

是每次到00的显示时间都长还是?有多长?

orange-208 发表于 2012-9-13 15:59:28

lgg88 发表于 2012-9-13 15:58 static/image/common/back.gif
是每次到00的显示时间都长还是?有多长?

1S左右   

lgg88 发表于 2012-9-13 16:05:22

那应该是正常的,你要1S才会进入always ,所以要等1S状态才会改变

orange-208 发表于 2012-9-13 16:09:03

lgg88 发表于 2012-9-13 16:05 static/image/common/back.gif
那应该是正常的,你要1S才会进入always ,所以要等1S状态才会改变

如果想把这1S去掉呢?

lgg88 发表于 2012-9-13 16:15:18

你在上一个状态结束,置下一个状态值的时候,就把那个值初始化掉应该就可以了

orange-208 发表于 2012-9-13 16:31:37

lgg88 发表于 2012-9-13 16:15 static/image/common/back.gif
你在上一个状态结束,置下一个状态值的时候,就把那个值初始化掉应该就可以了 ...

先谢了!试试   

orange-208 发表于 2012-9-13 16:51:04

lgg88 发表于 2012-9-13 16:15 static/image/common/back.gif
你在上一个状态结束,置下一个状态值的时候,就把那个值初始化掉应该就可以了 ...

按照你说的,搞定了!再次谢谢!

orange-208 发表于 2012-9-13 17:13:28

lgg88 发表于 2012-9-13 16:15 static/image/common/back.gif
你在上一个状态结束,置下一个状态值的时候,就把那个值初始化掉应该就可以了 ...

又有新问题,那就是我每次按下复位键之后,要等个位为0之后才复位显示,复位延迟这么长时间?

代码如下!

orange-208 发表于 2012-9-13 17:13:53

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_3;
                                flag <= 2'b11;
                        end
                else
                        case( CS )
                                state_0:        if( flag == 2'b00 )        //状态state_0, 主干道通行35s
                                                                begin
                                                                        if( !count_H && !count_L )
                                                                                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 )
                                                                                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
                                                                CS <= state_3;
                                                        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 17:15:46

也就是说每次要等到 count_L 为0时才进行复位!

lgg88 发表于 2012-9-13 19:17:07

你程序这样写的啊,你把!nrst后,你为什么进入状态3 呢   直接执行复位就可以了啊
页: [1]
查看完整版本: 帮忙看下这个状态机代码,数码管显示00的时间有点长,不...