我想通过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
我还需要测量此循环执行的时钟周期数 建议
答案 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。