欢迎大家关注我的微信公众账号,支持程序媛写出更多优秀的文章

状态机是fpga设计中极其重要的一种技巧,状态机通过不同的状态迁移来完成特定的逻辑操作,掌握状态机的写法可以使fpga的开发事半功倍。

状态机的分类

  Moore型状态机:状态机的变化只与当前的状态有关
  Mealy型状态机:状态机的变化不仅与当前的状态有关,还与输入有关

如何创建状态机

状态机的创建可以分为一段式,两段式和三段式

  一段式:主要是讲所有的状态变化以及导致的输出变化都写在了一个always模块中。

  两段式:一个always模块采用同步时序描述状态转移;另一个always模块采用组合逻辑判断状态转移条件,描述状态转移规律以及输出。

  三段式:一个always模块采用同步时序描述状态转移;一个always模块采用组合逻辑判断状态转移条件,描述状态转移规律;另一个always模块描述状态输出(可以用组合电路输出,也可以时序电路输出)。

举个例子:从循环输入的字母中做连续检测,当连续检测到“hello”时,将led灯进行状态的翻转,继续进行下一次的检测。

一段式的编写方式:

 module  hello(
input clk,//系统时钟信号 50mHz
input rst_n,//系统复位信号,低电平有效
input [:] data,//连续输入的字母
output reg led//led灯
); //设置需要改变的状态
parameter checkh = 'b0000_1,
checke = 'b0001_0,
checkla = 'b0010_0,
checklb = 'b0100_0,
checko = 'b1000_0; reg [:]state; always @(posedge clk or negedge rst_n)
if(!rst_n)
begin
led <= 'b0;
state <= checkh;
end
else
begin
case (state)
checkh:
if(data == "h") state <= checke;
else state <= checkh;
checke:
if(data == "e") state <= checkla;
else state <= checkh;
checkla:
if(data == "l") state <= checklb;
else state <= checkh;
checklb:
if(data == "l") state <= checko;
else state <= checkh;
checko:
if(data == "o")
begin
led <= ~led;
state <= checkh;
end
else state <= checkh;
default:state <= checkh;
endcase
end endmodule

二段式的编写方式:

 module  hello(
input clk,
input rst_n,
input [:] data,
output reg led
); parameter checkh = 'b0000_1,
checke = 'b0001_0,
checkla = 'b0010_0,
checklb = 'b0100_0,
checko = 'b1000_0; reg [:] cstate; // 当前状态
reg [:] nstate; // 下一状态 always @(posedge clk or negedge rst_n)
if(!rst_n)
cstate <= checkh;
else
cstate <= nstate; always @(cstate or data)
case (cstate)
checkh:
if(data == "h") nstate <= checke;
else nstate <= checkh;
checke:
if(data == "e") nstate <= checkla;
else nstate <= checkh;
checkla:
if(data == "l") nstate <= checklb;
else nstate <= checkh;
checklb:
if(data == "l") nstate <= checko;
else nstate <= checkh;
checko:
if(data == "o")
begin
led <= ~led;
nstate <= checkh;
end
else nstate <= checkh;
default:nstate <= checkh;
endcase endmodule

三段式的编写方式:

 module  hello(
input clk,
input rst_n,
input [:] data,
output reg led
); parameter checkh = 'b0000_1,
checke = 'b0001_0,
checkla = 'b0010_0,
checklb = 'b0100_0,
checko = 'b1000_0; reg [:] cstate; // 当前状态
reg [:] nstate; // 下一状态 //复位信号,clk的处理(主要是对初始状态进行赋值操作)
always @(posedge clk or negedge rst_n)
if(!rst_n)
cstate <= checkh;
else
cstate <= nstate; //状态迁移的处理
always @(cstate or data)
case (cstate)
checkh:
if(data == "h") nstate <= checke;
else nstate <= checkh;
checke:
if(data == "e") nstate <= checkla;
else nstate <= checkh;
checkla:
if(data == "l") nstate <= checklb;
else nstate <= checkh;
checklb:
if(data == "l") nstate <= checko;
else nstate <= checkh;
checko:
if(data == "o")
begin
nstate <= checkh;
end
else nstate <= checkh;
default:nstate <= checkh;
endcase //输出数据的处理
always @(posedge clk or negedge rst_n)
if(!rst_n)
led <= 'b1; else
case (cstate)
checko:
if(data == "o")
led <= ~led;
default;
endcase endmodule

