FPGA状态机显示流水灯

`timescale 1ns / 1ps
module chun1(
input syck,
input  rest_n,
output  reg  [3:0] led,
input key,
input key1
    );
    //独热码
    parameter idle = 3'b001,
                 s1 = 3'b010,
                 s2 = 3'b100;         
    reg [26:0] cnt;       
    reg [1:0] mm;//表示月份 
   //内部声明
    reg [3:0] cur_state,next_state;
    reg [27:0] cnt1;
    reg [26:0] cnt2;
    parameter delay1=125_000_000;   //1s
    parameter delay=125_000_0;  //20ms
    parameter delay20=125_000_0;  //20ms

     //1s计时器
     always@(posedge syck or negedge rest_n)begin
        if(!rest_n)
            cnt1<=0;
        else if(cnt1==delay1-1)
            cnt1<=0; 
        else
            cnt1<=cnt1+1;
      end  
      
    //key消抖
    always@(posedge syck or negedge rest_n)begin
        if(!rest_n)
            cnt<=0;
        else if(key==1)begin
            if(cnt==delay-1)
                cnt<=cnt;
            else
                cnt<=cnt+1;
            end
        else
            cnt<=0;
    end

//key1消抖
    always@(posedge syck or negedge rest_n)begin
        if(!rest_n)
            cnt2<=0;
        else if(key1==1)begin
            if(cnt2==delay20-1)
                cnt2<=cnt2;
            else
                cnt2<=cnt2+1;
            end
        else
            cnt2<=0;
    end  

    assign flag1 =(cnt==delay-2)?1:0;
    assign flag2 =(cnt2==delay20-2)?1:0;   
    //二段式状态机   描述总状态跳转,现态,次态
    always@(posedge syck or negedge rest_n)begin
      if(!rest_n)
           cur_state<=idle;
      else
          cur_state<=next_state;
    end
    
    //led计数器
     always@(posedge syck or negedge rest_n)begin
     if(!rest_n)
         mm<=0;
     else if(cnt1==delay1-1)
         mm<=mm+1;
     else 
         mm<=mm;      
     end
    //三段式 描述跳转,条件
    always@(*)begin
         if(!rest_n)
            next_state=idle;
         else
            case(cur_state)
               idle :  begin 
                        if (flag1==1 )
                        next_state = s1;
                        else if (flag2==1)
                            next_state = s2;
                          else
                         next_state = cur_state; //net_state = idle
                end
               s1: begin
                   if (flag1==1)
                      next_state = s2;
                   else
                      next_state = s1;
               end
               s2: begin
                   if (flag2==1)
                      next_state = s1;
                   else
                      next_state = s2;
               end

               default:  next_state = idle;
    endcase
    end
    
    //三段式状态机动作
     always@(posedge syck or negedge rest_n)begin
            if(!rest_n)
               led<=4'b0000;
            else  begin
              case(cur_state)
                 idle: led<=4'b1111;
                 s1:   case(mm)
                        0: led<=4'b1000;
                        1: led<=4'b0100;
                        2: led<=4'b0010;
                        3: led<=4'b0001;
                       default:  led<=4'b0000;
                       endcase
                 s2:  case(mm)
                        0: led<=4'b0001;
                        1: led<=4'b0010;
                        2: led<=4'b0100;
                        3: led<=4'b1000;
                        default:  led<=4'b0000;
                        endcase

                 default:  led<=4'b0000;
                 endcase
            end           
     end
     
endmodule

连接配置:

  • 24
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值