当前位置: 首页 > news >正文

FPGA开发——状态机的使用

一、概述

我们在使用FPGA进行开发的过程当中,实现一个东西用得最多的实现方法就是状态机的实现方法,用一句话总结就是万物皆可状态机,这和我们在学习Linux时常说的在Linux中万物都是文件差不多,这里就主要就是突出状态机的应用范围很广。

二、相关理论

1、概念

2、状态机编码方式

在进行状态机编码时我们一般采用独热码进行编码,独热码想对于自然二进制编码和格雷码编码来说:组合逻辑较少,不易产生毛刺,使用范围广。缺点就是触发器个数较多,(二进制编码毛刺大,格雷码逻辑组合较多)

3、描述方式

在进行代码编写时我们通常采用三段式的编码方式进行编写。

三、代码编写

这里我们就简单使用状态机描述输入多个二进制数,当检测到1011时输出一个标志位的过程。

1、状态转移图

2、设计文件的编写

module test (input               clk     ,input               rst_n   ,input               din ,output      reg        dout  
);
//参数定义
parameter   IDLE =5'b00001,//0S1   =5'b00010,//检测到1S2   =5'b00100,//检测到10S3   =5'b01000,//检测到101S4   =5'b10000;//检测到1011
//内部信号
reg  [5:0]  state_c     ;//现态
reg  [5:0]  state_n     ;//次态//时序逻辑电路描述状态转移
always @(posedge clk or negedge rst_n)beginif(!rst_n)state_c = IDLE;elsestate_c = state_n; 
end
//使用组合逻辑描述状态转移条件
always @(*)begincase (state_c)IDLE :begin//0if(din==1)state_n = S1;elsestate_n = IDLE;endS1   :begin//1if(din==0)state_n = S2;elsestate_n = S1;endS2   :begin//10if(din==1)state_n = S3;elsestate_n = IDLE;endS3   :begin//101if(din==1)state_n = S4;elsestate_n = S2;endS4   :begin//1011state_n = IDLE;enddefault: state_n = IDLE;endcase
end //描述输出结果
always @(posedge clk or negedge rst_n)beginif(!rst_n)dout<=0;else if(state_c ==S4)dout<=1;elsedout<=0;
end
endmodule

3、测试文件的编写

//定义时间尺度
`timescale 1ns/1ns
module test_tb ;//输入信号定义
reg  clk  ;
reg  rst_n;
reg  din  ;
wire dout ;//模块例化
test test_inst(/*input             */  .clk     (clk  ),/*input             */  .rst_n   (rst_n),/*input             */  .din     (din  ),/*output      reg   */  .dout    (dout ) 
);
//时钟
parameter  CLK_CLY =20;
initial  clk=0;
always  #(CLK_CLY/2) clk=~clk;
//复位
initial begin
//初始化rst_n= 1'b0;#(CLK_CLY*2);#5;rst_n=1'b1;
end
//激励
initial begindin= 1'b0;#(CLK_CLY*3);#5;repeat (30)begindin= $random;#(CLK_CLY*1);end$stop;
end
endmodule

四、波形仿真

在波形图中我们可以看到当检测到输入的二进制数与状态转移条件就会发生变化,当检测到1011时,输出会产生一个高电平,代表检测到数据。通过总体观察,波形图中状态之间的转移和我们在前面画的状态转移条件一致没说明我们的状态机设置成功。 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 如何在C语言中实现求解超级丑数
  • 10年仓库管理经验:“管、存、发、盘”一文搞定!
  • 计网面试题
  • shell脚本自动化部署
  • 计算机网络HTTP全讲解,让你透彻掌握HTTP协议(三)http长短连接/代理/网关/缓存/内容协商机制/断点续传
  • 马尔科夫毯:信息屏障与状态独立性的守护者
  • 极速提升:SQL Server数据库性能优化的黄金法则
  • SQL labs-SQL注入(sqlmap使用)
  • CTFHUB-文件上传-双写绕过
  • Java链接Elasticsearch数据库并使用对应的方法(使用ES Java API)
  • linux在行尾添加一个study字符
  • redis雪崩问题分析
  • python-进度条和计时器
  • Mallet:一款针对任意协议的安全拦截代理工具
  • ant design含嵌套子列数据遍历插入docx table
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • avalon2.2的VM生成过程
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • JAVA之继承和多态
  • js如何打印object对象
  • miaov-React 最佳入门
  • Python3爬取英雄联盟英雄皮肤大图
  • React Transition Group -- Transition 组件
  • Solarized Scheme
  • spark本地环境的搭建到运行第一个spark程序
  • vue-router的history模式发布配置
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 蓝海存储开关机注意事项总结
  • 前端临床手札——文件上传
  • 通过git安装npm私有模块
  • 再次简单明了总结flex布局,一看就懂...
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (4)STL算法之比较
  • (ibm)Java 语言的 XPath API
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (九)信息融合方式简介
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (十六)串口UART
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • (转)Google的Objective-C编码规范
  • (转)ObjectiveC 深浅拷贝学习
  • (转)程序员技术练级攻略
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .htaccess 强制https 单独排除某个目录
  • .net framework 4.8 开发windows系统服务
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • .NET 中选择合适的文件打开模式(CreateNew, Create, Open, OpenOrCreate, Truncate, Append)
  • .NET/C# 解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录。
  • .NET6 命令行启动及发布单个Exe文件