【问题标题】:FSM state machine in VerilogVerilog 中的 FSM 状态机
【发布时间】:2019-02-12 04:23:14
【问题描述】:

如果输入中没有重置,如何将初始状态设置为 state_0 ?

reg[2:0]    state;


localparam  s0 = 3'b000, s1 = 3'b001, s2 = 3'b010, s3 = 3'b011, s4 = 
3'b100, s5 = 3'b101;    
assign  state = s0; /* NOT SURE IF THIS IS RIGHT!*/


localparam  i=0, j=64, k=0, h=0; 


always @ ( posedge clk ) begin

case( state )

        s0: ........

【问题讨论】:

    标签: initialization verilog fsm


    【解决方案1】:

    不,这不起作用,因为assign 语句将一直强制state = s0。编译器还会抱怨多个驱动程序设置state。如果没有复位信号,一种选择是:

    initial begin
      // set any initial values
      state = s0;
    end
    

    这将代替您拥有assign 语句的位置。这在模拟中效果很好,但更好的做法是修改您的状态逻辑:

    localparam  s0 = 3'b000, s1 = 3'b001, s2 = 3'b010, s3 = 3'b011, s4 = 3'b100, s5 = 3'b101;
    reg [2:0] state, next_state;
    
    always @(posedge clk) begin
      state <= next_state;
    end
    
    always @(state) begin
      case (state)
      // modify this state logic to reflect your FSM
      s0: next_state <= s1;
      s1: next_state <= s2;
      s2: next_state <= s3;
      s3: next_state <= s4;
      s4: next_state <= s5;
      s5: next_state <= s0;
      // this controls the behavior at bringup w/o a reset
      // you should include a default case even with a reset
      default: next_state <= s0;
      endcase
    end
    
    always @(state) begin
      case (state)
      // modify this output logic to reflect your FSM
      s0: // set your output signals accordingly
      s1: // set your output signals accordingly
      s2: // set your output signals accordingly
      s3: // set your output signals accordingly
      s4: // set your output signals accordingly
      s5: // set your output signals accordingly
      // this controls the behavior at bringup w/o a reset
      // you should include a default case even with a reset
      default: // set all outputs to 0
      endcase
    end
    

    将逻辑分离到时钟always 块和上面的组合状态转换逻辑有助于创建无锁存设计。我知道这超出了您的要求,但这种编码风格有助于创建良好的综合设计。

    【讨论】:

    • 谢谢!因为我是新手,所以我似乎无法支持你的答案,但我会给出一个。
    • 为什么你的第二个总是阻止“always @(state)”?不应该只是“总是@(posedge clk)开始”吗?
    • @beepboopbeepboop 由于您提出问题而不是投票,因此您可以接受答案。
    • 我会指出,使用默认情况是可行的方法,因为它应该在启动时将 X 状态发送到 s0。但是,在现实世界中,您将以某种随机状态启动,而这种状态可能是有效的。在这种情况下,您的 FSM 将立即从该状态开始运行,并且您每次都可以获得不同的启动行为。简短的回答:如果可能的话,你真的想要一个重置。
    • 另外:我不是 FPGA 用户,但我相信如果您的综合目标是 FPGA,initial 会起作用。
    猜你喜欢
    • 2015-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-16
    • 1970-01-01
    • 2012-10-11
    • 1970-01-01
    • 2013-02-01
    相关资源
    最近更新 更多