FPGA 状态机设计

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

Moore状态机

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

    

Mealy状态机

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

状态编码

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

  格雷码的特点:相邻的两个码组之间仅有一位不同。

普通二进制码与格雷码之间可以相互转换。

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

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

  独热码又分为独热1码和独热0码,是一种特殊的二进制编码方式。当任何一种状态有且仅有一个1时,就是独热1码,相反任何一种状态有且仅有一个0时,就是独热0码。

状态机的描述

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

  (各种图片,各种坑爹啊 - -!)

一段式状态机

  当把整个状态机卸载一个always模块中,并且这个模块既包含状态转移,又含有组合逻辑输入/输出时,称为一段式状态机。不推荐采用这种状态机,因为从代码风格方面来讲,一般都会要求把组合逻辑和时序逻辑分开;从代码维护和升级来说,组合逻辑和书序逻辑混合在一起不利于代码维护和修改,也不利于约束。

 1 //一段式状态机来实现:在异步复位信号的控制下,一段式状态机进入IDLE 2 //状态,q_sig4被复位,一旦sig1或者sig2有效,状态机进入WAIT状态,如果 3 //sig1和sig2同时有效,那么状态机进入DONE状态, 4 //如果sig4还有效,那么q_sig4置位,同时状态机进入IDLE状态。 5  6 module one_seg_fsm(clk,reset,sig1,sig2,sig3,q_sig4,q_sm_state); 7 //数据声明部分 8 input clk,reset,sig1,sig2,sig3; 9 10 output reg       q_sig4;11 output reg [1:0] q_sm_state;12 13 //参数声明14 parameter  IDLE       = 2‘b00;15 parameter  WAIT       = 2‘b01;16 parameter  DONE       = 2‘b10;17 18 //状态跳转逻辑程序设计19 always @(posedge clk or posedge reset)20   begin21       if(reset)22       begin23           q_sig4     <= 0;24           q_sm_state <= IDLE;25       end26     else 27         begin28             case(q_sm_state) 29                   IDLE: begin30                              if(sig1 || sig2)31                                   begin32                                       q_sm_state <= WAIT;33                                       q_sig4 <= 1‘b0;34                                   end35                                  else36                                      begin37                                          q_sm_state <= IDLE;38                                          q_sig4 <= 1‘b0;39                                    end40                           end41                   WAIT: begin42                             if(sig2 && sig3)43                                 begin44                                     q_sm_state <= DONE;45                                     q_sig4     <= 1‘b0;46                               end47                             else48                                 begin49                                     q_sm_state <= WAIT;50                                     q_sig4     <= 1‘b0;51                               end52                          end       53                                     54                   DONE:begin55                            if(sig3)56                                begin57                                    q_sm_state <= IDLE;58                                    q_sig4     <= 1‘b1;59                                end60                            else61                                begin62                                    q_sm_state <= DONE;63                                    q_sig4     <= 1‘b0;64                                end65                           end66                    67                 default: begin68                              q_sm_state <= IDLE;69                              q_sig4     <= 0;70                            end71           endcase   72     end73   end74 endmodule                                 

两段式状态机

  所谓的两段式状态机就是采用一个always语句来实现时序逻辑,另外一个always语句来实现组合逻辑,提高了代码的可读性,易于维护。不同于一段式状态机的是,它需要定义两个状态----现态和次态,然后通过现态和次态的转换来实现时序逻辑。

 1 //本例主要采用两段式状态机:在异步复位信号的控制下,一段式状态机进入IDLE 2 //状态,q_sig4被复位,一旦sig1或者sig2有效,状态机进入WAIT状态,如果sig1和sig2同时有效,那么 3 //状态机进入DONE状态,如果sig4还有效,那么q_sig4置位,同时状态机进入IDLE状态。 4  5 module two_seg_fsm(clk,reset,sig1,sig2,sig3,q_sig4); 6 //数据声明部分 7 input clk,reset,sig1,sig2,sig3; 8  9 output reg       q_sig4;10 11 reg [1:0]    current_state, next_state;12 13 //参数声明14 parameter  IDLE       = 2‘b00;15 parameter  WAIT       = 2‘b01;16 parameter  DONE       = 2‘b10;17 18 //状态跳转程序设计19 always @(posedge clk or posedge reset)20  if(reset)21      current_state <= IDLE;22  else23      current_state <= next_state;24      25 //状态逻辑输出26 always @(current_state or sig1 or sig2 or sig3)27   begin28       case(current_state)29       IDLE: begin30                              if(sig1 || sig2)31                                   begin32                                       next_state = WAIT;33                                       q_sig4    = 1‘b0;34                                   end35                                  else36                                      begin37                                          next_state = IDLE;38                                          q_sig4     = 1‘b0;39                                    end40                           end41                   WAIT: begin42                             if(sig2 && sig3)43                                 begin44                                     next_state = DONE;45                                     q_sig4     = 1‘b0;46                               end47                             else48                                 begin49                                     next_state = WAIT;50                                     q_sig4     = 1‘b0;51                               end52                          end       53                                     54                   DONE:begin55                            if(sig3)56                                begin57                                    next_state = IDLE;58                                    q_sig4     = 1‘b1;59                                end60                            else61                                begin62                                    next_state = DONE;63                                    q_sig4     = 1‘b0;64                                end65                           end66                    67                 default: begin68                              next_state = IDLE;69                              q_sig4     = 0;70                            end71           endcase   72     73   end74 endmodule       

