本帖最后由 fpgaw 于 2010-11-19 09:41 编辑
假设这么一种情形:一次完整的操作需要分为1,2,3,4四步完成,每个步骤都需要若干个时钟完成,而且只有当1完成后才能进行2操作,2完成后才能进行3操作,3完成才能进行4操作,4完成后才能返回1操作。也就是这四个步骤必须严格的顺序执行。 下面是我的思路,不知道可行否,或者有什么问题,希望大家指点一下。
四个状态分别使用onehot, S1 = 0001, S2 = 0010, S3 = 0100, S4 = 1000;1步骤开始信号S1_EN, 完成的标志信号S1_OK;2步骤开始信号S2_EN, 完成的标志S2_OK; 3步骤开始信号S1_EN, 完成的标志S3_OK;4步骤开始信号S4_EN, 完成的标志信号S4_OK。状态机的输入信号:S1_OK, S2_OK, S3_OK, S4_OK。输出信号:S1_EN ,S2_EN S3_EN ,S4_EN。代码如下:
always@(current_state or S1_OK or S2_OK or S3_OK or S4_OK)
begin
S1_EN = 0;
S2_EN = 0;
S3_EN = 0;
S4_EN = 0;
case(current_state)
S1:begin
S1_EN = 1;
if (S1_OK == 1)
next_state = S2;
else
next_state = S1;
end
S2: begin
S2_EN = 1;
if (S2_OK == 1)
next_state = S3;
else
next_state = S2;
end
S3: begin
S3_EN = 1;
if (S3_OK == 1)
next_state = S4;
else
next_state = S3;
end
S4: begin
S4_EN = 1;
if (S4_OK == 1)
next_state = S1;
else
next_state = S4;
end
default: next_sate = S1;
endcase
end
always @(posedge clkornegedge rst)
if (!rst)
current_state <= S1;
else
current_state <= next_state; |