美文网首页
FPGA状态机

FPGA状态机

作者: 暗夜望月 | 来源:发表于2017-06-16 15:35 被阅读0次

其他参考:主要是区分moore状态机和mealy状态机的。
[原创][FPGA]有限状态机FSM学习笔记(一)
[转载][FPGA]有限状态机FSM学习笔记(二)
[笔记][FPGA]有限状态机FSM学习笔记(三)

数字系统有两大类有限状态机(Finite State Machine,FSM):摩尔(Moore)状态机和米勒(Mealy)状态机。

Moore状态机

其最大特点是输出只由当前状态确定,与输入无关。Moore状态机的状态图中的每一个状态都包含一个输出信号。这是一个典型的Moore状态机的状态跳转图,x、y、z是输入,a、b、c是输出。
    


Mealy状态机

它的输出不仅与当前状态有关系,而且与它的输入也有关系,因而在状态图中每条转移边需要包含输入和输出的信息。


状态编码

数字逻辑系统状态机设计中常见的编码方式有:二进制码(Binary码)、格雷码(Gray码)、独热码(One-hot码)。

  • 二进制编码也可称连续编码,也就是码元值的大小是连续变化的。如S0=3'd0, S1=3'd1, S2=3'd2, S3=3'd3 ... ...

  • 格雷码的相邻码元值间只有一位是不同的,如S0=3'b000, S1=3'b001, S2=3'b011, S3=3'b010 ... ... 普通二进制码与格雷码之间可以相互转换。

  • 二进制码转换为格雷码:从最右边一位起,依次与左边一位“异或”,作为对应格雷码该位的值,最左边的一位不变(相当于最左边是0)。

  • 格雷码转换为二进制码:从左边第二位起,将每一位与左边一位解码后的值“异或”,作为该解码后的值(最左边的一位依然不变)。

  • 独热码值每个码元值只有一位是'1',其他位都是'0',如S0=3'b001, S1=3'b010, S2=3'b100 ... ...独热码又分为独热1码和独热0码,是一种特殊的二进制编码方式。当任何一种状态有且仅有一个1时,就是独热1码,相反任何一种状态有且仅有一个0时,就是独热0码。

二进制编码、格雷码编码使用最少的触发器,消耗较多的组合逻辑,而独热码编码反之。独热码编码的最大优势在于状态比较时仅仅需要比较一个位,从而一定程度上简化了译码逻辑。虽然在需要表示同样的状态数时,独热编码占用较多的位,也就是消耗较多的触发器,但这些额外触发器占用的面积可与译码电路省下来的面积相抵消。

在CPLD中,由于器件拥有较多的组合逻辑资源,所以CPLD多使用二进制编码或格雷码,而FPGA更多地提供触发器资源,所以在FPGA中多使用独热码编码。当然,这并不是说在FPGA中就非得用独热编码,在CPLD中不能用独热编码,一般的,对于小型设计(状态数小于4)使用二进制编码,当状态数处于4-24之间时,宜采用独热码编码,而大型状态机(状态数大于24)使用格雷码更高效。

二进制码(Binary)和格雷码(Gray) 属于压缩状态编码,这种编码的优点是使用的状态向量最少,但是需要较多的逻辑资源用来状态译码。二进制码从一个状态转换到相邻状态时,可能有多个比特位发生变化,易产生中间状态转移问题,状态机的速度也要比采用其它编码方式慢。格雷码两个相邻的码值仅有一位就可区分,这将会减少电路中相邻物理信号线同时变化的情况,因而可以减少电路中的电噪声。Johnson码也有同样的特点,但是要用较多的位数。

独热码(One-hot)指对任意给定的状态,状态寄存器中只有1位为1,其余位都为0。n状态的有限状态机需要n个触发器,但这种有限状态机只需对寄存器中的一位进行译码,简化了译码逻辑电路,额外触发器占用的面积可用译码电路省下来的面积抵消。当设计中加入更多的状态时,译码逻辑没有变得更加复杂,有限状态机的速度仅取决于到某特定状态的转移数量,而其它类型有限状态机在状态增加时速度会明显下降。独热码还具有设计简单、修改灵活、易于综合和调试等优点。独热码相对于二进制码,速度快但占用面积大。

状态机的描述

状态机有三种描述方式:一段式状态机、两段式状态机、三段式状态机。下面就用一个小例子来看看三种方式是如何实现的。

  
  • 一段式状态机
    当把整个状态机写在一个always模块中,并且这个模块既包含状态转移,又含有组合逻辑输入/输出时,称为一段式状态机。不推荐采用这种状态机,因为从代码风格方面来讲,一般都会要求把组合逻辑和时序逻辑分开;从代码维护和升级来说,组合逻辑和书序逻辑混合在一起不利于代码维护和修改,也不利于约束。
 //一段式状态机的实现:在异步复位信号的控制下,一段式状态机进入IDLE
 //状态,q_sig4被复位,一旦sig1或者sig2有效,状态机进入WAIT状态,如果
 //sig1和sig2同时有效,那么状态机进入DONE状态,
 //如果sig4还有效,那么q_sig4置位,同时状态机进入IDLE状态。
 
 module one_seg_fsm(clk,reset,sig1,sig2,sig3,q_sig4,q_sm_state);
 //数据声明部分
 input clk,reset,sig1,sig2,sig3;
 
 output reg       q_sig4;
 output reg [1:0] q_sm_state;
 
 //参数声明
 parameter  IDLE       = 2'b00;
 parameter  WAIT       = 2'b01;
 parameter  DONE       = 2'b10;
 
 //状态跳转逻辑程序设计
 always @(posedge clk or posedge reset)
   begin
       if(reset)
       begin
           q_sig4     <= 0;
           q_sm_state <= IDLE;
       end
     else 
         begin
             case(q_sm_state) 
                   IDLE: begin
                              if(sig1 || sig2)
                                   begin
                                       q_sm_state <= WAIT;
                                       q_sig4 <= 1'b0;
                                   end
                                  else
                                      begin
                                          q_sm_state <= IDLE;
                                          q_sig4 <= 1'b0;
                                    end
                           end
                   WAIT: begin
                             if(sig2 && sig3)
                                 begin
                                     q_sm_state <= DONE;
                                     q_sig4     <= 1'b0;
                               end
                             else
                                 begin
                                     q_sm_state <= WAIT;
                                     q_sig4     <= 1'b0;
                               end
                          end       
                                     
                   DONE:begin
                            if(sig3)
                                begin
                                    q_sm_state <= IDLE;
                                    q_sig4     <= 1'b1;
                                end
                            else
                                begin
                                    q_sm_state <= DONE;
                                    q_sig4     <= 1'b0;
                                end
                           end
                    
                 default: begin
                              q_sm_state <= IDLE;
                              q_sig4     <= 0;
                            end
           endcase   
     end
   end
 endmodule 
  • 两段式状态机
    所谓的两段式状态机就是采用一个always语句来实现时序逻辑,另外一个always语句来实现组合逻辑,提高了代码的可读性,易于维护。不同于一段式状态机的是,它需要定义两个状态----现态和次态,然后通过现态和次态的转换来实现时序逻辑。
 //本例主要采用两段式状态机:在异步复位信号的控制下,一段式状态机进入IDLE
 //状态,q_sig4被复位,一旦sig1或者sig2有效,状态机进入WAIT状态,如果sig1和sig2同时有效,那么
 //状态机进入DONE状态,如果sig4还有效,那么q_sig4置位,同时状态机进入IDLE状态。
 
 module two_seg_fsm(clk,reset,sig1,sig2,sig3,q_sig4);
 //数据声明部分
 input clk,reset,sig1,sig2,sig3;
 
 output reg       q_sig4;
 
 reg [1:0]    current_state, next_state;
 
 //参数声明
 parameter  IDLE       = 2'b00;
 parameter  WAIT       = 2'b01;
 parameter  DONE       = 2'b10;
 
 //状态跳转程序设计
 always @(posedge clk or posedge reset)
  if(reset)
      current_state <= IDLE;
  else
      current_state <= next_state;
      
 //状态逻辑输出
 always @(current_state or sig1 or sig2 or sig3)
   begin
       case(current_state)
                   IDLE: begin
                              if(sig1 || sig2)
                                   begin
                                       next_state = WAIT;
                                       q_sig4    = 1'b0;
                                   end
                                  else
                                      begin
                                          next_state = IDLE;
                                          q_sig4     = 1'b0;
                                    end
                           end
                   WAIT: begin
                             if(sig2 && sig3)
                                 begin
                                     next_state = DONE;
                                     q_sig4     = 1'b0;
                               end
                             else
                                 begin
                                     next_state = WAIT;
                                     q_sig4     = 1'b0;
                               end
                          end       
                                     
                   DONE:begin
                            if(sig3)
                                begin
                                    next_state = IDLE;
                                    q_sig4     = 1'b1;
                                end
                            else
                                begin
                                    next_state = DONE;
                                    q_sig4     = 1'b0;
                                end
                           end
                    
                 default: begin
                              next_state = IDLE;
                              q_sig4     = 0;
                            end
           endcase   
     
   end
 endmodule  
  • 三段式状态机
    三段式状态机与两段式状态机的区别:两段式直接采用组合逻辑输出,而三段式则通过在组合逻辑后再增加一级寄存器来实现时序逻辑输出。这样做的好处是可以有效地滤去组合逻辑输出的毛刺,同时可以有效地进行时序计算与约束,另外对于总线形式的输出信号来说,容易使总线数据对齐,从而减小总线数据间的偏移,减小接收端数据采样出错的频率。

三段式状态机的基本格式是:第一个always语句实现同步状态跳转;第二个always语句实现组合逻辑;第三个always语句实现同步输出。

//本例主要采用三段式状态机:在异步复位信号的控制下,一段式状态机进入IDLE
 //状态,q_sig4被复位,一旦sig1或者sig2有效,状态机进入WAIT状态,如果sig1和sig2同时有效,那么
 //状态机进入DONE状态,如果sig4还有效,那么q_sig4置位,同时状态机进入IDLE状态。
 
 module three_seg_fsm(clk,reset,sig1,sig2,sig3,q_sig4);
 //数据声明部分
 input clk,reset,sig1,sig2,sig3;
 
 output reg       q_sig4;
 
 reg [1:0]    current_state, next_state;
 
 //参数声明
 parameter  IDLE       = 2'b00;
 parameter  WAIT       = 2'b01;
 parameter  DONE       = 2'b10;
 
 //状态跳转程序设计
 always @(posedge clk or posedge reset)
  if(reset)
      current_state <= IDLE;
  else
      current_state <= next_state;
      
 //状态跳转输出
 always @(current_state or sig1 or sig2 or sig3)
   begin
       case(current_state)
       IDLE: begin
                              if(sig1 || sig2)
                                   begin
                                       next_state = WAIT;                                      
                                   end
                                  else
                                      begin
                                          next_state = IDLE;                                         
                                    end
                           end
                   WAIT: begin
                             if(sig2 && sig3)
                                 begin
                                     next_state = DONE;                                    
                               end
                             else
                                 begin
                                     next_state = WAIT;                                    
                               end
                          end       
                                     
                   DONE:begin
                            if(sig3)
                                begin
                                    next_state = IDLE;                                   
                                end
                            else
                                begin
                                    next_state = DONE;                                   
                                end
                           end
                    
                 default: begin
                              next_state = IDLE;                             
                            end
           endcase       
   end
   
   //逻辑输出
   always @(posedge clk or posedge reset)
     if(reset)
         q_sig4 <= 1'b0;
     else
         begin
             case(next_state)
                 IDLE,
                 WAIT: q_sig4 <= 1'b0;
                 DONE: q_sig4 <= 1'b1;
                 default: q_sig4 <= 1'b0;
           endcase
         end
         
 endmodule   

相关文章

  • FPGA状态机

    其他参考:主要是区分moore状态机和mealy状态机的。[原创][FPGA]有限状态机FSM学习笔记(一)[转载...

  • FPGA 状态机

    [三段状态机思维陷阱|http://blog.csdn.net/narutoinspire/article/det...

  • FPGA-数字闹钟

    用FPGA设计一个数字闹钟应该说是一个比较综合的小系统,包含了按键、数码管、状态机等内容,本文主要是讲述三键输入的...

  • FPGA Verilog HDL 设计-----有限状态机

    数字系统有两大类有限状态机(Finite State Machine,FSM):Moore状态机和Mealy状态机...

  • 使用Matlab生成COE文件

    在FPGA中做VGA显示时,经常需要把图片转成COE文件(Xilinx FPGA),存放到ROM中,供FPGA读取...

  • 设计模式-状态机

    对于一个状态机来说,需要分成2个部分来考虑状态机,一是状态机本身,二是状态机的实现。 状态机推演 只有状态机本身是...

  • FPGA复位——同步复位和异步复位

    其他参考资料:FPGA中复位信号的设计FPGA同步复位异步复位异步复位同步释放---关于复位的问题FPGA同步复位...

  • 猿学-FPGA加速:面向数据中心和云服务的探索和实践

    作者介绍:章恒——腾讯云FPGA专家,目前在腾讯架构平台部负责FPGA云的研发工作,探索FPGA加速数据中心的应用...

  • ASIC转FPGA

    1.目标 将ASIC设计代码做一定转换,变成FPGA的输入,供FPGA原型验证使用。 2.ASIC转FPGA基本原...

  • FPGA原理简介

    本文将简练地介绍FPGA的硬件原理及使用方法 FPGA和CPLD是什么 FPGA和CPLD都是可编程逻辑器件,构造...

网友评论

      本文标题:FPGA状态机

      本文链接:https://www.haomeiwen.com/subject/baqmqxtx.html