FPGA状态机详解

在进行FPGA设计时,状态机是一个经常需要用到的设计手段,究竟什么是状态机?一段式和三段式状态机又有何区别,分别如何实现?本篇文章会进行详细的介绍,帮助大家迅速掌握一段式与三段式状态机的设计


状态机介绍

状态机可归纳为4个要素,即现态、条件、动作、次态。

现态:是指当前所处的状态

条件:又称为"事件",当一个条件被满足,将会触发一个动作,或者执行一次状态的迁移。

动作:条件满足后执行的动作。动作执行完毕后,可以迁移到新的状态,也可以仍旧保持原状态。动作不是必需的,当条件满足后,也可以不执行任何动作,直接迁移到新状态。

次态:条件满足后要迁往的新状态。"次态"是相对于"现态"而言的,"次态"一旦被激活,就转变成新的"现态"了。

状态机分类

状态机一般分为三种类型:
  1、Moore型状态机:下一状态只由当前状态决定
  2、Mealy 型状态机:下一状态不但与当前状态有关,还与当前输入值有关
  3、混合型状态机

A.Mealy状态机:时序逻辑的输出不但取决于状态还取决于输入,如图所示。

B.Moore状态机:时序逻辑的输出仅仅取决于上一时刻的状态,而与当前时刻的输入无关,如图所示。

在实际设计中,Mealy类型的状态机是用的最多的,Moore类型虽然清晰明了,但是状态太多,不适合大型状态机的设计。

之所以Moore状态多,我们可以举个例子:比如要判断一个数是不是4'b1100

用Moore状态机:

状态内容输出
S110
S2110
S31100
S411001

输出只和状态有关,而和输入无关(因为根本就没有给出输入情况),这种情况下我们需要4个状态

用Mealy状态机:

状态内容输入输出
S110/110/11
S2110/1110/111
S31100/11100/1101

输出不仅和状态有关,也和输入的数有关,在这种情况下我们需要3个状态

可见 用Mealy状态机可以减少状态的个数

状态机设计步骤

状态机的设计步骤主要分为以下4个步骤:

A.逻辑抽象:得出状态转换图:就是把给出的一个实际问题表示为时序逻辑函数。可以用状态转换表来描述,也可以用状态转换图来描述。

B.状态化简:如果在状态转换图中出现这样两个状态:它们在相同的输入下转换到同一个状态中,并得到相同的输出,或称它们为等价状态。显然等价状态是重复的,可以合并为一个(电路的状态越少,存储电路也就越简单)。

C.状态分配:状态分配又称状态编码。通常有很多编码方法,编码方案选择得当,设计的电路简单,反之,选得不好,则设计的电路就会复杂许多

D.用逻辑描述语言进行描述

  Ps编码方式常见的有

二进制码binary_code、格雷码gray_code 、独热码one_hot_code

1.binary_code

二进制码,编码按照二进制数进行递加,容易产生亚稳态,代码不稳定

2. gray_code

在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(Gray Code),另外由于最大数与最小数之间也仅一位数不同,即“首尾相连”,因此又称循环码或反射码。Gray码不容易产生亚稳态。

3. one_hot_code

独热编码即 One-Hot 编码,又称一位有效编码,其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候,其中只有一位有效。虽然使用较多的触发器,但由于状态译码简单,可减少组合逻辑且速度较快, 这种编码方式还易于修改,增加状态或改变状态转换条件都可以在不影响状态机的其它部分的情况下很方便地实现。另外,它的速度独立于状态数量。与之相比,压缩状态编码在状态增加时速度会明显下降。独热码值每个码元值只有一位是'1',其他位都是'0'

eg:分别用3种编码方式实现4个编码

        独热         格雷        二进制

       4'b0001       2'b00      2’b00

       4'b0010       2'b01      2’b01

       4'b0100       2'b11      2’b10

       4'b1000       2'b10      2’b11

状态机的描述方式

状态机的描述方式有很多种,但是最常用的主要有3中,分别是一段式(always)、两段式(2 always)、三段式(3 always)

A.单always块把组合逻辑和时序逻辑用同一个时序always块描述,其输出是寄存器输出,无毛刺;但是这种方式可能会产生多余的触发器,代码难于修改和调试,应该尽量避免使用。

B.双always块大多用于描述Mealy状态机和组合输出的Moore状态机。

时序always块描述当前状态逻辑,组合逻辑always块描述次态逻辑并给输出赋值。

这种方式结构清晰,综合后的面积和时间性能好。但组合逻辑输出往往会有毛刺,当输出向量作为时钟信号时,这些毛刺会对电路产生致命的影响。

