HDLBits刷题Day22,3.2.5.3 Simple FSM 2 (asynchronous reset) - 3.2.5.6 Simple one-hot state transitions

3.2.5.3和3.2.5.4(JK触发器)类比3.2.5.1和3.2.5.2(T触发器)来写
3.2.5.5 Simple state transitions 3

问题描述

下面是一输入一输出四状态的摩尔状态机的状态转移表。使用以下状态编码:A=2'b00, B=2'b01, C=2'b10, D=2'b11。

仅实现此状态机的状态转换逻辑和输出逻辑(组合逻辑部分)。给定当前状态 ( state),根据状态转换表 计算next_state和输出 (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
    assign out=(state==D);
endmodule

 

3.2.5.6 Simple one-hot state transitions 3

问题描述

下面是一输入一输出四状态的摩尔状态机的状态转移表。使用以下单热状态编码:A=4'b0001, B=4'b0010, C=4'b0100, D=4'b1000。

假设 one-hot 编码,通过检查导出状态转换和输出逻辑方程。仅实现此状态机的状态转换逻辑和输出逻辑(组合逻辑部分)。(测试台将使用非独热输入进行测试,以确保您不会尝试做更复杂的事情)。

独热状态转换逻辑的逻辑方程可以通过查看状态转换图的边缘来导出。

“通过查看状态转换图的边缘来导出”是什么意思?
这意味着只需检查一个状态位,而不是所有状态位,就能确定状态机是否处于特定状态。这样,通过检查状态转换图中每个状态的输入边,就可以得到简单的状态转换逻辑方程。

例如,在上述状态机中,状态机如何才能到达状态 A?它必须使用两条输入边中的一条: "Currently in state A and in=0" or "Currently in state C and in = 0"。由于采用了单击编码,测试 "currently in state A" 的逻辑方程就是状态 A 的状态位,从而得出状态位 A 的下一状态的最终逻辑方程:next_state[0] = state[0]&(~in) | state[2]&(~in) 。单次编码保证了一次最多只有一个子句(乘积项)处于 "活动 "状态,因此子句可以直接 OR 在一起。

当练习要求 "通过检查 "得到状态转换方程时,请使用这种方法。评委会使用非 "独热 "输入进行测试,以确保你的逻辑方程遵循了这种方法,而不会对非法(非 "独热")的状态位组合采取其他措施(如重置 FSM)。

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

相关知识:

独热码,在英文文献中称做 one-hot code, 直观来说就是有多少个状态就有多少比特,而且只有一个比特为1,其他全为0的一种码制。通常,在通信网络协议栈中,使用八位或者十六位状态的独热码,且系统占用其中一个状态码,余下的可以供用户使用。 

例如,有4个状态的独热码状态编码为:0001,0010,0100,1000。

代码:

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:
    assign out = (state[D]);
endmodule

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值