三段式状态机

  三段式状态机与两段式状态机的区别:两段式直接采用组合逻辑输出,而三段式则通过在组合逻辑后再增加一级寄存器来实现时序逻辑输出。这样做的好处是可以有效地滤去租个逻辑输出的毛刺,同时可以有效地进行时序计算与约束,另外对于总线形式的输出信号来说,容易使总线数据对其,从而减小总线数据间的偏移,减小接收端数据采样出错的频率。

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

 1 //本例主要采用三段式状态机:在异步复位信号的控制下,一段式状态机进入IDLE 2 //状态,q_sig4被复位,一旦sig1或者sig2有效,状态机进入WAIT状态,如果sig1和sig2同时有效,那么 3 //状态机进入DONE状态,如果sig4还有效,那么q_sig4置位,同时状态机进入IDLE状态。 4  5 module three_seg_fsm(clk,reset,sig1,sig2,sig3,q_sig4); 6 //数据声明部分 7 input clk,reset,sig1,sig2,sig3; 8  9 output reg       q_sig4;10 11 reg [1:0]    current_state, next_state;12 13 //参数声明14 parameter  IDLE       = 2‘b00;15 parameter  WAIT       = 2‘b01;16 parameter  DONE       = 2‘b10;17 18 //状态跳转程序设计19 always @(posedge clk or posedge reset)20  if(reset)21      current_state <= IDLE;22  else23      current_state <= next_state;24      25 //状态跳转输出26 always @(current_state or sig1 or sig2 or sig3)27   begin28       case(current_state)29       IDLE: begin30                              if(sig1 || sig2)31                                   begin32                                       next_state = WAIT;                                      33                                   end34                                  else35                                      begin36                                          next_state = IDLE;                                         37                                    end38                           end39                   WAIT: begin40                             if(sig2 && sig3)41                                 begin42                                     next_state = DONE;                                    43                               end44                             else45                                 begin46                                     next_state = WAIT;                                    47                               end48                          end       49                                     50                   DONE:begin51                            if(sig3)52                                begin53                                    next_state = IDLE;                                   54                                end55                            else56                                begin57                                    next_state = DONE;                                   58                                end59                           end60                    61                 default: begin62                              next_state = IDLE;                             63                            end64           endcase       65   end66   67   //逻辑输出68   always @(posedge clk or posedge reset)69     if(reset)70         q_sig4 <= 1‘b0;71     else72         begin73             case(next_state)74                 IDLE,75                 WAIT: q_sig4 <= 1‘b0;76                 DONE: q_sig4 <= 1‘b1;77                 default: q_sig4 <= 1‘b0;78           endcase79         end80         81 endmodule    
时间: 2024-10-12 22:37:32

FPGA 状态机设计的相关文章

08-FPGA状态机设计实例——小梅哥FPGA设计思想与验证方法视频教程配套文档

芯航线--普利斯队长精心奉献 ? 实验目的:1.学习状态机的相关概念 2.理解一段式.两段式以及三段式状态机的区别以及优缺点 实验平台:芯航线FPGA核心板 实验原理: 状态机全称是有限状态机(finite-state machine,缩写:FSM)是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型. 状态机分为摩尔(Moore)型有限状态机与米利(Mealy)型有限状态机.摩尔状态机输出是只由输入确定的有限状态机(不直接依赖于当前状态).米利有限状态机的输出不止与其输入有关还于它的

FPGA重要设计思想

FPGA重要设计思想 ? 1.速度和面积互换原则.以面积换速度可以实现很高的数据吞吐率,其实串/并转换.就是一种以面积换速度的思想 2.乒乓操作. 3.串/并转换的思想. 高速数据处理的重要技巧之一.这里我来举一个多相滤波器抽取的例子: 抽取之后,两路数据以二分频的速度进行处理即可 4.流水线设计(在fir滤波器中表现很突出,一个时钟输出一个数据) 流水线设计可以从某种程度上提高系统频率..前提是:设计可以分为若干步骤进行处理,而且整个数据处理的过程是单向的,即没有反馈或者逆运算.前一个步骤的输

简单实用的 Unity 状态机设计

状态机是非常常用的游戏编程模式,状态机的设计也有简单或复杂的区别. 我脑海里的状态机 状态机是什么样的?这是一个非常典型的状态机设计(随手写的): // 状态类 class State { // 保存的状态机引用 StateMachine _machine; // 构造状态,保存状态机引用 public State(StateMachine machine) { _machine = machine; } // 进入状态 public virtual void OnEnter() { } //

MiS603 开发板2.3 状态机设计

作者:MiS603开发团队 日期:20150911 公司:南京米联电子科技有限公司 论坛:www.osrc.cn 网址:www.milinker.com 网店:http://osrc.taobao.com EAT博客:http://blog.chinaaet.com/whilebreak 博客园:http://www.cnblogs.com/milinker/ 2.3 状态机设计 状态机是许多数字系统的核心部件,是一类重要的时序逻辑电路.通常包括三个部分:一是下一个状态的逻辑电路,二是存储状态机

FPGA基础设计(四):IIC协议

很多数字传感器.数字控制的芯片(DDS.串行ADC.串行DAC)都是通过IIC总线来和控制器通信的.不过IIC协议仍然是一种慢速的通信方式,标准IIC速率为100kbit/s,快速模式速率为400kbit/s.本文致力于讲述如何用计数器控制和分频时钟控制两种方式完成IIC的读写操作. IIC协议 ??IIC协议是一种多机通讯,由SDA数据线和SCL时钟线构成串行总线,所有的IIC设备都可以挂载到总线上,但每个设备都有唯一的设备读地址和设备写地址.在使用IIC作为数字接口的芯片datasheet中

使用Intel的FPGA电源设计FPGA 供电的常用反馈电阻阻值

使用Intel的FPGA电源设计FPGA 供电的常用反馈电阻阻值. 当前仅总结使用EN5339芯片的方案 Vout = Ra*0.6/Rb + 0.6 芯片手册推荐Ra取348K,则 3.3V时,取Rb为76.8K,则Vout = 3.31875V 2.5V时,取Rb为110K,则Vout=2.498182V 2.5V时,去Rb为107K,则Vout=2.551402V 1.1V时,取Rb为412K,则Vout=1.106796V 以上阻值都能买得到.具有实际投产意义. 原文地址:https:/

【转载】FPGA重要设计思想

1.速度和面积互换原则..以面积换速度可以实现很高的数据吞吐率,其实串/并转换.就是一种以面积换速度的思想 2.乒乓操作 3.串/并转换的思想. 高速数据处理的重要技巧之一.这里我来举一个多相滤波器抽取的例子: 抽取之后,两路数据以二分频的速度进行处理即可 4.流水线设计(在fir滤波器中表现很突出,一个时钟输出一个数据) 流水线设计可以从某种程度上提高系统频率..前提是:设计可以分为若干步骤进行处理,而且整个数据处理的过程是单向的,即没有反馈或者逆运算.前一个步骤的输出是下一个步骤的输入...

三段式状态机设计

1.三段式状态机与两段式状态机的区别 两段式直接采用组合逻辑输出,而三段式则通过在组合逻辑后再增加一级寄存器来实现时序逻辑输出.这样做的好处是可以有效地滤去租个逻辑输出的毛刺,同时可以有效地进行时序计算与约束,另外对于总线形式的输出信号来说,容易使总线数据对其,从而减小总线数据间的偏移,减小接收端数据采样出错的频率. 2.三段式状态机的基本格式 第一个always语句实现同步状态跳转: 第二个always语句实现组合逻辑: 第三个always语句实现同步输出. 3.实例程序讲解 1 //本例主要

fpga状态机详解

什么是状态机:状态机通过不同的状态迁移来完成特定的逻辑操作 状态机的分类:Moore型状态机和Mealy型状态机 Moore型:状态机的变化只与当前的状态有关 Mealy型:状态机的变化不仅与当前的状态有关,还与输入有关 如何创建状态机:状态机的创建可以分为一段式,两段式和三段式 一段式:主要是讲所有的状态变化以及导致的输出变化都写在了一个always快中. 两段式:将一些复位信号,clk信号单独写在一个always快中,其他的状态变化,输出值得变化写在一个always快中. 三段式:将一些复位