C.三always块大多用于同步Mealy状态机。

两个时序always块分别用来描述现态逻辑和对输出赋值,组合always块用于产生下一状态。

时序电路的状态是一个状态变量集合,这些状态变量在任意时刻的值都包含了为确定电路的未来行为而必需考虑的所有历史信息。

这种方式的状态机也是寄存器输出,输出无毛刺,并且代码比单always块清晰易读,但是面积大于双always块。随着芯片资源和速度的提高,目前这种方式得到了广泛应用。

一段式状态机

在一个always块下完成:条件判断+本状态动作+跳转下个状态

eg 用状态机实现流水灯: 

always @(posedge clk_25m)begin
11.	     if(reset)begin
12.	      led_out<=4'b0000;  //初始状态led灯全亮,检验灯是否完好
13.	      state<=3'd0;       //初始状态state=0
14.	     end
15.	     else begin
16.	      case(state)           //state作为敏感信号
17.	       3'd0:begin           //state=0状态
18.	        if(time_en)begin   //条件T满足时
19.	         led_out<=4'b0111; //灯1点亮
20.	         state<=3'd1;      //state进入1状态
21.	        end
22.	        else begin         //否则state还在0状态
23.	         led_out<=4'b0000;
24.	         state<=3'd0;
25.	        end
26.	       end
27.	       3'd1:begin                //state=1状态
28.	        if(time_en)begin        //若条件T满足
29.	         led_out<=4'b1011;      //灯2点亮
30.	         state<=3'd2;           //state进入2状态
31.	        end
32.	        else begin
33.	         led_out<=4'b0111;         //否则state还在1状态
34.	         state<=3'd1;
35.	        end
36.	       end
37.	       3'd2:begin
38.	        if(time_en)begin
39.	         led_out<=4'b1101;
40.	         state<=3'd3;
41.	        end
42.	        else begin
43.	         led_out<=4'b1011;
44.	         state<=3'd2;
45.	        end
46.	       end
47.	       3'd3:begin
48.	        if(time_en)begin
49.	         led_out<=4'b1110;
50.	         state<=3'd4;
51.	        end
52.	        else begin
53.	         led_out<=4'b1101;
54.	         state<=3'd3;
55.	        end
56.	       end
57.	       3'd4:begin
58.	        if(time_en)begin
59.	         led_out<=4'b0111;
60.	         state<=3'd1;
61.	        end
62.	        else begin
63.	         led_out<=4'b1110;
64.	         state<=3'd4;
65.	        end
66.	       end
67.	       default:begin          //2^3=8,state有没有用到的数,需要写default
68.	        state<=3'd0;          //让state回到初始值
69.	        led_out<=4'b0000;
70.	       end
71.	      endcase
72.	     end
73.	    end

三段式状态机

第一段:时序逻辑

将下个将发生的状态赋值给当前状态,将next_state赋值给current_state

第二段:组合逻辑

      根据current_state对next_state进行操作, 第二段只根据判断条件对 next_state 赋值

注意:

1组合逻辑的赋值号是=而不是<=

2

3是根据当前状态进行判断:

4只对下一个状态赋值:

5若出错则回到初始状态:

第三段:时序逻辑

对输出结果进行操作,根据current_state 对被操作的变量进行赋值

注意:

  1. 是根据当前状态判断:
  2. 只对输出结果赋值:

  1. 记得写default:

