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
FPGA 状态机设计的更多相关文章
- 08-FPGA状态机设计实例——小梅哥FPGA设计思想与验证方法视频教程配套文档
芯航线--普利斯队长精心奉献 实验目的:1.学习状态机的相关概念 2.理解一段式.两段式以及三段式状态机的区别以及优缺点 实验平台:芯航线FPGA核心板 实验原理: 状态机全称是有限状态机(fin ...
- FPGA/CPLD设计思想与技巧
本文讨论的四种常用FPGA/CPLD设计思想与技巧:乒乓操作.串并转换.流水线操作.数据接口同步化,都是FPGA/CPLD逻辑设计的内在规律的体现,合理地采用这些设计思想能在FPGA/CPLD设计工作 ...
- FPGA重要设计思想
FPGA重要设计思想 1.速度和面积互换原则.以面积换速度可以实现很高的数据吞吐率,其实串/并转换.就是一种以面积换速度的思想 2.乒乓操作. 3.串/并转换的思想. 高速数据处理的重要技巧之一. ...
- 实验七 状态机设计ADC0809采样控制电路
一.实验目的 学习用状态机实现A/D转换器ADC0809的采样控制电路. 二.实验内容 利用QuartusⅡ实现A/D转换器ADC0809的采样控制电路状态机设计:给出仿真波形.最后进行引脚锁定并进行 ...
- FPGA高级设计——时序分析和收敛(转)
何谓静态时序分析(Static Timing Analysis,简称STA)? 它可以简单的定义为:设计者提出一些特定的时序要求(或者说是添加特定的时序约束),套用特定的时序模型,针对特定的电路进行分 ...
- 【转载】FPGA算法设计随笔
FPGA设计算法依次需要完成MATLAB浮点仿真 MATLAB定点仿真 verilogHDL定点运算以及数据对比的流程.其中浮点到定点的转换尤为重要,需要在数据表示范围和精度之间做出权衡.另外掌握定点 ...
- FPGA基础设计(四):IIC协议
很多数字传感器.数字控制的芯片(DDS.串行ADC.串行DAC)都是通过IIC总线来和控制器通信的.不过IIC协议仍然是一种慢速的通信方式,标准IIC速率为100kbit/s,快速模式速率为400kb ...
- 使用Intel的FPGA电源设计FPGA 供电的常用反馈电阻阻值
使用Intel的FPGA电源设计FPGA 供电的常用反馈电阻阻值. 当前仅总结使用EN5339芯片的方案 Vout = Ra*0.6/Rb + 0.6 芯片手册推荐Ra取348K,则 3.3V时,取R ...
- 英特尔Intel® Arria® 10 FPGA加速器设计
英特尔Intel Arria 10 FPGA加速器设计 Introducing the Intel Vision Accelerator Design with Intel Arria 10 FPGA ...
随机推荐
- root cause org.apache.ibatis.ognl.OgnlException: source is null for getProperty(null, "XXX")
在执行一个查询语句的时候,mybatis报错:root cause org.apache.ibatis.ognl.OgnlException: source is null for getProper ...
- JMeter监控服务器CPU、内存的方法
jmeter也可以像loadrunner一样监控服务器CPU.内存等性能参数,不过需要安装一些插件 一.首先下载监控服务器的插件 链接:https://pan.baidu.com/s/1o9Zuw ...
- Linux根据UUID自动挂载磁盘分区
一般服务器都有多个硬盘分区,在重启后,这些分区的逻辑位置加载时可能会发生变动,如果使用传统的设备名称(例如:/dev/sda)方式挂载磁盘,就可能因为磁盘顺序变化而造成混乱. Linux环境中每个Bl ...
- java多线程之内存可见性-synchronized、volatile
1.JMM:Java Memory Model(Java内存模型) 关于synchronized的两条规定: 1.线程解锁前,必须把共享变量的最新值刷新到主内存中 2.线程加锁时,将清空工作内存中共享 ...
- BZOJ 4537: [Hnoi2016]最小公倍数 [偏序关系 分块]
4537: [Hnoi2016]最小公倍数 题意:一张边权无向图,多组询问u和v之间有没有一条a最大为a',b最大为b'的路径(不一定是简单路径) 首先想到暴力做法,题目要求就是判断u和v连通,并查集 ...
- BZOJ 3990: [SDOI2015]排序 [搜索]
3990: [SDOI2015]排序 题意:\(2^n\)的一个排列,给你n种操作,第i种把每\(2^{i-1}\)个数看成一段,交换任意两段.问是这个序列有序的操作方案数,两个操作序列不同,当且仅当 ...
- jq实现碰到边缘反弹的动画
先上效果图: 录出来有点卡顿的赶脚,实际上还是挺顺畅的. 1.HTML: <div class="box"></div> 2.CSS: body{ back ...
- 【NOIP2015】运输计划
[NOIP2015]运输计划 标签: 树上差分 LCA 二分答案 Description 公元 2044 年,人类进入了宇宙纪元. L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星 ...
- 基于Parallax设计HTML视差效果
年关将至,给大家拜年. 最近时间充裕了一点,给大家介绍一个比较有意思的控件:Parallax.它可以用来实现鼠标移动时,页面上的元素也做偏移的视差效果.在一些有表现层次,布局空旷的页面上,用来做Hea ...
- Postfix+dovecot搭建简单邮箱服务器
实验环境: (1)修改主机名:hostnamectl set-hostname mail.meilintong.com 退出,重新登陆 (2)关闭selinux (3)关闭防火墙 1.安装postfi ...