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-11-28 13:28:27

FPGA 状态机设计的相关文章

fpga-基于FPGA 图像处理设计

问题描述 基于FPGA 图像处理设计 现在FPGA 通过摄像头采集来的图像处理后主要通过什么来显示 解决方案 基于FPGA的图像处理(三)--图像融合 解决方案二: 一般是电脑pc,其他的液晶也可以

FPGA未来设计趋势:NI Single-Board RIO搭配全方位LabVIEW系统

NI发表NI Single-Board RIO GPIC,搭配全方位的NI LabVIEW系统设计工具组,不但可以大幅降低嵌入式系统设计成本.避免可能的相关风险,还能进一步针对智慧型电网电力转换系统提供标準RIO 架构.这项产品反映出 NI 研发部门针对新兴的数位能源转换系统,持续致力于投资并革新设计.测试与大型佈署作业.新系统提供一套标準的类比/数位 I/O 与 58 个 DSP 核心,全数内建于 FPGA 架构,可针对大部分的智慧型电网电力装置应用,满足特定的控制.I/O.效能与成本等需求,

基于FPGA的设计解决物联网实现的核心挑战

当前,物联网(IoT)已成为一个广受欢迎的名词,几乎每一个电子设备相互连接到互联网上加以使用,都被大家称为物联网.它包含了一个从智能家电.汽车到可穿戴设备相关的各种应用程序列表,并且这一列表仍在持续呈现爆炸式增长.但这种增长却恰恰带来了它的实战挑战,需要找到解决方案. 智能,连接的设备,和物联网的生态系统,他们正在帮助创造,致力于改变日常生活.对于个别的消费者,可能意味着使设备更有效和成本效益的日常任务,让他们更安全,甚至有助于确保他们过上更健康的生活.对于企业来说,物联网的承诺技术在自动化.能

asic-ASIC设计在多颗FPGA上的分割问题

问题描述 ASIC设计在多颗FPGA上的分割问题 谁有用TDM和LVDS来实现多颗FPGA的设计分割的经验?有的话请联系我.

了解LabVIEW FPGA和软件设计射频仪器的优势所在

概览 无线设备的数量.通信标准的多样性,以及调制方案的复杂度,每一年都在不断增加.而随着每一代新技术的诞生,由于使用传统技术测试无线设备,需要大量更复杂的测试设备,其成本也在不断提高.    使用虚拟(软件)仪器与模块化I/O相结合是一种最小化硬件成本并减少测试时间的方法.软件设计仪器的新方法使得射频测试工程师无需凭借自定义或特殊标准的仪器,就能以多个数量级的幅度减少测试时间.   阅读此文可以帮助您了解如何使用NI LabVIEW FPGA来设计和自定义您的射频仪器,以及通过软件设计的仪器能为

FPGA研究领域奠基者,北京大学高能效计算与应用中心主任丛京生

由中国计算机学会(CCF)主办,福州市人民政府.福州大学承办的2017中国计算机大会(CNCC2017)将于10月26-28日在福州举行.已经注册参会的朋友们可以现场一睹大牛们的精彩报告!10月15日前线上注册缴费截止,但未注册缴费的也不要着急,您可以选择现场注册参会! 延续2016年大会的顶级嘉宾阵容,CNCC 2017 将会迎来更多国内外知名专家学者,大会特邀阵容如下: 菲尔兹奖获得者丘成桐,中国科学院院士梅宏,微软全球执行副总裁沈向洋,美国国家工程院院士丛京生,CCF会士.中科院计算所研究

FPGA 哪家强?看 2016 年度市场大趋势

FPGA 到底有多火? 先来带大家看一组数据: 2016 年半导体市场的整体增长率为 1.5%,相比之下,FPGA 市场增长率为 6%. 随着深度学习的崛起,FPGA 市场再次风起云涌.2015 年掀起了收购狂潮,2016 年至今的市场格局有没有随之变化?近日雷锋网(公众号:雷锋网)获得消息,著名半导体行业观察家 Paul Dillien 对 2016 年的 FPGA 市场趋势做了总结.并评出"2016 年度最佳 FPGA",请看下文. Paul Dillien:不需要计算,我也知道 

【FPGA学习】Verilog之加法器

         在fpga工程应用设计中,随处可见加法器,乘法器等等.现在将一些常用模块和心得体会先记录下来,以便日后使用. 一位半加器: module halfadder(cout,sum,a,b);          outputcout,sum; //不申明,默认是wire变量          input  a,b;          assign{cout,sum}=a+b;//cout为进位,sum为和 endmodule   一位全加器: module fulladder(a,b

机器数据分析就地安全监视

提高网络物理安全和增加安全系统的努力已形成一个不断发展的行业,该行业致力于超越这一挑战.闭路电视模拟摄像机正快速被更高清晰度.功能丰富的数字摄像机所取代,以便实现基于图像的安全系统.相比之下,数字摄像机更灵活.更智能,能够与云服务和数据分析更紧密地集成在一起.本文将介绍就地安全监视,它与基于云的数据分析相结合,使得在没有电源或网络基础架构的区域快速部署监视成为了可能. 在不久的将来,我们可能依赖于快速演变的 "机器到机器" 基础架构,它的高级感知能力与人类的能力不相上下(有时甚至超越了