在verilog中为循环写入FSM
我想通过一个FSM实现这个for循环在verilog中为循环写入FSM,verilog,fsm,Verilog,Fsm,我想通过一个FSM实现这个for循环 int j; for(int i=0;i<50;i++) { j++ } 我认为需要3种状态:init、increment和done 初始化->初始化 增量->将增量i/j 完成->最终状态 我的尝试 module fsm( clk, z, next_state ); input clk; output [7:0] z; reg [7:0] z; reg [7:0] k;
int j;
for(int i=0;i<50;i++)
{
j++
}
我认为需要3种状态:init、increment和done
初始化->初始化
增量->将增量i/j
完成->最终状态
我的尝试
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
我还需要测量这个循环执行所需的时钟周期数
建议缩进代码可以使输入更容易阅读,也更容易让其他人帮助您 如果您不限于verilog-95,则端口列表可以从
module fsm(
clk, z
);
input clk;
output [7:0] z;
reg [7:0] z;
致:
您当前的问题一直处于定义状态。如果需要3个状态,则至少需要2位。因此,reg[1:0]状态;reg[1:0]下一个州;将是所需的最小宽度
你们的州可以定义为:
parameter S0=2'b00;
parameter S1=2'b01;
parameter S2=2'b10;
注意:如果它们不被覆盖,那么就生成localparams。thanx Morgan,我已经完成了FSM的设计。现在实际需要的是在一定数量的延迟之后运行FSM模块一定数量的时间。所以在c中,我需要I;i@SangeetSaha睡眠在verilog许多并行硬件中并没有真正的意义。Verilog for design并没有真正的时间概念,只有时钟边缘。如果你真的被卡住了,格式良好的问题通常会得到回答。所以,如果你有一些你认为是一个好问题的东西,那么一定要提出另一个问题。
parameter S0=2'b00;
parameter S1=2'b01;
parameter S2=2'b10;