FPGA开发之状态机设计

news/2024/11/15 4:47:01/
状态机是许多数字系统的核心部件,是一类重要的时序逻辑电路。通常包括三个部分:
一是下一个状态的逻辑电路,
二是存储状态机当前状态的时序逻辑电路,
三是输出组合逻辑电路。
通常,状态机的状态数量有限,称为有限状态机(FSM)。由于状态机所有触发器的时钟由同一脉冲边沿触发,故也称之为同步状态机。根据状态机的输出信号是否与电路的输入有关分为 Mealy 型状态机和 Moore 型状态机。电路的输出信号不仅与电路当前状态有关,还与电路的输入有关,称为 Mealy 型状态机,即次态=f( 现状,输入 ) ,输出 =f (现状,输入); 而电路的输出仅仅与各触发器的状态,不受电路输入信号影响或无输入,称为 Moore 型状态机, 次态 =f( 现状,输 入) ,输出 =f (现状)。其标准模型如下所示:
状态机的状态转移图,通常也可根据输入和内部条件画出。一般来说,状态机的设计包含下列设计步骤:
• 根据需求和设计原则,确定是 Moore 型还是 Mealy 型状态机;
• 分析状态机的所有状态,对每一状态选择合适的编码方式,进行编码;
• 根据状态转移关系和输出绘出状态转移图;
• 构建合适的状态机结构,对状态机进行硬件描述。
状态机的描述通常有三种方法,称为一段式状态机,二段式状态机和三段式状态机。状态机的描述通常包含以下四部分:
1)利用参数定义语句 parameter 描述状态机各个状态名称,即状态编码。状态编码通常有很多方法包含自然二进制编码,One-hot 编码,格雷编码码等;
2)用时序的 always 块描述状态触发器实现状态存储;
3)使用敏感表和 case 语句(也采用 if-else 等价语句)描述状态转换逻辑;
4)描述状态机的输出逻辑。
下面根据状态机的三种方法,来比较各种方法的优劣。
1、一段式状态机
module detect_1(
input clk_i,
input rst_n_i,
output out_o
);
reg out_r;
// 状态声明和状态编码
reg [1:0] state;
parameter [1:0] S0=2'b00;
parameter [1:0] S1=2'b01;
parameter [1:0] S2=2'b10;
parameter [1:0] S3=2'b11;
always@(posedge clk_i)
begin
if(!rst_n_i)begin
state<=0;
out_r<=1'b0;
end
else
case(state)
S0 :
begin
out_r<=1'b0;
state<= S1;
end
S1 :
begin
out_r<=1'b1;
state<= S2;
end
S2 :
begin
out_r<=1'b0;
state<= S3;
end
S3 :
begin
out_r<=1'b1;
end
endcase
end
assign out_o=out_r;
endmodule
一段式状态机是应该避免使用的,该写法仅仅适用于非常简单的状态机设计,不符合组合逻辑与时序逻辑分开的原则,整个结构代码也不清晰,不利用维护和修改。
2、两段式状态机
module detect_2(
input clk_i,
input rst_n_i,
output out_o
);
reg out_r;
// 状态声明和状态编码
reg [1:0] Current_state;
reg [1:0] Next_state;
parameter [1:0] S0=2'b00;
parameter [1:0] S1=2'b01;
parameter [1:0] S2=2'b10;
parameter [1:0] S3=2'b11;
// 时序逻辑:描述状态转换
always@(posedge clk_i)
begin
if(!rst_n_i)
Current_state<=0;
else
Current_state<=Next_state;
end
// 组合逻辑 : 描述下一状态和输出
always@(*)
begin
case(Current_state)
S0 :
begin
out_r=1'b0;
Next_state= S1;
end
S1 :
begin
out_r=1'b1;
Next_state= S2;
end
S2 :
begin
out_r=1'b0;
Next_state= S3;
end
S3 :
begin
out_r=1'b1;
Next_state=Next_state;
end
endcase
end
assign out_o=out_r;
endmodule
两段式状态机采用两个 always 模块实现状态机的功能,其中一个 always 采用同步时序逻辑描述状态转移,另一个always 采用组合逻辑来判断状态条件转移。两段式状态机是推荐的状态机设计方法。
3、  三段式状态机
module detect_3(
input clk_i,
input rst_n_i,
output out_o
);
reg out_r;
// 状态声明和状态编码
reg [1:0] Current_state;
reg [1:0] Next_state;
parameter [1:0] S0=2'b00;
parameter [1:0] S1=2'b01;
parameter [1:0] S2=2'b10;
parameter [1:0] S3=2'b11;
// 时序逻辑:描述状态转换
always@(posedge clk_i)
begin
if(!rst_n_i)
Current_state<=0;
else
Current_state<=Next_state;
end
// 组合逻辑:描述下一状态
always@(*)
begin
case(Current_state)
S0:
Next_state = S1;
S1:
Next_state = S2;
S2:
Next_state = S3;
S3:
Next_state = Next_state;
default :
Next_state = S0;
endcase
end
// 输出逻辑:让输出 out ,经过寄存器 out_r 锁存后输出,消除毛刺
always@(*)
begin
case(Current_state)
S0,S2:
out_r<=1'b0;
S1,S3:
out_r<=1'b1;
default :
out_r<=out_r;
endcase
end assign out_o=out_r;
三段式状态机在第一个 always 模块采用同步时序逻辑方式描述状态转移,第二个 always 模块采用组合逻辑方式描述状态转移规律,第三个 always 描述电路的输出。通常让输出信号经过寄存器缓存之后再输出,消除电路毛刺。这种状态机也是比较推崇的,主要是由于维护方便,组合逻辑与时序逻辑完全独立。

