搜索
bottom↓
回复: 12

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

[复制链接]

出0入0汤圆

发表于 2012-9-13 21:52:28 | 显示全部楼层 |阅读模式
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

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

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

出0入0汤圆

 楼主| 发表于 2012-9-13 21:53:31 | 显示全部楼层
整个工程如下@

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2012-9-13 21:54:05 | 显示全部楼层
顶起        

出0入0汤圆

发表于 2012-9-14 08:34:34 | 显示全部楼层
顶楼主   

出0入0汤圆

发表于 2012-9-14 08:47:36 | 显示全部楼层
顶起来。

出0入0汤圆

发表于 2012-9-14 09:46:44 | 显示全部楼层
不错,顶楼主

出0入0汤圆

发表于 2012-9-16 15:58:20 | 显示全部楼层
帮你顶吧

出0入0汤圆

发表于 2012-9-17 09:59:13 | 显示全部楼层
新手学起

出0入0汤圆

发表于 2012-9-28 14:11:46 | 显示全部楼层
顶一下。。。。。。。。。。。。。。。。。

出0入0汤圆

发表于 2012-12-8 15:37:55 | 显示全部楼层
quartus ii seetings file contains one or more errors  楼主共享的工程打不开这是怎么回事??

出0入0汤圆

发表于 2012-12-8 15:56:30 | 显示全部楼层
顶楼主! 求人来教教我 感激不尽

出0入0汤圆

发表于 2012-12-8 16:08:28 | 显示全部楼层
跪求楼主共享顶层原理图!

出0入0汤圆

发表于 2012-12-8 16:10:46 | 显示全部楼层
跪求楼主指导 quartus ii seetings file contains one or more errors 这问题,感激不尽
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-7-24 07:19

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

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