搜索
bottom↓
回复: 13

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

[复制链接]

出0入0汤圆

发表于 2012-9-13 15:39:25 | 显示全部楼层 |阅读模式
如题   

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 [2:0]flag;
        reg [1:0]CS, NS;                       
        reg [3:0]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

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2012-9-13 15:40:14 | 显示全部楼层
顶起!                       

出0入0汤圆

 楼主| 发表于 2012-9-13 15:56:20 | 显示全部楼层
刚才仔细看了下实验现象,就是递减至0时,要停1S才向下一个状态执行!

出0入0汤圆

发表于 2012-9-13 15:58:09 | 显示全部楼层
是每次到00的显示时间都长还是?  有多长?

出0入0汤圆

 楼主| 发表于 2012-9-13 15:59:28 | 显示全部楼层
lgg88 发表于 2012-9-13 15:58
是每次到00的显示时间都长还是?  有多长?

1S左右   

出0入0汤圆

发表于 2012-9-13 16:05:22 | 显示全部楼层
那应该是正常的,你要1S才会进入always ,所以要等1S状态才会改变

出0入0汤圆

 楼主| 发表于 2012-9-13 16:09:03 | 显示全部楼层
lgg88 发表于 2012-9-13 16:05
那应该是正常的,你要1S才会进入always ,所以要等1S状态才会改变

如果想把这1S去掉呢?  

出0入0汤圆

发表于 2012-9-13 16:15:18 | 显示全部楼层
你在上一个状态结束,置下一个状态值的时候,就把那个值初始化掉应该就可以了

出0入0汤圆

 楼主| 发表于 2012-9-13 16:31:37 | 显示全部楼层
lgg88 发表于 2012-9-13 16:15
你在上一个状态结束,置下一个状态值的时候,就把那个值初始化掉应该就可以了 ...

先谢了!试试   

出0入0汤圆

 楼主| 发表于 2012-9-13 16:51:04 | 显示全部楼层
lgg88 发表于 2012-9-13 16:15
你在上一个状态结束,置下一个状态值的时候,就把那个值初始化掉应该就可以了 ...

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

出0入0汤圆

 楼主| 发表于 2012-9-13 17:13:28 | 显示全部楼层
lgg88 发表于 2012-9-13 16:15
你在上一个状态结束,置下一个状态值的时候,就把那个值初始化掉应该就可以了 ...


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

代码如下!

出0入0汤圆

 楼主| 发表于 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 [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_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]: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

出0入0汤圆

 楼主| 发表于 2012-9-13 17:15:46 | 显示全部楼层
也就是说每次要等到 count_L 为0时才进行复位!

出0入0汤圆

发表于 2012-9-13 19:17:07 | 显示全部楼层
你程序这样写的啊,你把!nrst  后,你为什么进入状态3 呢   直接执行复位就可以了啊
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 09:22

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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