繁体   English   中英

如何在系统verilog中计数?

[英]How to count in system verilog?

在 System Verilog 中,我有多个状态,其中某些状态被使用了两次,我怎么知道这是我第一次经过这个 state 还是第二次?

例如,如果这是我第二次想结束流程并重新开始。 如果是第一次再做一次。

任何想法都会有所帮助

如果您只需要两次执行某些状态,请将它们设为两个不同的状态。 您可以将常用逻辑部分放在 function 中。

always_ff @(posedge clk or posedge reset)
  if (reset) state <= IDLE else
  case (STATE)
    IDLE: if (start) STATE <= ST1;
    ST1: begin STATE <= ST2; fST(); end
    ST2: begin STATE <= IDLE; fST(); end
    default: STATE <= IDLE;
  endcase
function void fST;
// stuff that needs to be done
end function

如果您需要两次以上,您可以放入柜台

always_ff @(posedge clk or posedge reset)
  if (reset) STATE <= IDLE else
  case (STATE)
    IDLE: if (start) begin STATE <= ST; counter <=0; end
    ST: begin 
          if (counter > N) STATE <= IDLE;
          counter <= counter + 1;
          // stuff that needs to be done
        end
    default: STATE <= IDLE;
  endcase

如果您将 FSM 分成always_combalways_ff ,您将需要下一个 state 和下一个计数器变量。

always_ff @(posedge clk or posedge reset)
         if (reset) STATE <= IDLE else
            begin
             STATE <= NXSTATE;
             COUNTER <= NXCOUNTER;
            end
always_comb
  case (STATE)
    IDLE: if (start) begin NXSTATE = ST; COUNTER <=0; end
    ST: begin 
          if (COUNTER > N) NXSTATE = IDLE;
          NXCOUNTER = NXCOUNTER + 1;
          // stuff that needs to be done
        end
    default: NXSTATE = IDLE;
  endcase           

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM