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 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

转载于:https://www.cnblogs.com/lifan3a/articles/4582785.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/459287.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WCF 初识(一)

WCF的前世今生 在.NETFramework 2.0以及前版本中&#xff0c;微软发展了Web Service&#xff08;SOAP with HTTP communication&#xff09;&#xff0c;.NET Remoting&#xff08;TCP/HTTP/Pipeline communication&#xff09;以及基础的Winsock等通信支持。 由于各个通信方法…

C/C++关键字解析

2、C/C分别有多少个关键字&#xff1f; 假如别人问某一个关键字是否属于C/C&#xff0c;要能正确的答出来。 1&#xff09;由ANSI标准定义的C语言关键字共32个 auto double int struct break else long switch case enum register typedef char extern return union const flo…

Linux系统:软链接与硬链接的原理分析

1、相关概念 1、索引节点inode(index node)&#xff1a;inode就是索引节点&#xff0c;它用来存放档案及目录的基本信息&#xff0c;包含时间、档名、使用者及群组等。 inode 是 UNIX/Linux 操作系统中的一种数据结构&#xff0c;其本质是结构体它包含了与文件系统中各个文件相…

操作系统:虚拟页式存储管理(缺页中断、页面置换算法)

1、基本工作原理 1、基本工作原理 在进程开始运行之前&#xff0c;不是全部装入页面&#xff0c;而是装入一个或者零个页面&#xff0c;之后根据进程运行的需要&#xff0c;动态装入其他页面&#xff1b;当内存已满&#xff0c;而又需要装入 新的页面时&#xff0c;则根据某种…

小程序 长按api_高质量的微信小程序样式模板应该长什么样?

现在不懂技术的小白若想快速制作自己的小程序&#xff0c;一般是通过小程序模板来实现。通过在模板上添加自己的图片、文字、商品等等&#xff0c;可以很简单地生成一个小程序。不过要想把小程序做得好看&#xff0c;你得找高质量的小程序样式模板才行。那么高质量的微信小程序…

web安全测试-AppScan使用分享

这里主要分享如何使用AppScan对一大项目的部分功能进行安全扫描。 ------------------------------------------------------------------------ 其实&#xff0c;对于安全方面的测试知道的甚少。因为那公司每个月要求对产品进行安全扫描。掌握了一人点使用技巧&#xff0c;所…

ros 开源物体检测_ROS kinetic + Realsens D435i + ORK + LINEMOD 物体识别

1. ORKORK (Object Recognition Kitchen) 是 ROS 集成的物体识别库&#xff0c;当前 Kinetic 版本的 ROS 只集成了部分功能包的二进制安装文件&#xff0c;所以需通过源码编译安装。安装依赖库sudo apt-get installmeshlabsudo apt-get install libosmesa6-devsudo apt-get ins…

华为荣耀6 H60-L02/L12(联通版)救砖包【适用于无限重启】

本帖最后由 HOT米粒 于 2014-11-16 20:43 编辑 华为荣耀6 H60-L02/L12&#xff08;联通版&#xff09;救砖包【适用于无限重启】说明&#xff1a; 1、本工具包用于华为荣耀6 H60-L02&#xff08;联通版&#xff09;&#xff1b; 2、本工具适用于在Honor Logo 无限重启的童鞋恢复…

Mysql存储引擎中InnoDB与Myisam的区别

为什么80%的码农都做不了架构师&#xff1f;>>> 1. 事务处理 innodb 支持事务功能&#xff0c;myisam 不支持。 Myisam 的执行速度更快&#xff0c;性能更好。 2. select ,update ,insert ,delete 操作 MyISAM&#xff1a;如果执行大量的SELECT&#xff0c;MyISA…

一步步学习javascript基础篇(8):细说事件

终于学到事件了&#xff0c;不知道为何听到“事件”就有一种莫名的兴奋。可能是之前的那些知识点过于枯燥无味吧&#xff0c;说起事件感觉顿时高大上了。今天我们就来好好分析下这个高大上的东西。 可以说&#xff0c;如果没有事件我们的页面就只能阅读了。有了事件&#xff0c…

