【诡异啊】状态机生成的奇怪问题,会用FSM的请进~~~~~~
最近写一个状态机,出现了奇怪的问题,用quartus生成的状态图中可以看到有一个状态STATE_D无法跳转到。上图:http://cache.amobbs.com/bbs_upload782111/files_53/ourdev_724027I2YKVT.jpg
(原文件名:IncorrectFSM.jpg)
这是期望的状态图:
http://cache.amobbs.com/bbs_upload782111/files_53/ourdev_724028GPPZYT.jpg
(原文件名:CorrectFSM.jpg)
代码如下:
module fsm(
mclk,
rst_n,
ein,
ain,
bout
);
input ain,ein,mclk,rst_n;
output bout;
reg bout;
reg fsm_state;
parameter STATE_S = 2'b00;
parameter STATE_E = 2'b01;
parameter STATE_D = 2'b10;
parameter STATE_W = 2'b11;
//Bypass control state machine
always@(posedge mclk, negedge rst_n)
begin
if(!rst_n) begin
fsm_state <= STATE_S;
bout <= 1'b0;
end
else begin
case(fsm_state)
STATE_S:
begin
if(ein) begin
bout <= 1'b0;
fsm_state <= STATE_E;
end
else begin
bout <= 1'b1;
fsm_state <= STATE_D;
end
end
STATE_E:
begin
if(!ein) begin
bout <= 1'b1;
fsm_state <= STATE_D;
end
else if(ain) begin
bout <= 1'b1;
fsm_state <= STATE_W;
end
else begin
bout <= 1'b0;
fsm_state <= STATE_E;
end
end
STATE_D:
begin
if(ein) begin
bout <= 1'b0;
fsm_state <= STATE_E;
end
else begin
bout <= 1'b1;
fsm_state <= STATE_D;
end
end
STATE_W:
begin
if(!ein) begin
bout <= 1'b1;
fsm_state <= STATE_D;
end
else if(!ain) begin
bout <= 1'b0;
fsm_state <= STATE_E;
end
else begin
bout <= 1'b1;
fsm_state <= STATE_W;
end
end
default:
fsm_state <= STATE_S;
endcase
end
end
endmodule
很奇怪,倒不是写法的问题,不管用两个always、三个always的都一样,问题貌似和这个ein输入有关系。如果把ein改成两位的信号,或者把STATE_S处的ein改成!ein,都可以。难道是因为状态机里不允许出现“只要满足一个条件,任何状态都向某一个状态跳转”的情况吗?求教~~~~ 楼主,能不能把缩进位的格式加进去呀,否则看起来好费劲的 if(ein) begin
bout <= 1'b0;
fsm_state <= STATE_E; 改成fsm_state <= STATE_D;
end
else begin
bout <= 1'b1;
fsm_state <= STATE_D; 改成fsm_state <= STATE_E;
end
要不默认的先跳到state E,你试试 回复【1楼】xiazhijpeng
楼主,能不能把缩进位的格式加进去呀,否则看起来好费劲的
-----------------------------------------------------------------------
ourdev不识别制表符啊,换成空格了 回复【2楼】 nuaatao
if(ein) begin
bout <= 1'b0;
fsm_state <= STATE_E; 改成fsm_state <= STATE_D;
end
else begin
bout <= 1'b1;
fsm_state <= STATE_D; 改成fsm_state <= STATE_E;
end
要不默认的先跳到state E,你试试
-----------------------------------------------------------------------
是这样吗?
STATE_S:
begin
if(!ein) begin
bout <= 1'b1;
fsm_state <= STATE_D;
end
else begin
bout <= 1'b0;
fsm_state <= STATE_E;
end
end
这样子也不行的。
另外ModuleSim仿真的时候就能识别出正确的状态图,难道是Quartus10 Bug了? 你仔细整理下思路 应该是存在逻辑问题 之后QU2自动给“优化掉了”。 回复【5楼】mcupro李伟
你仔细整理下思路 应该是存在逻辑问题 之后qu2自动给“优化掉了”。
-----------------------------------------------------------------------
逻辑本身很简单的,并不存在错误的问题,因为用ModuleSim生成的状态图和仿真波形都对。我一直觉得是写法的问题,不知道是不是Quartus或者FSM规定上有什么特殊要求 同样遇到问题,求解答 本帖最后由 flyaudio 于 2012-5-4 00:51 编辑
楼主,程序实现的功能有没有改变?实验过没?
我时钟认为综合工具是不会犯这样的错误的。 "难道是因为状态机里不允许出现“只要满足一个条件,任何状态都向某一个状态跳转”的情况吗?"
单就状态机来说,我认为这种情况使用子状态来处理更好。不懂Verilog的路过。
页:
[1]