【问题标题】:Dealing with lots of outputs in a finite state machine verilog在有限状态机verilog中处理大量输出
【发布时间】:2016-08-27 21:51:05
【问题描述】:

所以我正在尝试实现我的第一个 FSM,但我感到非常困惑。

代码有点长,让我总结一下: 我从声明输入和输出开始 然后状态声明(我有五个加三个占位符) 然后是当前状态赋值,是顺序的

always @(posedge clk)
begin
    if (rst == 1'b1)
        Current_State <= MainGreen;
    else
        Current_State <= Next_state;
end

然后……我迷路了。我最初只有一个分配 next_state 和输出的大型时序电路,但这很混乱/可能有很多错误。

我现在拥有的只是 next_state 逻辑,但与输出无关:

always @*
begin
    Next_state = Current_State;
    case (Current_State)

        MainGreen:
        begin
            if (count && expired)
            begin
                Next_state = MainYel;
            end
        end

        MainYel:
        begin
            if (WR && expired)
                Next_state = AllRed;
            else if (expired)
                Next_state = SideGreen;
        end

        AllRed:
        begin
            if (expired)
                Next_state = SideGreen;
        end

        SideGreen:
        begin
            if(sensor && expired)
                Next_state = SideYel;
        end

        SideYel:
        begin
            if(expired)
                Next_state = MainGreen;
        end
    endcase
    end

我有大约 8 个仅基于状态的输出和 4 个基于状态和输入的输出。我应该如何分配它们?

【问题讨论】:

  • 您也可以将它们包含在上面的案例陈述中;您已经通过AllRed 的案例了解Current_State == AllRed 的逻辑

标签: verilog fsm


【解决方案1】:

您已经完成了 90% 的工作。有两种方法可以继续(可能不止这些,但我会给你我认为最好的两种选择):

首先,您是否有很多仅在少数州得到断言的输出?如果是这样,我会在你的组合总是块中推荐这样的东西:

always @*
begin
  // default output values
  output1 = 1'b0;
  output2 = 1'b0;
  output3 = 1'b0;
  ....
  case (Current_State)
    STATE1: 
    begin
      output2 = 1'b1;
      // calculate next state
      ...
    end

    STATE2: 
    begin
      output4 = 1'b1;
      // calculate next state
      ...
    end
    ...
  endcase
end 

这可能是编写状态机的最有效方式,因为您不需要在每个状态下定义每个输出。现在,如果您让每个输出在许多不同的状态下处于活动状态,那么您可能更容易在 case 语句中的每个状态下定义这些输出。

我不推荐的最后一种方法是在单独的分配语句中导出 sm 输出。它也可以工作,但我认为将输出与下一个状态逻辑保持在一起更容易进行代码维护和养成良好的习惯。快速破解一些代码以完成任务是一回事,为实际产品开发代码是另一回事,该产品可能在产品生命周期内多次更新,并且可维护性至关重要(这是我在工作中必须学习的,因为大学里没有人教过它)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-14
    • 2014-05-19
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 2021-08-08
    • 2019-02-12
    • 2018-10-07
    相关资源
    最近更新 更多