http://www.ppmy.cn/news/1425411.html

相关文章

Mac使用Idea新手常用快捷键

Mac使用Idea新手常用快捷键 前言常用指令1、选中多个文件&#xff0c;不连续2、点进去查看某个类的代码3、复制某个类的全类名4、鼠标滚轮选中多行&#xff0c;然后选中这些行上同一列光标所在的单词 前言 入职新公司后用的是mac&#xff0c;从windows切换到mac&#xff0c;一…

安卓手机APP开发__媒体开发部分__直播流

安卓手机APP开发__媒体开发部分__直播流 目录 概述 检查和监控直播的播放 在直播流中的定位查找 直播播放的用户界面 配置直播播放的参数 播放速度调整 定制播放速度的调整算法 直播窗口背后的异常和ERROR_CODE_BEHIND_LIVE_WINDOW 概述 ExoPlayer没有任何特殊配置的…

PCB---Editor 输出光绘

选择一个层*&#xff08;正面走线层和过孔&#xff09; 选择一个文件复制命名&#xff08;最后删除初始的那2个文件&#xff0c;下图是删除过后的&#xff09;&#xff1a; 隐藏全部开始重复以上步骤&#xff1a; 大致的层&#xff1a; Art01&#xff08;正面走线层和过孔&…

ceph osd分组

一、前言 使用分组可以更好的管理osd&#xff0c;将不同类型的磁盘&#xff0c;分到不同的组中&#xff0c;例如hhd类型的osd分配到hhd组&#xff0c;ssd类型的osd分配到ssd组&#xff0c;将io要求不高的分配到hhd组做存储&#xff0c;io要求高的分配到ssd组做存储 二、配置 查…

Unity 中(提示框Tweet)

using UnityEngine; using UnityEngine.UI; using DG.Tweening; using System; public class Message : MonoBehaviour {public float dropDuration 0.5f; // 掉落持续时间public float persisterDuration 1f; // 持续显示时间public float dorpHeight;public static Message…

endnote21从安装到使用!文献引用!Mac版

视频学习和资源获取 新建库 选择上方导航栏处的File下的New 软件 软件界面可以分成四个部分 2是个人图书馆 3是对某一分类中文献的展示 最右侧是对具体一篇文献的摘要、编辑以及PDF 有回形针标志意味着这篇有全文&#xff0c;也就是有pdf 如果没有回形针代表它只有引文信…

@CrossOrigin的使用

CrossOrigin的使用 1.使用场景2.用法3.示例3.1 标注在方法上3.2 标注在类上 3.属性配置 1.使用场景 前后端分离应用&#xff1a;当前端应用和后端服务部署在不同的域或端口上时&#xff0c;前端应用尝试向后端服务发起请求时&#xff0c;可能会遇到同源策略的限制。这时&#…

微博聚类文本分析和可视化

本文使用python抓取微博数据并对微博文本分析和可视化&#xff0c;LDA&#xff08;树图&#xff09;、关系图、词云、时间趋势&#xff08;折线图&#xff09;、热度地图、词典情感分析&#xff08;饼图和3D柱状图&#xff09;、词向量神经网络情感分析、tfidf聚类、词向量聚类…