原本是开始学EDA时开的博客,但最近转向嵌入式学习,但这还是我比较喜欢和常来的地方,也非常希望走过的朋友能留下你们的足迹。QQ:94073982。ARM-Linux的学习群:群号:60696568(嵌入式Linux-s3c2410)。欢迎加入。

FPGA设计要点之二:FSM

上一篇 / 下一篇  2007-08-11 10:26:24 / 天气: 晴朗 / 心情: 高兴

 关于上期的时钟树,可能说的不是很确切。这里的时钟树实际上泛指时钟方案,主要是时钟域和PLL等的规划,一般情况下不牵扯到走线时延的详细计算(一般都走全局时钟网络和局部时钟网络,时延固定),和ASIC中的时钟树不一样。对于ASIC,就必须对时钟网络的设计、布线、时延计算进行仔细的分析计算才行。
            FSM:有限状态机。这个可以说时逻辑设计的基础。几乎稍微大一点的逻辑设计,几乎都能看得到FSM。
            FSM分为moore型和merly型,moore型的状态迁移和变量无关,merly型则有关。实际使用中大部分都采用merly型。
            FSM通常有2种写法:单进程、双进程。
            初学者往往喜欢单进程写法,格式如下:
            always  @( posedge clk or posedge rst )
                begin
                     if  ( rst == 1'b1 )
                         FSM_status <= ......;
                     else
                           case  ( FSM_status )
                                ......;
                           endcase
                 end
            简单的说,单进程FSM就是把所有的同步、异步处理都放入一个always中。
            优点:
            1)看起来比较简单明了,写起来也不用在每个case分支或者if分支中写全对各个信号和状态信号的处理。也可以简单在其中加入一些计数器进行计数处理。
            2)所有的输出信号都已经是经过D触发器锁存了。
            缺点:
            1)优化效果不佳。由于同步、异步放在一起,编译器一般对异步逻辑的优化效果最好。单进程FSM把同步、异步混杂在一起的结果就是导致编译器优化效果差,往往导致逻辑速度慢、资源消耗多。
            2)某些时候需要更快的信号输出,不必经过D触发器锁存,这时单进程FSM的处理就比较麻烦了。
            双进程FSM,格式如下:
            always  @( posedge clk or posedge rst )
                begin
                    if ( rst == 1'b1 )
                        FSM_status_current <= ...;
                    else
                        FSM_status_current <= FSM_status_next;
            always  @(*)
                begin
                    case  ( FSM_status_current )
                        FSM_status_next = ......;
                    endcase
                end
            从上面可以看到,同步处理和异步处理分别放到2个always中。其中FSM状态变量也采用2个来进行控制。双进程FSM的原理我这里就不多说了,在很多逻辑设计书中都有介绍。这里描述起来太费劲。
            优点:
            1)编译器优化效果明显,可以得到很理想的速度和资源占用率。
            2)所有的输出信号(除了FSM_status_current)都是组合输出的,比单进程FSM快。
            缺点:
            1)所有的输出信号(除了FSM_status_current)都是组合输出的,在某些场合需要额外写代码来进行锁存。
            2)在异步处理的always中,所有的if、case分支必须把所有的输出信号都赋值,而且不能出现在FSM中的输出信号回送赋值给本FSM中的其他信号的情况,否则会出现
            latch。
            latch会导致如下问题:
            1)功能仿真结果和后仿不符;
            2)出现无法测试的逻辑;
            3)逻辑工作不稳定,特别是latch部分对毛刺异常敏感;
            4)某些及其特殊的情况下,如果出现正反馈,可能会导致灾难性的后果。
            这不是恐吓也不是开玩笑,我就亲眼见过一个小伙把他做的逻辑加载上去后,整个FPGA给炸飞了。后来怀疑可能是出现正反馈导致高频振荡,最后导致芯片过热炸掉(这个FPGA芯片没有安装散热片)。

TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2009-01-06  
    123
45678910
11121314151617
18192021222324
25262728293031

数据统计

  • 访问量: 20109
  • 日志数: 132
  • 文件数: 1
  • 建立时间: 2007-07-30
  • 更新时间: 2009-01-05

RSS订阅

Open Toolbar