HDLBits 系列(27)孰对孰错 之 Fsm onehot?

目录

前言

原题复现

审题

我的设计

测试吐槽

最后的解决方案


前言

今天的这个问题,并没有满意的解决,路过的朋友,看出问题所在的,可以给个评论,谢谢。


原题复现

Fsm onehot

下面是一个最基础的状态机的一部分,这是一个题目,我们用最常规的方式来解决它。

原题传送

审题

上图是一个状态转移图,我们用给出的输入输出模型来实现这个状态机,确切的说,这不是一个完整的状态机,如果根据给的输入输出来看:

module top_module(
    input in,
    input [9:0] state,
    output [9:0] next_state,
    output out1,
    output out2);

当前状态作为输入,也就是说不需要寄存器来实现状态转移的时序逻辑部分了。

这里有一个要求,就是状态编码要用独热码,原题如下描述的:

Suppose this state machine uses one-hot encoding, where state[0] through state[9] correspond to the states S0 though S9, respectively. The outputs are zero unless otherwise specified.

Implement the state transition logic and output logic portions of the state machine (but not the state flip-flops). You are given the current state in state[9:0] and must produce next_state[9:0] and the two outputs. Derive the logic equations by inspection assuming a one-hot encoding. (The testbench will test with non-one hot inputs to make sure you're not trying to do something more complicated).

我的设计

我用最基础的方式,做出了如下的设计:

module top_module(
    input in,
    input [9:0] state,
    output [9:0] next_state,
    output out1,
    output out2);
    
    localparam S0 = 10'b0000_0000_01, S1 = 10'b0000_0000_10, S2 = 10'b0000_0001_00, S3 = 10'b0000_0010_00,S4 = 10'b0000_0100_00; 
    localparam S5 = 10'b0000_1000_00, S6 = 10'b0001_0000_00, S7 = 10'b0010_0000_00, S8 = 10'b0100_0000_00,S9 = 10'b1000_0000_00;
    always@(*) begin
        case(state)
            S0: begin
                if(in) next_state = S1;
                else next_state = S0;
            end
            S1: begin
                if(in) next_state = S2;
                else next_state = S0;
            end
            S2: begin
                if(in) next_state = S3;
                else next_state = S0;
            end
            S3: begin
                if(in) next_state = S4;
                else next_state = S0;
            end
            S4: begin
                if(in) next_state = S5;
                else next_state = S0;
            end
            S5: begin
                if(in) next_state = S6;
                else next_state = S8;
            end
            S6: begin
                if(in) next_state = S7;
                else next_state = S9;
            end
            S7: begin
                if(in) next_state = S7;
                else next_state = S0;
            end
            S8: begin
                if(in) next_state = S1;
                else next_state = S0;
            end
            S9: begin
                if(in) next_state = S1;
                else next_state = S0;
            end
            default: begin
               next_state = S0; 
            end
            
        endcase
    end
    
    assign out1 = (state == S8 | state == S9) ? 1 : 0;
    assign out2 = (state == S9 | state == S7) ? 1 : 0;
    
    

endmodule

测试吐槽

测试结果呢?

从不匹配的地方可以看出,问题在于第一个状态,为了测试,平台给了一个状态0???

你让我用独热码,然后又给我输入了一个状态0?

你不会在逗我吧?

好,假如我屈服与你的淫威,这个状态是我不存在的,我把它加入到default中去,状态转移部分的default改为如下:

default: begin
               next_state = 0; 
end

可见,这一段测试结果是没错了:

但是问题又出现在了:

又乱jr给我当前状态,what?180?也就是1_1000_0000?这是独热码吗?我又只能跳到default那部分?于是乎,又和你的不一样了?

罢了罢了,这是我的独热码,你玩你的独热码,到此为止吧。

最后的解决方案

https://blog.csdn.net/Reborn_Lee/article/details/103480678

 

 

 

您提到的"[Synth 8-327] inferring latch for variable 'FSM_onehot_Nx_State_reg'"似乎是一个来自综合工具(如Xilinx Vivado或Intel Quartus等)的警告信息。这个警告意味着综合工具在尝试将您的HDL代码(可能是VHDL或Verilog)综合成硬件逻辑时,检测到一些情况导致它推断出了一个锁存器(latch)而不是触发器(flip-flop)。锁存器与触发器都是存储元件,但它们的行为和使用场合有所不同。 在数字设计中,触发器通常用于同步电路中,它们在时钟边沿到来时改变状态。而锁存器则多用于组合逻辑中,它们会在使能信号有效时透明地传递输入信号。 当综合工具无法从代码中明确地看到所有条件分支都被时钟边沿触发时,它可能会自动创建锁存器来保持状态,这通常发生在条件赋值语句中,当某些条件未被完全覆盖时。 例如,如果您的VHDL代码有如下形式: ```vhdl if clk'event and clk = '1' then if reset = '1' then FSM_onehot_Nx_State_reg <= "00000001"; elsif enable = '1' then FSM_onehot_Nx_State_reg <= next_state; end if; end if; ``` 如果`next_state`没有被正确地赋值,综合器可能会插入一个锁存器来保持`FSM_onehot_Nx_State_reg`的值,直到下一个使能条件满足。 解决这个问题的方法通常包括确保所有的状态变量都能够在每个时钟周期内被完整地赋值。例如,可以使用默认赋值或者在没有明确赋值的条件下指定一个默认状态
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

李锐博恩

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

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

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

打赏作者

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

抵扣说明:

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

余额充值