HDLBITS笔记32:有限状态机二(Fsm3comb、Fsm3onehot、Fsm3、Fsm3s)

上篇传送门:

HDLBITS笔记31:有限状态机一(FSM1、FSM1S、FSM2、FSM2S)_炒鸡无敌大美女的博客-CSDN博客

目录

题目1:Fsm3comb(简单的状态转换3)

题目2:Fsm3onehot(简单的one - hot 状态转换3)

题目3:Fsm3(简单的FSM3)异步复位

题目4: Fsm3s(简单的FSM3,同步复位)


题目1:Fsm3comb(简单的状态转换3)

以下是具有一个输入、一个输出和四个状态的 Moore 状态机的状态转换表。使用以下状态编码:A=2'b00,B=2'b01,C=2'b10,D=2'b11。

仅实现此状态机的状态转换逻辑和输出逻辑(组合逻辑部分)。给定当前状态 (state),根据状态转换表计算next_state 和 输出 (out)

StateNext stateOutput
in=0in=1
AAB0
BCB0
CAD0
DCB1

模块声明

module top_module(
    input in,
    input [1:0] state,
    output [1:0] next_state,
    output out); 

分析:这是一个摩尔状态机。仅实现此状态机的状态转换逻辑和输出逻辑(组合逻辑部分)。根据所给的状态转移表直接写代码就好。

module top_module(
    input in,
    input [1:0] state,
    output [1:0] next_state,
    output out); //

    parameter A=0, B=1, C=2, D=3;

    // State transition logic: next_state = f(state, in)
    //组合逻辑
    always @(*)
        begin
            case(state)
                A:next_state = in ? B:A;
                B:next_state = in ? B:C;
                C:next_state = in ? D:A;
                D:next_state = in ? B:C;
            endcase
        end
    // Output logic:  out = f(state) for a Moore state machine
    //输出逻辑
                always @(*)
                    begin
                        if(state == D)
                            out = 1'b1;
                        else
                            out = 1'b0;
                    end
endmodule

题目2:Fsm3onehot(简单的one - hot 状态转换3)

以下是具有一个输入、一个输出和四个状态的 Moore 状态机的状态转换表。使用以下单热状态编码:A=4'b0001,B=4'b0010,C=4'b0100,D=4'b1000。

通过检测假设采用一热编码来推导状态转换和输出逻辑方程。仅实现此状态机的状态转换逻辑和输出逻辑(组合逻辑部分)。(测试平台将使用非一个热输入进行测试,以确保您不会尝试执行更复杂的操作)。

提示:一热状态转换逻辑的逻辑方程可以通过查看状态转换图的边缘来推导。

StateNext stateOutput
in=0in=1
AAB0
BCB0
CAD0
DCB1

“通过检查推导方程”是什么意思?

单热状态机编码保证正好一个状态位为 1。这意味着可以通过仅检查一个状态位而不是所有状态位来确定状态机是否处于特定状态。通过检查状态转换图中每个状态的传入边,这可以为状态转换生成简单的逻辑方程。

例如,在上面的状态机中,状态机如何才能达到状态A?它必须使用两条传入边之一:“当前处于状态 A 且 in=0”或“当前处于状态 C 且处于 = 0”。由于采用一热编码,测试“当前处于状态 A”的逻辑方程只是状态 A 的状态位。这就引出了状态位 A 的下一个状态的最终逻辑方程:。one-hot 编码保证一次最多有一个子句(产品项)处于“活动状态”,因此这些子句可以只放在一起。next_state[0] = state[0]&(~in) | state[2]&(~in)

当练习要求“通过检查”提供状态转换方程时,请使用此特定方法。法官将使用非一热输入进行测试,以确保您的逻辑方程遵循此方法,而不是对状态位的非法(非一热)组合执行其他操作(例如重置FSM)。

虽然知道这种算法对于RTL级设计不是必需的(逻辑合成器处理这个问题),但它说明了为什么一热FSM通常具有更简单的逻辑(以牺牲更多的状态位存储为代价),并且这个主题经常出现在数字逻辑课程的考试中。

 代码编写如下:

module top_module(
    input in,
    input [3:0] state,
    output [3:0] next_state,
    output out); 

    parameter A=0, B=1, C=2, D=3;

    // State transition logic: Derive an equation for each state flip-flop.
    assign next_state[A] = (state[A] & ~in)| (state[C]&~in);
    assign next_state[B] = (state[A] & in)| (state[B]&in) | (state[D]&in);
    assign next_state[C] = (state[B] & ~in)| (state[D]&~in);
    assign next_state[D] = (state[C] & in);

    // Output logic: 
    always @(*)
        begin
            if(state[D]==1'b1)
                out = 1'b1;
            else
                out = 1'b0;
        end

endmodule

题目3:Fsm3(简单的FSM3)异步复位

另请参见:此 FSM 的状态转换逻辑

以下是具有一个输入、一个输出和四个状态的 Moore 状态机的状态转换表。实现此状态机。包括将 FSM 重置为状态 A 的异步重置。

StateNext stateOutput
in=0in=1
AAB0
BCB0
CAD0
DCB1

模块声明

module top_module(
    input clk,
    input in,
    input areset,
    output out); 

觉得看状态转移表很难写的话可以画出状态转移图。

由此可得代码编写如下,采用三段式的方式编写:

 

module top_module(
    input clk,
    input in,
    input areset,
    output out); //
    reg [1:0]state ,next_state;
    parameter A = 0, B = 1,C = 2,D = 3;
    // State transition logic,组合逻辑
    always @(*)
        begin
            case(state)
                A:next_state = in ? B:A;
                B:next_state = in ? B:C;
                C:next_state = in ? D:A;
                D:next_state = in ? B:C;
            endcase
        end
    // State flip-flops with asynchronous reset,时序逻辑
    always @(posedge clk,posedge areset)//异步复位
        begin
            if(areset)
                state <= A;
            else
                state <= next_state;
        end
    // Output logic,输出逻辑
    always @(*)
        begin
            if(state == D)
                out = 1'b1;
            else
                out = 1'b0;
        end

endmodule

仿真结果:

题目4: Fsm3s(简单的FSM3,同步复位)

另请参见:此 FSM 的状态转换逻辑

以下是具有一个输入、一个输出和四个状态的 Moore 状态机的状态转换表。实现此状态机。包括将 FSM 重置为状态 A 的同步重置(这与 Fsm3 的问题相同,但具有同步重置。

StateNext stateOutput
in=0in=1
AAB0
BCB0
CAD0
DCB1


模块声明

module top_module(
    input clk,
    input in,
    input reset,
    output out); 

分析:这道题做法与题目3相同,只是该题是同步复位。代码编写如下:

module top_module(
    input clk,
    input in,
    input reset,
    output out); //
    reg [1:0] state,next_state;
    parameter A = 0,B = 1,C = 2, D= 3;//定义初始状态

    // State transition logic,组合逻辑
    always @(*)
        begin
            case(state)
                A:next_state = in ? B:A;
                B:next_state = in ? B:C;
                C:next_state = in ? D:A;
                D:next_state = in ? B:C;
            endcase
        end

    // State flip-flops with synchronous reset,时序逻辑
    always @(posedge clk )
        begin
            if(reset)
                state <= A;
            else
                state <= next_state;

        end

    // Output logic,输出逻辑
    always @(*)
        begin
            if(state == D)
                out = 1'b1;
            else
                out = 1'b0;
        end

endmodule

仿真结果如下:

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值