1.	module water_led(
2.	input clk,
3.	input reset,
4.	input time_en,
5.	output reg [3:0]led_out
6.	    );
7.	    
8.	    reg [2:0]current_state;//定义当前状态
9.	    reg [2:0]next_state;   //定义下一个状态
10.	    
11.	    parameter IDLE=3'd0;  //定义初始状态IDLE
12.	    parameter LED1=3'd1;  //定义第一盏灯
13.	    parameter LED2=3'd2;
14.	    parameter LED3=3'd3;
15.	    parameter LED4=3'd4;
16.	    //第一段:将下个将发生的状态赋值给当前状态(时序逻辑)
17.	 always@(posedge clk)begin
18.	  current_state<=next_state;
19.	 end
20.	 //第二段:根据current_state对next_state进行操作(组合逻辑)
21.	 always @(*)begin // (*)在组合逻辑中代表任何一个变量
22.	  if(reset)begin
23.	   next_state=IDLE; //组合逻辑变量的赋值号用=
24.	  end
25.	  else begin
26.	   case (current_state) //当前状态
27.	    IDLE:begin
28.	     if(time_en)begin
29.	      next_state=LED1; //只对state进行操作
30.	     end
31.	     else begin
32.	      next_state=IDLE;
33.	     end
34.	    end
35.	    LED1:begin
36.	     if(time_en)begin
37.	      next_state=LED2;
38.	     end
39.	     else begin
40.	      next_state=LED1;
41.	     end
42.	    end
43.	    LED2:begin
44.	     if(time_en)begin
45.	      next_state=LED3;
46.	     end
47.	     else begin
48.	      next_state=LED2;
49.	     end
50.	    end
51.	    LED3:begin
52.	     if(time_en)begin
53.	      next_state=LED4;
54.	     end
55.	     else begin
56.	      next_state=LED3;
57.	     end
58.	    end
59.	    LED4:begin
60.	     if(time_en)begin
61.	      next_state=LED1;
62.	     end
63.	     else begin
64.	      next_state=LED4;
65.	     end
66.	    end
67.	    default:begin
68.	     next_state=IDLE;
69.	    end
70.	   endcase
71.	  end
72.	 end
73.	 //第三段:对输出结果进行操作,根据current_state 对被操作的变量进行赋值(时序逻辑)
74.	 always @(posedge clk)begin
75.	  if(reset)begin
76.	   led_out<=4'b0000;
77.	  end
78.	  else begin
79.	   case (current_state) //当前状态
80.	    IDLE:begin
81.	     if(time_en)begin
82.	      led_out<=4'b0111;  //只对输出变量操作
83.	     end
84.	     else begin
85.	      led_out<=4'b0000;
86.	     end
87.	    end
88.	    LED1:begin
89.	     if(time_en)begin
90.	      led_out<=4'b1011;
91.	     end
92.	     else begin
93.	      led_out<=4'b0111;
94.	     end
95.	    end
96.	    LED2:begin
97.	     if(time_en)begin
98.	      led_out<=4'b1101;
99.	     end
100.	     else begin
101.	      led_out<=4'b1011;
102.	     end
103.	    end
104.	    LED3:begin
105.	     if(time_en)begin
106.	      led_out<=4'b1110;
107.	     end
108.	     else begin
109.	      led_out<=4'b1101;
110.	     end
111.	    end
112.	    LED4:begin
113.	     if(time_en)begin
114.	      led_out<=4'b0111;
115.	     end
116.	     else begin
117.	      led_out<=4'b1110;
118.	     end
119.	    end
120.	    default:begin
121.	     led_out<=4'b0000;
122.	    end
123.	   endcase
124.	  end
125.	 end
126.	endmodule

三段式状态机与一段式区别与联系

1三段式是一段式的三个部分,就是把一段式的三个关系分别独立出来

2.三段式要定义两个 state 变量;一个是 current_state(当前状态);一个是 next_state(下一个状态)

3.三段式中稳定性强,适用于时钟频率很高的程序中,并且一个时钟下只对一个变量进行操作。一段式中整个程序都在一个时钟下操作所以容易出错。

4. 三段式可以把稳定区域的current_state赋值给next_state


本篇文章介绍了状态机原理,Mealy和Moore状态机分类,一段式状态机与三段式状态机写法,并用流水灯举例分析了一段式状态机和三段式状态机的异同