【FPGA篇章四】FPGA状态机:三段式以及书写方法的更多相关文章

  1. 简单三段式状态机实验1-SOS

    一直想从一段式状态机切换到三段式状态机,从书上和网上不断搜寻三段式案例及方法,感觉很简单,就想拿之前做过的实验把一段式改成三段式,可是写起来并非那么简单,很棘手,改完后也没有成功,尤其状态机里面的计数 ...

  2. FPGA三段式状态机的思维陷阱

    用三段式描述状态机的好处,国内外各位大牛都已经说的很多了,大致可归为以下三点: 1.将组合逻辑和时序逻辑分开,利于综合器分析优化和程序维护; 2.更符合设计的思维习惯; 3.代码少,比一段式状态机更简 ...

  3. 基于FPGA的三段式状态机

    状态机分类: 通常, 状态机的状态数量有限, 称为有限状态机(FSM) .由于状态机所有触发器的时钟由同一脉冲边沿触发, 故也称之为同步状态机. 根据状态机的输出信号是否与电路的输入有关分为 Meal ...

  4. 三段式状态机 [CPLD/FPGA]

    状态机的组成其实比较简单,要素大致有三个:输入,输出,还有状态. 状态机描述时关键是要描述清楚前面提高的几个状态机的要素,即如何进行状态转移:每个状态的输出是什么:状态转移是否和输入条件相关等. 有人 ...

  5. Verilog三段式状态机描述

    时序电路的状态是一个状态变量集合,这些状态变量在任意时刻的值都包含了为确定电路的未来行为而必需考虑的所有历史信息. 状态机采用VerilogHDL语言编码,建议分为三个always段完成. 三段式建模 ...

  6. verilog 三段式状态机的技巧

    三段式代码多,但是有时钟同步,延时少,组合逻辑跟时序逻辑分开并行出错少. (1)同步状态转移 (2)当前状态判断接下来的状态 (3)动作输出 如果程序复杂可以不止三个always   .always ...

  7. FPGA知识大梳理(三)verilogHDL语法入门(2)知识汇总

    1,时序逻辑.将上次的练习修改成时序逻辑会如何设计. always @ (posedge clock) 2,block 与unblocking  A,有clock的always中通常使用nonbloc ...

  8. 简单三段式状态机实验2-LCD12864

    此实验是在“基于I2C EPPRPM(AT24C02B) + LCD12864实验”基础上,把LCD模块里的一段式状态机改成三段式,I2C EPPROM模块暂时未改出来,一步一步来吧,改完后代码下载到 ...

  9. (原创)Verilog三段式状态机

    下面以上图一个简单的FSM说明三段式Verilog状态机范式: `timescale 1ns / 1ps module FSM( clk,rst_n, in1,in2, out1,out2, CS,N ...

随机推荐

  1. [总结]最近公共祖先(倍增求LCA)

    目录 一.定义 二.LCA的实现流程 1. 预处理 2. 计算LCA 三.例题 例1:P3379 [模板]最近公共祖先(LCA) 四.树上差分 1. 边差分 2. 点差分 3. 例题 一.定义 给定一 ...

  2. 【转】解决存储过程执行快,但C#程序调用执行慢的问题

    这两天遇到一个问题令人比较郁闷,一个大概120行左右的存储过程在SQL Server2012的查询分析器里面执行,速度非常理想,1秒不到,即可筛选抓取到大概500条数据记录.但在C#程序代码里调用,就 ...

  3. 记一次错误 POST http://127.0.0.1:8000/auth/signup/ 500 (Internal Server Error)

    错误环境: 1,ajax 发送 post 请求调用 views 的视图 xfzajax.post({ 'url': '/xfzauth/signup/', 'data': { 'telephone': ...

  4. BMP图片解析

    本博客参考:https://www.cnblogs.com/l2rf/p/5643352.html 一.简介 BMP(Bitmap-File)图形文件是Windows采用的图形文件格式,在Window ...

  5. 【一起学设计模式】观察者模式实战:真实项目中屡试不爽的瓜娃EventBus到底如何实现观察者模式的?

    申明 本文章首发自本人公众号:壹枝花算不算浪漫,如若转载请标明来源! 感兴趣的小伙伴可关注个人公众号:壹枝花算不算浪漫 22.jpg 前言 之前出过一个设计模式的系列文章,这些文章和其他讲设计模式的文 ...

  6. sudo: 在加载插件“sudoers_policy”时在 /etc/sudo.conf 第 0 行出错 sudo: /usr/lib/sudo/sudoers.so 必须只对其所有者可写 sudo: 致命错误,无法加载插件

    解决办法:  su root chmod 644 /usr/lib/sudo/sudoers.so chown -R root /usr/lib/sudo 千万不要给 /usr 赋全部权限!!!   ...

  7. 3.k均值的算法

    一.课堂练习 # 课堂练习 from sklearn.datasets import load_iris # 导入鸢尾花数据 iris=load_iris() iris iris.keys() dat ...

  8. 在java中构建高效的结果缓存

    文章目录 使用HashMap 使用ConcurrentHashMap FutureTask 在java中构建高效的结果缓存 缓存是现代应用服务器中非常常用的组件.除了第三方缓存以外,我们通常也需要在j ...

  9. 关于用C-free进行C语言编程在电脑中生成的.exe和.o文件

    在使用C-free进行C语言编程时,程序运行后会自动在电脑文件中生成以.exe和.o为后缀名的文件: 1,生成的.exe文件为系统自动打包完成的应用程序,该程序可直接在其他无C-free环境的电脑上运 ...

  10. 使用sys模块写一个软件安装进度条

    import sys,time for i in range(50): sys.stdout.write('#') sys.stdout.flush() #强制刷新将内存中的文件写一条,输出一条. t ...