状态机点亮流水灯

一.有限状态机介绍

  • 有限状态机(Finite State Machine, FSM),又称有限状态自动机,简称状态机,是指在有限个状态之间按照一定规律转换的时序电路。
  • 有限状态机主要包括:米勒状态机和摩尔状态机。其中摩尔状态机输出只依赖于当前状态而与输入无关。米勒状态机不仅依赖于当前状态,还取决于该状态的输入条件。
    在这里插入图片描述

二.流水灯状态变化图

在这里插入图片描述

三.实现代码

/**************************************功能介绍***********************************
Date	: 2023年7月27日19:50:03
Author	: Alegg xy.
Version	: 1.0
Description: 状态机点亮流水灯
*********************************************************************************/
    
//---------<模块及端口声名>------------------------------------------------------
module fsm_led( 
    input				clk		,
    input				rst_n	,

    output	reg [3:0]	led	
);								 
//---------<参数定义>--------------------------------------------------------- 
    parameter MAX_500ms = 25'd25_000_000;//0.5s

    //状态空间
    parameter LED0 = 4'b0001;
    parameter LED1 = 4'b0010;
    parameter LED2 = 4'b0100;
    parameter LED3 = 4'b1000;

//---------<内部信号定义>-----------------------------------------------------
    
    reg			[24:0]	cnt	   	;
    wire				add_cnt	;
    wire				end_cnt	;

    reg [3:0] cstate;               //现态
    reg [3:0] nstate;               //次态
    
    //0.5s计数器
    always @(posedge clk or negedge rst_n)begin 
       if(!rst_n)begin
            cnt <= 24'd0;
        end 
        else if(add_cnt)begin 
            if(end_cnt)begin 
                cnt <= 24'd0;
            end
            else begin 
                cnt <= cnt + 1'b1;
            end 
        end
    end 
    
    assign add_cnt = 1'b1;
    assign end_cnt = add_cnt && cnt == MAX_500ms - 1'd1;
    
    //****************************************************************
    //--三段式状态机
    //****************************************************************
    
    //第一段,现态跟随次态。时序逻辑,非阻塞赋值
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            cstate <= LED0;
        end
        else begin
            cstate <= nstate;
        end
    end

    //第二段,组合逻辑,阻塞赋值
    always @(*)begin 
        case (cstate)
            LED0:begin
                if (end_cnt) begin
                    nstate = LED1;
                end
                else begin
                    nstate = cstate;
                end
            end
            LED1:begin
                if (end_cnt) begin
                    nstate = LED2;
                end
                else begin
                    nstate = cstate;
                end
            end
            LED2:begin
                if (end_cnt) begin
                    nstate = LED3;
                end
                else begin
                    nstate = cstate;
                end
            end
            LED3:begin
                if (end_cnt) begin
                    nstate = LED0;
                end
                else begin
                    nstate = cstate;
                end
            end
            default:nstate = LED0; 
        endcase
    end

    //第三段,赋值,时序逻辑,非阻塞赋值
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            led <= 4'b0000;
        end
        else begin
            case (cstate)
                LED0:led <= 4'b0001;
                LED1:led <= 4'b0010;
                LED2:led <= 4'b0100;
                LED3:led <= 4'b1000;
                default:led <= 4'b0000; 
            endcase
        end
    end
endmodule

四.引脚配置

在这里插入图片描述

信号引脚
clkE1
rst_nE15
led0G15
led1F16
led2F15
led3D16
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值