11.21序列检测,状态机比较与代码,按键消抖原理

序列检测

用一个atemp存储之前的所有状态,即之前出现的七位

含无关项检测

要检测011XXX110

对于暂时变量的高位,位数越高就是越早出现的数字,因为新的数字存储在TEMP的最低位

不重叠序列检测

,一组一组

011100

`timescale 1ns/1ns
module sequence_detect(input clk,input rst_n,input data,output reg match,output reg not_match);parameter ZERO=0, ONE=1, TWO=2, THREE=3, FOUR=4, FIVE=5, SIX=6, FAIL=7;reg [2:0] state, nstate;reg [2:0] cnt;always@(posedge clk or negedge rst_n) beginif(~rst_n)cnt <= 0;elsecnt <= cnt==6? 1: cnt+1; endalways@(posedge clk or negedge rst_n) beginif(~rst_n)state <= ZERO;elsestate <= nstate;endalways@(*) beginif(~rst_n)nstate = ZERO;elsecase(state)ZERO : nstate = data? FAIL : ONE;ONE  : nstate = data? TWO  : FAIL;TWO  : nstate = data? THREE: FAIL;THREE: nstate = data? FOUR : FAIL;FOUR : nstate = data? FAIL : FIVE;FIVE : nstate = data? FAIL : SIX;SIX  : nstate = data? FAIL : ONE;FAIL : nstate = cnt==6? ZERO: FAIL;default: nstate = ZERO;endcaseendalways@(*) beginif(~rst_n) beginmatch     = 0;not_match = 0;endelse beginmatch     = cnt==6&&state==SIX;not_match = cnt==6&&state==FAIL;endendendmodule

状态机代码

状态机简写为FSM

非阻塞赋值可以理解为次态,就是当前时间步结束后,在下一个时间步将右侧表达式的值应用到被赋值的信号上,从而实现状态的更新

module StateMachine(input wire clk,input wire reset,output wire [1:0] state
);reg [1:0] current_state, next_state;always @(posedge clk or posedge reset) beginif (reset)current_state <= 2'b00;elsecurrent_state <= next_state;
endalways @(current_state) begincase(current_state)2'b00: next_state <= 2'b01;  // State transition from 00 to 012'b01: next_state <= 2'b10;  // State transition from 01 to 102'b10: next_state <= 2'b00;  // State transition from 10 to 00default: next_state <= 2'b00;endcase
endassign state = current_state;endmodule

两种状态机 

Mealy状态机的输出信号取决于现态与输入;

Moore状态机仅取决于当前状态,即现态

Moore

module moore(input wire clk,input wire a,output wire b,output wire[1:0]state
);
reg[1:0]current_state;
wire b_out;parameter s0=2'b00;
parameter s1=2'b01;
parameter s2=2'b10;xzz
always@(posedge clk)begincase(current_state)s0:beginif(a)begincurrent_state<=s1;b_out<=1'b0;endends1:beginif(!a)begincurrent_state<=s2;b_out<=1'b1;endends2:beginif(a)begincs<=s0;b<=1'b1;endendendcase
end
assign b=b_out;
assign state=cs;
end

在摩尔状态机中,每个状态都有一个特定的输出值,该输出值在进入该状态时被分配并保持不变,直到状态发生转移 

reg        [:]            current_state           ;
reg        [:]            next_state               ;wire        [:0]            IDLE                    ;
wire        [:0]            S0                ;
wire        [:0]            S1                ;
wire        [:0]            S2                ;//=============================================================================\
//****************************     State Machine    *******************************
//=============================================================================\always @(posedge sclk or negedge s_rst_n) beginif(!s_rst_n)current_state <= IDLE;elsecurrent_state <= next_state;
endalways @(*) beginnext_state = IDLE;case(current_state)IDLE:beginif(idle2s0 == 1'b1)next_state = S0;elsenext_state = current_state;endS0:beginif(s02s1 == 1'b1)next_state = S1;elsenext_state =current_state;endS1:beginif(s12s2 == 1'b1)next_state = S2;elsenext_state = current_state;endS2:beginif(s22idle == 1'b1)next_state = IDLE;elsenext_state = current_state;enddefault:beginnext_state = IDLE;endendcase
endassign        idle2s0        =    current_state == IDLE    &&
assign        s02s1        =    current_state == S0            &&
assign        s12s2        =    current_state == S1            &&
assign        s22idle        =    current_state == S2        &&always @(posedge sclk or negedge s_rst_n) beginif(!s_rst_n) beginendelse begincase(next_state)end
end

always(*)会在输入信号变化时自动执行 

在每个状态内部,检查特定的输入信号条件,如果满足,就将次态设置为特定值,不然,就将次态保留为现态

在状态转移的逻辑中使用阻塞,因为阻塞赋值会按照代码的顺序逐行执行,并立即更新被赋值的变量,在状态转移逻辑中,使用阻塞赋值可以确保在同一个时间步内只有一个状态转移会被执行

非阻塞赋值允许在同一个时间步内同时更新多个变量的值,将右侧表达式的值保存在一个暂存器内,然后在时间步的末尾将暂存器的值赋给左侧,可以确保所有变量在同一个时间步内同时更新,保持状态的一致性。在状态转移逻辑中使用阻塞赋值可以按顺序进行状态检查和状态转移,而在时钟驱动的逻辑中使用非阻塞赋值可以模拟时序行为,确保状态的同步更新。

在摩尔状态机中,在每个时钟上升沿,状态机会根据当前状态和输入信号计算出下一个状态,并在下一个上升沿时更新输出,因此需要等待时钟的到来才能进行状态转移和生成输出

摩尔状态机的当前输出总是在一个周期后,米利状态机中,输入更改会在逻辑完成后立即导致输出更改

摩尔状态机

以一个序列检测器为例,检测到输入信号11时输出z为1,其他时候为0。用摩尔型FSM实现需要用到三个状态(A,B,C)。而用米利型FSM实现则需要两个状态(A,B)。摩尔型FSM输出函数的输入只由状态变量决定,要想输出z=1,必须C状态形成,即寄存器中的两个1都打进去后才可以。输出z=1会在下一个有效沿到来的时候被赋值。而米利型FSM输出函数是由输入和状态变量共同决定的。状态在B的时候如果输入为1,则直接以组合电路输出z=1,不需要等到下个有效沿到来。从而也就不需要第三个状态C。

是输出函数仅取决于当前状态,而不是状态转移仅取决于当前状态

就是说,米利与摩尔状态机的状态转换,肯定都取决于现态与输入,只不过米利状态机的输出是要取决于输入与现态,然后摩尔的输出直取决于现态。

也就是说,有多少种输出信号,摩尔状态机就需要额外增加多少种状态,在这个状态下,才会输出相应的信号

而对于米利状态机,只需要提供输出这个信号时的现态即可,从这个现态延申出输出信号

就比如说两道题,每道ABCD选项;

用摩尔状态机的话,就需要1(初始状态)+2*2种状态

2*2就是选对与没选对的状态,即第一道题选对了,第二道题对了的状态,输出一个分数

第一道题选对了,第二道题错了的状态,输出一个分数

第一道题选错了,第二道题对了的状态,输出一个分数

第一道题选错了,第二道题错了的状态,输出一个分数

摩尔状态机就是一个树形的结构,需要有节点记录决策后的结果

而米利状态机,只需要记录决策的节点即可

即米利状态机需要1+2种状态,即两道题决策的状态,输出函数,就取决在在这个决策状态(现态)与决策(输入信号)

那么在上例种,可以认为第一位与第二位就是要决策的状态,所以米利状态机至少需要两个状态,而摩尔状态机至少要三个,需要有额外的节点状态来负责输出。即想要输出1,必须要进入状态C

检测11,只有第一位是1时,摩尔与米利状态机进入A状态;在此基础上,只有第二位是1时,进入B状态;此时,米利状态机就不需要新状态了,摩尔状态机还需要一个新状态,来记录最终的输出

就是说,米利状态机的每个状态,是每个状态节点还未进行决策时的情况;而摩尔状态机是已经做出决策的状况。就是第一位,A状态,对米里而言,是要做第一位的决策,还不知道做的结果是什么,取决于输入。而摩尔的第一位,B状态,是已经做出了决策,且决策是1,那么就进入B状态

初始状态,摩尔是A,米利是A,摩尔的A是真初始状态,表示还没有任何结果,初始化的一个状态;米利可以理解为要做第一个决策,但还不知道结果是什么的一个状态,也可以认为是初始状态

那么对摩尔状态转移就是,只有为1时,才会进入下一个状态,C就是都为1的状态。在状态转移过程种不输出,在状态节点上进行输出,可以认为摩尔状态机的状态,是记录结果的状态。

对米利状态转移就是,做出不同的选择会进入不同的状态,只有为1才会进入下一个状态(下一次决策前的状态),其输出,在转移的过程中进行输出,也就是给到输入后,就意味着此时的决策已经知道,就进入下个状态,是记录决策节点的状态,其输出在由最后的节点延申出的线条当中

摩尔与米利检测1101

所以按照上面的思路,摩尔与米利状态机检测1101,分别需要5和4种状态

摩尔的话,就是纯初始状态,以及4个匹配成功的状态,只要不断的匹配成功才会进入下个状态;记录的是结果;即S0代表初始,S1,S2,S3,S4分别代表每位都匹配成功的结果;S1记录第一位正确,第二位待定。S2记录第一位第二位正确,第三位待定……

代码

米利与摩尔状态机都要有这样的代码块,即并不是这个原因导致摩尔

米利的话,就是4个位要确定的状态,也是只有确定匹配才会进入下个状态。记录的是要进行选择时的状态;即S0,S1,S2,S3分别代表每位未确定前的状态,即IDLE,S0就是第一位待定……第一位确定,第二位待定……

 所以按照上面的思路,摩尔状态机要慢一个周期,因为确定结果,进行非阻塞赋值要在当下这个周期结束后才进行;而米利状态机,知道当下状态,知道输入信号,就可以在当下周期用ASSIGN输出信号

按键消抖

软件按键消抖模块:软件算法通常通过软件延时和状态机来实现按键消抖。当检测到按键状态变化时,软件会进行一定的延时,以等待按键抖动稳定。在延时结束后,再次检测按键状态只有当连续多次检测到相同的按键状态时,才确认按键的有效触发。

就是说,在连续的三个时间周期内,检测到的按键值都一样,那就可以认为按键已经稳定下来了,也就可以进行采用了 

这个就是用来检测三个按键是否相同,寄存器分别寄存上一个状态

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

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

相关文章

【算法】二分查找-20231122

这里写目录标题 一、1089. 复写零二、917. 仅仅反转字母三、88. 合并两个有序数组四、283. 移动零 一、1089. 复写零 提示 简单 266 相关企业 给你一个长度固定的整数数组 arr &#xff0c;请你将该数组中出现的每个零都复写一遍&#xff0c;并将其余的元素向右平移。 注意&a…

智能座舱架构与芯片- (13) 软件篇 下

四、面向服务的智能座舱软件架构 4.1 面向信号的软件架构 随着汽车电子电气架构向中央计算-域控制器的方向演进&#xff0c;甚至向车云一体化的方向迈进&#xff0c;适用于汽车的软件平台也需要进行相应的进化。 在传统的观念中&#xff0c;座舱域即娱乐域&#xff0c;座舱软…

4.Gin HTML 模板渲染

4.Gin HTML 模板渲染 Gin HTML 模板渲染 1. 全部模板放在一个目录里面的配置方法 创建用于渲染的模板html templates/index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> …

【GitHub】保姆级使用教程

一、如何流畅访问GitHub 1、网易uu加速器 输入网址&#xff0c;无脑下载网易加速器&#xff1b;https://uu.163.com/ 下载安装完毕后&#xff0c;创建账号进行登录 登录后&#xff0c;在右上角搜索框中搜索“学术资源”&#xff0c;并点击&#xff1b; 稍等一会儿就会跳…

如何在3dMax中使用Python按类型选择对象?

如何在3dMax中使用Python按类型选择对象&#xff1f; 3dMax提供了pymxs API&#xff0c;这是MAXScript的Python包装器&#xff0c;可帮助您扩展和自定义3dMax&#xff0c;并更轻松地将其集成到基于Python的管道中。 pymxs模块包含一个运行时成员&#xff0c;该成员提供对MAXSc…

电子学会C/C++编程等级考试2022年09月(一级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:指定顺序输出 依次输入3个整数a、b、c,将他们以c、a、b的顺序输出。 时间限制:1000 内存限制:65536输入 一行3个整数a、b、c,以空格分隔。 0 < a,b,c < 108输出 一行3个整数c、a、b,整数之间以一个空格分隔。样例输入…

【C++进阶之路】第八篇:智能指针

文章目录 一、为什么需要智能指针&#xff1f;二、内存泄漏1.什么是内存泄漏&#xff0c;内存泄漏的危害2.内存泄漏分类&#xff08;了解&#xff09;3.如何检测内存泄漏&#xff08;了解&#xff09;4.如何避免内存泄漏 三、智能指针的使用及原理1.RAII2.智能指针的原理3.std:…

气相色谱质谱仪样品传输装置中电动针阀和微泄漏阀的解决方案

标题 摘要&#xff1a;针对目前国内外各种质谱仪压差法进样装置无法准确控制进气流量&#xff0c;且无相应配套产品的问题&#xff0c;本文提出了相应的解决方案和配套部件。解决方案主要解决了制作更小流量毛细管和毛细管进气端真空压力精密控制问题&#xff0c;微流量毛细管的…

Flutter:多线程Isolate的简单使用

在flutter中如果要使用线程&#xff0c;需要借助Isolate来实现。 简介 在Flutter中&#xff0c;Isolate是一种轻量级的线程解决方案&#xff0c;用于在应用程序中执行并发任务。Isolate可以被认为是独立于主线程的工作单元&#xff0c;它们可以在后台执行任务而不会阻塞应用程…

C++入门第八篇---STL模板---list的模拟实现

前言&#xff1a; 有了前面的string和vector两个模板的基础&#xff0c;我们接下来就来模拟实现一下list链表模板&#xff0c;我还是要强调的一点是&#xff0c;我们模拟实现模板的目的是熟练的去使用以及去学习一些对于我们本身学习C有用的知识和用法&#xff0c;而不是单纯的…

基于SpringBoot+MyBatis-Plus的校园图书管理系统

基于SpringBootMyBatis-Plus的校园图书管理系统 校园图书管理系统开发技术功能模块代码结构数据库设计运行截图源码获取 校园图书管理系统 欢迎访问此博客&#xff0c;是否为自己的毕业设计而担忧呢&#xff1f;是否感觉自己的时间不够做毕业设计呢&#xff1f;那你不妨看一下…

2023年DevOps国际峰会暨BizDevOps企业峰会(DOIS北京站)-核心PPT资料下载

一、峰会简介 在数字化转型的大背景下&#xff0c;企业选择实践 DevOps 来提升 IT 效能成为常态&#xff0c;BizDevOps 作为企业自身数字化变革的重要主题之一&#xff0c;需要全行业共同努力促进繁荣和发展。从 DevOps 到 BizDevOps&#xff0c;业务与技术如何融合&#xff1…

CentOS用nginx搭建文件下载服务器

Nginx 是开源、高性能、高可靠的 Web 和反向代理服务器&#xff0c;而且支持热部署&#xff0c;几乎可以做到 7 * 24 小时不间断运行&#xff0c;即使运行几个月也不需要重新启动。在工作中&#xff0c;我们经常会用到需要搭建文件服务器的情况&#xff0c;这里就以在linux下搭…

不会代码也能拿高薪?掌握面试法宝,轻松10000+

快速排序&#xff08;Quicksort&#xff09;是对冒泡排序的一种改进。 快速排序由 C.A.R.Hoare 在 1962 年提出。 它的基本思想是&#xff1a;通过一趟排序将要排序的数据分割成独立的两部分&#xff0c;其中一部分的所有数据都比另外一部分的所有数据都要小&#xff0c;然后…

最新版本的橙色前端微信去水印小程序源码

好像最近去水印小程序挺火的&#xff0c;你看这就不来了一个新的去水印小程序。 橙色前端是最近比较流行的&#xff0c;很多小程序也都是这种样式&#xff0c;如果你需要其它颜色的&#xff0c;可以自己修改一下CSS即可&#xff0c;小程序云开发的&#xff0c;无需服务器。 打…

2023年11月15号期中测验判断题(Java)

本篇还有3篇相关文章-> 2023年11月15号期中测验选择题&#xff08;Java&#xff09;-CSDN博客 2023年11月15号期中测验编程题&#xff08;Java&#xff09;-CSDN博客 2023年11月15号期中测验主观题&#xff08;Java&#xff09;-CSDN博客 判断题-> T F 1-1 局…

编译器安全

在供应链安全中&#xff0c;大家一直关注采用SCA工具分析开源组件中的安全漏洞以及许可证的合规性。但是对于底层软件开发使用的编译器、链接器等安全却容易被忽视&#xff0c;其中有没有安全漏洞、有没有运行时缺陷、有没有被植入漏洞、木马等&#xff0c;似乎并没有引起多少人…

selenium判断元素是否存在的方法

文章目录 快捷方法完整示例程序 快捷方法 selenium没有exist_xxx相关的方法&#xff0c;无法直接判断元素存在。但是锁定元素时使用的browser.find_elements(By.CSS_SELECTOR, "css元素")会返回一个列表list&#xff0c;如果不存在这个元素就会返回一个空列表。因此…

【20年扬大真题】设顺序表va中的数据元素递增有序。试写一算法,将x插入到顺序表的适当位置上,以保障该表的有序性。

【20年扬大真题】 设顺序表va中的数据元素递增有序。 试写一算法&#xff0c;将x插入到顺序表的适当位置上&#xff0c;以保障该表的有序性。 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<malloc.h> #define MaxSize 9//定义最大长度 int InitAr…

第4章 向量、SIMD和GPU体系结构中的数据级并行

4.1 引言 有多少应用程序拥有大量的数据级并行DLP&#xff1f;SIMD分类Flyn被提出后5年。答案不仅包括科学运算中的矩阵运算&#xff0c;还包括面向多媒体的图像和声音处理以及机器学习算法。 由于SIMD可以执行多个数据操作&#xff0c;能效比MIMD要高&#xff0c;使得SIMD对…