创作不易,点赞支持!thank

  • 32
    点赞
  • 92
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
课程简介 该课程是FPGA在嵌入式系统领域的应用,以XILINX的MICROBLAZE 32位软核处理器为载体,介绍嵌入式系统中软件和硬件协同设计和协同调试的方法,诠释All Programmable在嵌入式系统设计中的重要意义。 分享到: 课程目录 课程讨论 第35讲:Vivado高级设计技术 5 634 第34讲:基于HLS实现矩阵相乘 5 603 第33讲:基于HLS实现时序逻辑 5 288 第32讲:在Vivado中看逻辑门的内部逻辑结构 5 857 第31讲:从组合逻辑、时序逻辑和矩阵相乘看基于HLS的数字系统实现 5 228 第30讲:HLS关键优化策略 5 304 第29讲:高级综合工具调度及C代码的关键属性 5 271 第28讲:高级综合工具Vivado应用 5 426 第27讲:基于MATLAB的模型设计 5 306 第26讲:软硬件协同调试及构建中断系统 5 350 第25讲:软硬件协同调试并分析系统 5 212 第24讲:用在线逻辑分析仪对系统进行硬件调试 5 274 第23讲:软硬件协同调试方法 5 263 第22讲:如何修改模版并在系统中运行 5 294 第21讲:详细分析LED IP模版 5 263 第20讲:手把手教如何创建IP核 5 358 第19讲:实验:打通Micorblaze和SRAM的通道2 5 233 第18讲:实验:打通Micorblaze和SRAM的通道1 5 293 第17讲:GPIO实验详细分析 5 443 第16讲:实验:手把手教AXI GPIO核仿真 5 614 第15讲:MicroBlaze处理器结构及使用BSB建立的最小系统结构 5 486 第14讲:3位8进制计数器实现详解 5 268 第13讲:数字逻辑中的关键问题——有限状态 5 303 第12讲:从PlanAhead及ISE综合实现中详细分析FPGA结构 5 422 第11讲:详解FPGA芯片的内部结构之查找表(LUT) 5 423 第10讲:用ISE设计工具看清FPGA内部结构 5 513 第9讲:AMBA AX14协议规范 5 535 第8讲:AMBA AHB协议规范 5 398 第7讲:AMBA APB协议规范 5 399 第6讲:AMBA协议规范概述 5 559 第5讲:Zynq平台设计学方法II 5 1028 第4讲:Xilinx可扩展处理平台导论(Zynq-7000)及设计方法 805 第3讲:Xilinx可编程SoC设计流程及开发工具概述 716 第2讲:All Programmable(全可编程)平台SoC特点 599 第1讲:可编程SoC设计导论——内容简介
001、VB串口通讯视频教程源码41个 002、Visual Basic串口通信工程开发实例导航随书源码7个 003、Visual Basic串口通信与测控应用技术实战详解 源代码(15个全) 004、GE PLC串口通讯,VB编制,读取内存单元 005、PC与51单片之间的串口通讯,VB编的,分PC和单片两部分 006、VB6的串口通信程序,还有crc校验 007、VB Modbus RTU源码,其中协议部分已生成DLL,可直接调用 008、VB.net开发的串口调试程序 009、VB.net实现串口编程,希望大家有用 010、VB版串口调试程序,包含VB源码及安装文件,适合调试串口 011、VB编程RS232串口控制DA数模转换 012、VB编程实现的串口调试工具源码 013、VB编写的RS232串口通信测试程序,以txt格式接受,可定义发送字符 014、VB编写的SouthStar串口测试与51串口烧写器V1.0版 015、VB编写的串口调试助手1.0的源码 016、VB编写的串口短信发送程序,需要数据线支持 017、VB编写的串口通信程序,实现多通信 018、VB编写的串口通信程序,主要用于上位与下位间的通信 019、VB编写的串口通信程序界面参考网上的程序较简单 020、VB编写的串口通讯界面,主要面向51单片的串口通信 021、VB编写的单片和PC串口通信的调试程序 022、VB编写的仿真实电子琴操作界面,包含与FPGA串口通信的功能 023、VB串口API通讯,附带BAS文件全部源码,实现与饭卡读卡器通讯 024、VB串口编程,关于上位的应用,特别适合初级学习VB的学员 025、VB串口编程调试精灵源码 026、VB串口编程实现完整的多费率电表读数软件 027、VB串口程序,,是一个串口使用例程,对初学者有用,特别是工控类的 028、VB串口传输文本,实现2台PC间的通信,类似简单的聊天工具 029、VB串口的一个电子称的项目 030、VB串口调试程序,用于通过串口控制松下空调测试 031、VB串口调试程序及源码 032、VB串口调试软件源代码,可以参考修改为其它通讯程序 033、VB串口调试软件源文件 034、VB串口控制步进电程序完整源码 035、VB串口通信 6路10位AD转换数据采集源程序 036、VB串口通信,API串口通信模块源码 037、VB串口通信,适用简单,适合初学者 038、VB串口通信操作界面,进行数据采集,画实时曲线 039、VB串口通信程序,可以读取串口并显示保存数据,且能显示数据曲线 040、VB串口通信的源码,学习的好资料 041、VB串口通信调试器的源码程序 042、VB串口通信设计视频演示源码 043、VB串口通信示例 044、VB串口通信数据源码 045、VB串口通信之串口接收程序 046、VB串口通讯测试源代码,有文本和图形两种端口数据观察方式 047、VB串口通讯程序,用来跟单片通讯 048、VB串口通讯代码(部分) 049、VB串口通讯的参考源程序 050、VB串口通讯实例 高精度电压表(24bit) VB源程序 051、vb串口通讯示例 052、VB串口与伺服电DSP2407通讯完整代码源程序 053、VB串口源码,动力电池检测数据采集,内含电导巡检模块通讯报文,可,读写,保存,备份数据 054、VB串口字节通信程序,包括:1字节发送子程序,n字节接收子程序 055、VB串行口通信测试示例 056、VB串行通信试验程序 057、VB的MODEM通信源代码,智能化水电远端数据读取系统 058、VB的串口源程序,包括串口的配置界面,接收功能和发送功能 059、VB访问串口,并读取电子秤上显示的数据 060、VB和西门子S7-300 PLC串口通讯程序能实现读写功能 061、VB检测串口工作状态 062、VB简单的串口短信收发功能,使用短信猫测试通过 063、VB开发串口通信,关于生物医学工程专业的血氧饱和度的设计 064、VB开发串口通信软件,利用按钮控件控制高清晰数字展示台 065、VB开发的RS232串口图像处理器驱动(摄像头驱动) 066、VB开发的串口通信源码 067、VB开发的串口与三菱FX PLC通讯源码 068、VB控制串口232通讯,对飞利浦M1卡内数据进行处理,支持密码修改等 069、VB利用Mscomm控件编写的通讯终端,可做串口通讯编程参考示例 070、VB平台单片与PC串口通信的PC端程序。小巧易用,功能丰富 071、VB嵌入式串口通讯波形分析显示软件 072、VB实现串口调试LED信息显示屏设备主要代码 073、VB实现串口调试工具的完整源码 074、vb实现串口通信 文件传送系统,用vb以及mscomm控件实现 075、VB实现串口通信,发送命令从而接收相应数据 076、VB使用mscom控件实现PC与单片串口通信 077、VB通过COM串口读取条形码设备 078、VB通过串口控制单片读写24C02源代码 079、VB通讯程序,连接串口可在电脑显示来电号码 080、VB下的串口发短信程序,可选择端口,设置短信中心号码 081、VB写的串口通信,发送和接收实例 082、VB写的串口通信分析程序源码 083、VB写的串口通讯,通过串口对单片进行控制 084、VB写的串口通讯软件,简单易学,适合初学者 085、VB写的通过串口与考勤连接通讯的程序 086、vb用控件的写的串口程序,是vb的经典之作 087、VB与USB转串口的通讯完整程序,有详细说明,不需要安装驱动 088、vb与串口通信的关于回路测试的小程序很实用 089、vb语言开发的串口通信,可实现拨号传送文件等 090、VB中串口事件处理函数的示例 091、VB中的串口通讯,串口通讯作为一种古老而又灵活的通讯方式,被广泛地应用 092、VB自动枚举系统串口加摄象头图象采集,坐标系变换 093、Visual Basic2005与自动化系统监控(串并行控制)光盘
FPGA状态项目是指使用FPGA(Field-Programmable Gate Array)来实现状态功能的项目。状态状态寄存器和组合逻辑电路构成,能够根据控制信号按照预先设定的状态进行状态转移,是协调相关信号动作、完成特定操作的控制中心。在FPGA状态项目中,我们可以使用Verilog编程语言来描述和实现状态的功能。 根据提供的引用内容,有限状态主要分为两大类:Moore状态和Mealy状态。Moore状态的输出只与状态有关而与输入无关,而Mealy状态的输出不仅与状态有关而且与输入有关。在FPGA状态项目中,我们可以根据具体需求选择适合的状态类型。 在设计FPGA状态项目时,我们需要进行以下步骤: 1. 确定项目需求和功能描述,例如启动准备状态、启动测试、停止测试、查询测试结果、显示测试结果等。 2. 根据需求和功能描述,设计状态状态转移图,即状态图。状态图可以用来描述状态之间的转移关系和相应的输入输出条件。 3. 使用Verilog编程语言来实现状态的功能。根据状态图,我们可以定义状态寄存器和组合逻辑电路,以及相应的输入和输出信号。 4. 进行仿真和验证,确保状态的功能和性能符合预期。 5. 将Verilog代码综合到FPGA芯片中,并进行实际硬件验证和测试。 总结起来,FPGA状态项目是通过使用FPGA来实现状态功能的项目。在项目中,我们可以使用Verilog编程语言来描述和实现状态的功能,并根据具体需求选择适合的状态类型。通过仿真和验证,我们可以确保状态的功能和性能符合预期。最后,将Verilog代码综合到FPGA芯片中,进行实际硬件验证和测试。 #### 引用[.reference_title] - *1* *2* [FPGA状态](https://blog.csdn.net/weixin_46129506/article/details/124596358)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [FPGA状态简单测试](https://blog.csdn.net/m0_49297422/article/details/124569044)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值