数字系统有两大类有限状态机(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 begin
21 if(reset)
22 begin
23 q_sig4 <= 0;
24 q_sm_state <= IDLE;
25 end
26 else
27 begin
28 case(q_sm_state)
29 IDLE: begin
30 if(sig1 || sig2)
31 begin
32 q_sm_state <= WAIT;
33 q_sig4 <= 1'b0;
34 end
35 else
36 begin
37 q_sm_state <= IDLE;
38 q_sig4 <= 1'b0;
39 end
40 end
41 WAIT: begin
42 if(sig2 && sig3)
43 begin
44 q_sm_state <= DONE;
45 q_sig4 <= 1'b0;
46 end
47 else
48 begin
49 q_sm_state <= WAIT;
50 q_sig4 <= 1'b0;
51 end
52 end
53
54 DONE:begin
55 if(sig3)
56 begin
57 q_sm_state <= IDLE;
58 q_sig4 <= 1'b1;
59 end
60 else
61 begin
62 q_sm_state <= DONE;
63 q_sig4 <= 1'b0;
64 end
65 end
66
67 default: begin
68 q_sm_state <= IDLE;
69 q_sig4 <= 0;
70 end
71 endcase
72 end
73 end
74 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 else
23 current_state <= next_state;
24
25 //状态逻辑输出
26 always @(current_state or sig1 or sig2 or sig3)
27 begin
28 case(current_state)
29 IDLE: begin
30 if(sig1 || sig2)
31 begin
32 next_state = WAIT;
33 q_sig4 = 1'b0;
34 end
35 else
36 begin
37 next_state = IDLE;
38 q_sig4 = 1'b0;
39 end
40 end
41 WAIT: begin
42 if(sig2 && sig3)
43 begin
44 next_state = DONE;
45 q_sig4 = 1'b0;
46 end
47 else
48 begin
49 next_state = WAIT;
50 q_sig4 = 1'b0;
51 end
52 end
53
54 DONE:begin
55 if(sig3)
56 begin
57 next_state = IDLE;
58 q_sig4 = 1'b1;
59 end
60 else
61 begin
62 next_state = DONE;
63 q_sig4 = 1'b0;
64 end
65 end
66
67 default: begin
68 next_state = IDLE;
69 q_sig4 = 0;
70 end
71 endcase
72
73 end
74 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 else
23 current_state <= next_state;
24
25 //状态跳转输出
26 always @(current_state or sig1 or sig2 or sig3)
27 begin
28 case(current_state)
29 IDLE: begin
30 if(sig1 || sig2)
31 begin
32 next_state = WAIT;
33 end
34 else
35 begin
36 next_state = IDLE;
37 end
38 end
39 WAIT: begin
40 if(sig2 && sig3)
41 begin
42 next_state = DONE;
43 end
44 else
45 begin
46 next_state = WAIT;
47 end
48 end
49
50 DONE:begin
51 if(sig3)
52 begin
53 next_state = IDLE;
54 end
55 else
56 begin
57 next_state = DONE;
58 end
59 end
60
61 default: begin
62 next_state = IDLE;
63 end
64 endcase
65 end
66
67 //逻辑输出
68 always @(posedge clk or posedge reset)
69 if(reset)
70 q_sig4 <= 1'b0;
71 else
72 begin
73 case(next_state)
74 IDLE,
75 WAIT: q_sig4 <= 1'b0;
76 DONE: q_sig4 <= 1'b1;
77 default: q_sig4 <= 1'b0;
78 endcase
79 end
80
81 endmodule

FPGA 状态机设计的更多相关文章

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

    芯航线--普利斯队长精心奉献   实验目的:1.学习状态机的相关概念 2.理解一段式.两段式以及三段式状态机的区别以及优缺点 实验平台:芯航线FPGA核心板 实验原理: 状态机全称是有限状态机(fin ...

  2. FPGA/CPLD设计思想与技巧

    本文讨论的四种常用FPGA/CPLD设计思想与技巧:乒乓操作.串并转换.流水线操作.数据接口同步化,都是FPGA/CPLD逻辑设计的内在规律的体现,合理地采用这些设计思想能在FPGA/CPLD设计工作 ...

  3. FPGA重要设计思想

    FPGA重要设计思想   1.速度和面积互换原则.以面积换速度可以实现很高的数据吞吐率,其实串/并转换.就是一种以面积换速度的思想 2.乒乓操作. 3.串/并转换的思想. 高速数据处理的重要技巧之一. ...

  4. 实验七 状态机设计ADC0809采样控制电路

    一.实验目的 学习用状态机实现A/D转换器ADC0809的采样控制电路. 二.实验内容 利用QuartusⅡ实现A/D转换器ADC0809的采样控制电路状态机设计:给出仿真波形.最后进行引脚锁定并进行 ...

  5. FPGA高级设计——时序分析和收敛(转)

    何谓静态时序分析(Static Timing Analysis,简称STA)? 它可以简单的定义为:设计者提出一些特定的时序要求(或者说是添加特定的时序约束),套用特定的时序模型,针对特定的电路进行分 ...

  6. 【转载】FPGA算法设计随笔

    FPGA设计算法依次需要完成MATLAB浮点仿真 MATLAB定点仿真 verilogHDL定点运算以及数据对比的流程.其中浮点到定点的转换尤为重要,需要在数据表示范围和精度之间做出权衡.另外掌握定点 ...

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

    很多数字传感器.数字控制的芯片(DDS.串行ADC.串行DAC)都是通过IIC总线来和控制器通信的.不过IIC协议仍然是一种慢速的通信方式,标准IIC速率为100kbit/s,快速模式速率为400kb ...

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

    使用Intel的FPGA电源设计FPGA 供电的常用反馈电阻阻值. 当前仅总结使用EN5339芯片的方案 Vout = Ra*0.6/Rb + 0.6 芯片手册推荐Ra取348K,则 3.3V时,取R ...

  9. 英特尔Intel® Arria® 10 FPGA加速器设计

    英特尔Intel Arria 10 FPGA加速器设计 Introducing the Intel Vision Accelerator Design with Intel Arria 10 FPGA ...

随机推荐

  1. xBIM 使用Linq 来优化查询

    目录 xBIM 应用与学习 (一) xBIM 应用与学习 (二) xBIM 基本的模型操作 xBIM 日志操作 XBIM 3D 墙壁案例 xBIM 格式之间转换 xBIM 使用Linq 来优化查询 x ...

  2. SAS SATA SSD基本介绍

    SATA硬盘采用新的设计结构,数据传输快,节省空间,相对于IDE硬盘具有很多优势: 1 .SATA硬盘比IDE硬盘传输速度高.目前SATA可以提供150MB/s的高峰传输速率.今后将达到300 MB/ ...

  3. LeetCode - 540. Single Element in a Sorted Array

    Given a sorted array consisting of only integers where every element appears twice except for one el ...

  4. shell编程之环境变量配置文件(4)

    1 source命令 修改了配置文件,并让它立刻生效,而不用重新登录 source 配置文件 或者 .配置文件 2 环境变量配置文件简介 PATH HISTSIZE PS1 HOSTNAME等环境变量 ...

  5. python学习:99乘法口诀

    #!/usr/bin/python   for i in xrange(1,10):     for j in xrange(1,i+1):         print "%s*%s=%s& ...

  6. ps通道抠章

    1. 打开图片 2. 使用椭圆形选框工具,选择章所在范围(ALT+SHITF+鼠标左键) 3.复制图层(CTRL+J)为图层1,隐藏背景 4.进入通道,选择对比度最大的通道,复制通道副本 5.反选(C ...

  7. [转]用JavaScript在浏览器中创建下载文件

    前端很多项目中,都有文件下载的需求,特别是JS生成文件内容,然后让浏览器执行下载操作(例如在线图片编辑.在线代码编辑.iPresst等. 但受限于浏览器,很多情况下我们都只能给出个链接,让用户点击打开 ...

  8. Java集合中的Map接口

    jdk1.8.0_144 Map是Java三种集合中的一种位于java.util包中,Map作为一个接口存在定义了这种数据结构的一些基础操作,它的最终实现类有很多:HashMap.TreeMap.So ...

  9. springBoot之配置文件的读取以及过滤器和拦截器的使用

    前言 在之前的学习springBoot中,成功的实现了Restful风格的基本服务.但是想将之前的工程作为一个项目来说,那些是仅仅不够的.可能还需要获取自定义的配置以及添加过滤器和拦截器.至于为什么将 ...

  10. mac清除某个端口的占用

    lsof -i:8080查找某个应用的pid kill  pid就可以了