​​基于 FPGA 的高级数字电路设计(6)有限状态机分割设计

本文介绍了一种有限状态机(FSM)的分割设计方法,通过将单一FSM拆分成多个协同工作的子状态机,以适应游戏中的玩家交互状态切换。通过实例说明了状态1和状态2如何根据玩家A和B的操作进行动态切换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//有限状态机分割设计,其实质就是一个状态机分割成多个状态机,或者说多个
//状态机的协同设计来实现一个较为复杂的状态跳转设计,例如说玩游戏的一个
//状态跳转,玩家 A 操作的时候是一种状态,玩家 B 操作的时候又是另外的一
//种状态。
`timescale 1ns / 1ps

//
// Company:
// Engineer:
//
// Create Date: 2018/11/02 10:14:11
// Design Name:
// Module Name: FSM_div
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//

module FSM_div(
clk, X, rst, Z,state1,state2
);
    input clk, X, rst;
    output Z;
    parameter S0 = 2'b00, S1= 2'b01,
    S2 = 2'b10,SA = 2'b11, S3 = 2'b00, S4 = 2'b01,
    S5 = 2'b10,SB = 2'b11;
    output reg [1:0] state1,state2;
    reg [1:0] next_state1,next_state2;

    always @( posedge clk )begin
        if(rst) begin
            state1 <= S0;state2<=SB;end
        else begin
            state1 <= next_state1;
            state2 <= next_state2;end
            end

        always @(state1 or X) begin
        case(state1)
        S0:begin if(X) next_state1<=S1;
                  else next_state1<=S0;end
        S1:begin if(X) next_state1<=S1;
                  else next_state1<=S2;end
        S2:begin if(X) next_state1<=S1;
                  else next_state1<=SA;end
        SA:begin if(X)
                    begin
                        if(state2==S4 || state2==S5)
                        next_state1<=S1;
                        else next_state1<=SA;
                    end
                 else if(state2==S3)
                 next_state1<=S0;
                 else next_state1<=SA;
                 end
         endcase
         end
     always @(state1 or state2 or X) begin 
            case(state2)
            S3:begin if(X) next_state2<=S4;
                      else next_state2<=SB;end
            S4:begin if(X) next_state2<=SB;
                      else next_state2<=S5;end
            S5:begin if(X) next_state2<=SB;
                      else next_state2<=S3;end
            SB:begin if(!X)
                        begin
                            if(state1==S2)
                            next_state2<=S3;
                            else next_state2<=SB;end
                            else next_state2<=SB;
                        end
             endcase
             end
        assign Z = (state2 == S5)?1:0;
endmodule
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

新芯设计

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值