在verilog中为for循环编写FSM

时间:2014-01-14 10:05:57

标签: verilog fsm

我想通过FSM实现这个循环

  int j;
   for(int i=0;i<50;i++)
    {
  j++
  }

我认为需要3个状态:init,increment和done。

init - &gt;初始化
增量 - &gt;将增加i / j
完成 - &gt;最终状态

我的尝试

module fsm(
    clk, z, next_state
);
  input        clk;
  output [7:0] z;
  reg    [7:0] z;
  reg    [7:0] k;
  reg    [7:0] state, next_state;

  parameter S0=0;
  parameter S1=0;
  parameter S2=0; // my confusion lies here

  always @ (*) begin : next_state_logic
    case ( state )
      S0: begin
        k = 'b0;
        z = 'b0;
        next_state = S1;
        //else next_state = S0;
      end
      S1: begin 
        z=z+1;
        k=k+1; 
        if (k<8'b00110010)
          next_state = S1;
        else
          next_state = S2;
      end
      S2: begin
        z=S2;
      end
      default: next_state = S0;
  endcase
end // continued to the right

// continued from left
always @ (posedge clk) begin: state_assignment
  state <= next_state;
end

endmodule

我还需要测量此循环执行的时钟周期数 建议

1 个答案:

答案 0 :(得分:0)

缩进代码使阅读更容易,其他人也更容易帮助您。

如果您不限于verilog-95,则可以从

更改端口列表
module fsm(
  clk, z
);
input        clk;
output [7:0] z;
reg    [7:0] z;

到:

module fsm(
  input            clk, 
  output reg [7:0] z
);

您目前的问题一直是定义州。如果你想要3个状态,你需要至少2位。因此reg [1:0] state; reg [1:0] next_state;将是所需的最小宽度。

您的州可以定义为:

parameter S0=2'b00;
parameter S1=2'b01;
parameter S2=2'b10; 

注意:如果他们不会被覆盖,那么请制作localparam s。