请教,状态机跑飞和跑死,如何解决?

2019-03-25 10:30发布

用的是xilinx的spatan 3a
发现有个状态机工作不正常:
1.当我用ont-hot编码的时候,用chipscope观察,出现全是0的现象,我在状态机的when others中也加了状态的回复,但是还是不行。
2.然后我换了gray编码,这次状态停到了“011”就不走了,而这个状态仅仅起到一个延迟作用,没有任何条件语句。


程序平时是没有问题的,大概运行300次左右就出现一次跑飞。用FPGA1年了,属于初学者,从来没有遇到过这种问题。

请教个位高手,如何解决?
以下是代码
p_reg2:process(S_Lclk,reset)
begin
if (reset='0') then
     state1<=0;
     S_ccs<='Z';
     S_ads_o<='Z';
     S_blast_o<='Z';  
     S_wr_o<='Z';
     S_la_o<=(others=>'Z');
     S_command<=(others=>'Z');
     S_command_en<='1';
elsif rising_edge (S_Lclk) then
     case state1 is
         when 0 =>
             if S_PCI_usero='0' then
               S_ads_o<='1';
               state1<=1;
            else
               S_ccs<='Z';
                S_ads_o<='Z';
                S_blast_o<='Z';  
                S_wr_o<='Z';
                  S_la_o<=(others=>'Z');
                 S_command<=(others=>'Z');
               S_command_en<='1';
            end if;
      when 1 =>
          S_ccs<='0';
         S_ads_o<='0';
         S_wr_o<='0';
         S_la_o<=G_C8;
         state1<=2;
     when 2 =>
        S_ccs<='Z';
        S_ads_o<='1';
        S_blast_o<='0';
        state1<=3;
     when 3 =>
        S_ccs<='Z';   
        state1<=4;
    when 4=>
       if S_ready_i='0' then
         S_command<=pci_ld;
         S_command_en<='0';
         state1<=5;
      else
         null;
       end if;
     when 5=>
       state1<=6;   
   when 6 =>
       if S_PCI_usero='1' then
          S_command_en<='1';
         state1<=0;
      else
        null;
      end if;
      S_blast_o<='Z';  
      S_wr_o<='Z';
      S_ads_o<='Z';
    when others =>
      state1<=0;

   end case;
else
  null;
end if;
end process p_reg2;

这个进程的时钟是我用40M分频产生的(不是用DCM,就是写了个简单的分频代码,即如果上升沿A<=not A),
它即作为本进程的时钟,又作为外部PCI LOCAL总线的时钟。
其它的进程采用的是40M时钟
状态机编码类型是在ise的综合选项中选的。

[ 本帖最后由 qd0090 于 2011-3-22 20:19 编辑 ] 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
17条回答
夏宇闻
1楼-- · 2019-03-27 08:52
 精彩回答 2  元偷偷看……
夏宇闻
2楼-- · 2019-03-27 14:46
原帖由 qd0090 于 2011-3-23 10:26 发表
小弟刚从事电子技术1年多,刚上来接触的就是fpga;单片机,dsp什么的都没有玩过。
这一年多来学到了不少东西,也对fpga有了浓厚的兴趣,觉得fpga真的很有意思,可以做时序,可以做算法,可以嵌入Microblaze,可以嵌 ...


您最好认真读一遍我编写的《Verilog数字系统设计教程》从VHDL转到 Verilog 和SystemVerilog, 这样我们之间的共同语言就更多了。如果您C语言比较熟悉的话,只需要两周就能改过来。
qd0090
3楼-- · 2019-03-27 17:04
谢谢夏老师!
称呼“你”就行了,“您”不敢当啊!哈哈
我之前的工程有5000多行,另外我的工作环境基本都是vhdl,如果现在转的话可能有一些麻烦。
我之前用过一次vhdl和verilog混编,虽然没什么大的影响,但ise将我分的模块打乱了。
而且我确实有点喜欢vhdl的风格。
不过没有关系,这两种语言一定是相通的,说不定看完您的书,我就成为verilog的拥护者了,哈哈。
我只是想学好fpga,语言类型什么的,都无所谓,我不怕麻烦。
明天去当当买本您的书回来细细读读,而且我也一定会给我周围的初学者推荐您的书的!
另外夏老师觉得那本vhdl的书不错,能从硬件出发讲解语言的,能给小子推荐一本么?毕竟之前的工程以后还是需要维护的。
夏宇闻
4楼-- · 2019-03-27 21:37
原帖由 qd0090 于 2011-3-23 20:54 发表
谢谢夏老师!
称呼“你”就行了,“您”不敢当啊!哈哈
我之前的工程有5000多行,另外我的工作环境基本都是vhdl,如果现在转的话可能有一些麻烦。
我之前用过一次vhdl和verilog混编,虽然没什么大的影响,但ise将 ...


看来您是一位勇敢的实践者,实践确实重要,但读书看资料也十分重要,两者不可偏废。VHDL熟悉了,手头的模块很多,自然可以继续下去,如果一旦熟悉了Verilog后, VHDL很快就会淡忘,毕竟Verilog语法比较简单,与C语言有许多类似处。无论用什么语言设计思想最重要,语言并不重要。伟大的作家,无论用哪国语言,只要有伟大的人道主义精神, 有人类的大爱,都可以写出伟大传世的作品,得到诺贝尔文学奖金。
eeleader
5楼-- · 2019-03-27 22:24

其实, 状态机跑飞,不是天灾,是人祸;  用状态机进行代码描述电路的时候需要注意几点:

 

1.  状态机编码要用ONE-HOT 或格雷编码, 避免冒险和竞争;

2.  状态机要用FSM, 有限状态机, 不用状态需要复位;

3.  要采用三段式描述风格, 不要采用一段式描述.

 

我想考虑上面的问题, 你的程序应该不会出问题了

一周热门 更多>