nightseas 发表于 2012-3-4 16:26:42

【诡异啊】状态机生成的奇怪问题,会用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,都可以。难道是因为状态机里不允许出现“只要满足一个条件,任何状态都向某一个状态跳转”的情况吗?求教~~~~

xiazhijpeng 发表于 2012-3-4 21:06:25

楼主,能不能把缩进位的格式加进去呀,否则看起来好费劲的

nuaatao 发表于 2012-3-4 22:52:52

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,你试试

nightseas 发表于 2012-3-5 09:12:45

回复【1楼】xiazhijpeng
楼主,能不能把缩进位的格式加进去呀,否则看起来好费劲的
-----------------------------------------------------------------------

ourdev不识别制表符啊,换成空格了

nightseas 发表于 2012-3-5 09:16:21

回复【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了?

mcupro 发表于 2012-3-5 11:29:04

你仔细整理下思路 应该是存在逻辑问题 之后QU2自动给“优化掉了”。

nightseas 发表于 2012-3-5 12:03:47

回复【5楼】mcupro李伟
你仔细整理下思路 应该是存在逻辑问题 之后qu2自动给“优化掉了”。
-----------------------------------------------------------------------

逻辑本身很简单的,并不存在错误的问题,因为用ModuleSim生成的状态图和仿真波形都对。我一直觉得是写法的问题,不知道是不是Quartus或者FSM规定上有什么特殊要求

xtx 发表于 2012-5-3 21:58:56

同样遇到问题,求解答

flyaudio 发表于 2012-5-4 00:36:47

本帖最后由 flyaudio 于 2012-5-4 00:51 编辑

楼主,程序实现的功能有没有改变?实验过没?

我时钟认为综合工具是不会犯这样的错误的。

nicksean 发表于 2012-5-4 09:47:29

"难道是因为状态机里不允许出现“只要满足一个条件,任何状态都向某一个状态跳转”的情况吗?"

单就状态机来说,我认为这种情况使用子状态来处理更好。不懂Verilog的路过。
页: [1]
查看完整版本: 【诡异啊】状态机生成的奇怪问题,会用FSM的请进~~~~~~