求1到n ,这n个整数的二进制表示比特1的个数(时间复杂度:O(n))

题目描述&#xff1a; 给定一个数字n&#xff0c;统计1&#xff5e;n之间的n个数字的二进制的1的个数 int Nums_Of_Bit_1(int num) { int* number new int[num]; int pow 1,before 1; int count 0; for(int i1; i<num; i){ if (i pow){ …

mysql支持cube_mysql聚合函数rollup和cube

一、with rollup&#xff1a;with rollup通常和group by语句一起使用&#xff0c;是根据维度在分组的结果集中进行聚合操作。——对group by的分组进行汇总。假设用户需要对N个纬度进行聚合查询操作&#xff0c;普通的groupby语句需要N个查询和N次group by操作。而rollup的有点…

域名详解

定义 是由一串用 “.” 分割的字符组成的Internet上某一台计算机或计算机组的名称&#xff0c;域名的本质是IP地址的一个映射&#xff0c;域名的目的是便于记忆和沟通的一组服务器的地址。 域名解析 域名解析的过程实际上是将域名还原为IP地址的过程 &#xff08;1&#xf…

navicat远程mysql_navicat 远程连接mysql

一、修改用户权限&#xff1a;需要手动增加可以远程访问数据库的用户。方法一(不推荐)、本地登入mysql&#xff0c;更改 "mysql" 数据库里的 "user" 表里的 "host" 项&#xff0c;将"localhost"改为"%"#mysql -u root -proo…

应用层协议:HTTP与HTTPS协议详解、二者的区别

http协议详解 1、HTTP协议&#xff1a;超文本传输协议 是一种分布式、合作式、多媒体信息系统服务&#xff0c;面向应用层的协议。是一种通用的&#xff0c;不分状态的协议。是一种请求/应答协议。1.1、HTTP/1.0和HTTP/1.1的比较 RFC 1945定义了HTTP/1.0版本。其中最著名的就…

[POJ 1330] Nearest Common Ancestors (倍增法)

题目同上篇&#xff0c;最近公共祖先。 因为没有清零tot&#xff0c;RE了好多次TAT 一定要初始化啊&#xff01;&#xff01; 1 #include<cstdio>2 #include<cstring>3 #include<queue>4 #include<iostream>5 using namespace std;6 int root,head[100…

javascript console 函数详解 js开发调试的利器 浏览:3201|更新:2014-05-30 09:27

引用地址&#xff1a;http://jingyan.baidu.com/article/e75aca855c6419142edac6c1.html一键约师傅百度师傅最快的到家服务&#xff0c;最优质的电脑清灰&#xff01;Console 是用于显示 JS和 DOM 对象信息的单独窗口。并且向 JS 中注入1个 console 对象&#xff0c;使用该对象…

链路层基本问题 : 封装成帧、差错检测、流量控制

一、封装成帧 1、MAC帧 类型字段 &#xff08;2个字节&#xff09;&#xff1a; 用来标志上一层使用的是什么协议&#xff0c;以便把收到的MAC帧的数据上交给上一层的这个协议。 数据字段 &#xff08;46-1500&#xff09;&#xff1a; 正式名称是MAC客户数据字段最小长度6…

mysql 5.7 super_MySQL 5.7 下的对super用户只读

在MySQL的主从复制场景下&#xff0c;遇上slave被意外写入数据是一件比较严重的问题&#xff0c;毕竟在一般情况下我们都希望slave仅用只读数据库&#xff0c;如果被意外写入数据可能会造成数据的不一致&#xff0c;从而导致主从的报错。因此在MySQL中可以通过设置变量参数read…

CSS 链接

2019独角兽企业重金招聘Python工程师标准>>> 不同的链接可以有不同的样式。 链接样式 链接的样式&#xff0c;可以用任何CSS属性&#xff08;如颜色&#xff0c;字体&#xff0c;背景等&#xff09;。 特别的链接&#xff0c;可以有不同的样式&#xff0c;这取决于他…