12.30序列检测(重叠、不重叠、连续、不连续、含无关项)——移位寄存器,状态机;状态机(二段式,三段式)

状态机-重叠序列检测

`timescale 1ns/1nsmodule sequence_test2(input wire clk  ,input wire rst  ,input wire data ,output reg flag
);
//*************code***********//parameter S0=0, S1=1, S2=2, S3=3, S4=4;reg [2:0] state, nstate;always@(posedge clk or negedge rst) beginif(~rst)state <= S0;elsestate <= nstate;endalways@(*) beginif(~rst)nstate <= S0;elsecase(state)S0     : nstate <= data? S1: S0;S1     : nstate <= data? S1: S2;S2     : nstate <= data? S3: S0;S3     : nstate <= data? S4: S2;S4     : nstate <= data? S1: S2;default: nstate <= S0;endcaseendalways@(posedge clk or negedge rst) beginif(~rst)flag <= 0;elseflag <= state==S4;end//*************code***********//
endmodule

状态机-非重叠的序列检测

只检测一次的序列,这才是真正的不用考虑其它的,匹配就行,不用考虑不匹配的

`timescale 1ns/1nsmodule sequence_test1(input wire clk  ,input wire rst  ,input wire data ,output reg flag
);
parameter idle=0,s1=1,s2=2,s3=3,s4=4,s5=5;
reg[2:0]cs;
reg[2:0]ns;
always@(posedge clk,negedge rst)beginif(!rst)begincs<=idle;endelse begincs<=ns;end
end
always@(*)begincase(cs)idle:ns=(data==1)?s1:idle;s1:ns=(data==0)?s2:idle;s2:ns=(data==1)?s3:idle;s3:ns=(data==1)?s4:idle;s4:ns=(data==1)?s5:idle;default:ns=idle;endcase
end
always@(posedge clk,negedge rst)beginif(!rst)beginflag<=0;endelse beginflag<=ns==s5;end
end
endmodule

不重叠序列检测

状态机

这种还是用状态机比较方便,对于序列检测,就是根据特点选方法,最简便的是MOORE型,到底慢不慢一拍,直接在输出判断时更改CS,NS,要慢就CS,不慢就NS

nS的MOORE和MEALY型是一样的同步

不重叠的话,不匹配时就直接回到初始状态,都不用Kmp匹配了

移位寄存器

在移位寄存器的基础上,加了一个CNT限制’

`timescale 1ns/1ns
module sequence_detect(input clk,input rst_n,input data,output reg match,output reg not_match);reg[2:0]cnt;reg[5:0]ram;always@(posedge clk,negedge rst_n)beginif(!rst_n)cnt<=0;elsecnt<=cnt==5?0:cnt+1;endalways@(posedge clk,negedge rst_n)beginif(!rst_n)ram<=0;elseram<={ram[4:0],data};endalways@(posedge clk,negedge rst_n)beginif(!rst_n)beginmatch<=0;not_match<=0;endelse beginmatch<=(cnt==5)&&({ram[4:0],data}==6'b011100);not_match<=(cnt==5)&&({ram[4:0],data}!=6'b011100);endend
endmodule

含有无关项的序列检测

移位寄存器

用两个信号判断左右两侧是不是满足要求的,都满足了就输出1

`timescale 1ns/1ns
module sequence_detect(input clk,input rst_n,input a,output match);
reg[8:0]temp;
always@(posedge clk,negedge rst_n)beginif(!rst_n)begintemp<=9'b0;endelse begintemp<={temp[7:0],a};end
endreg ma;
reg mb;
always@(posedge clk,negedge rst_n)beginif(!rst_n)beginma<='b0;endelse beginif(temp[8:6]==3'b011)ma<=1'b1;elsema<=1'b0;end
end
always@(posedge clk,negedge rst_n)beginif(!rst_n)beginmb<='b0;endelse beginif(temp[2:0]==3'b110)mb<=1'b1;elsemb<=1'b0;end
end
assign match=ma&mb;
endmodule

输入序列连续的序列检测

移位寄存器

这个移位寄存器,是直接判断寄存器存的,即寄存器当前状态,所以是MOORE状态机

`timescale 1ns/1ns
module sequence_detect(input clk,input rst_n,input a,output reg match);
reg[7:0]atemp;
always@(posedge clk,negedge rst_n)beginif(!rst_n)beginatemp<=8'b0;endelseatemp<={atemp[6:0],a};
end
always@(posedge clk,negedge rst_n)beginif(!rst_n)beginmatch=1'b0;endelse beginif(atemp==8'b0111_0001)match=1'b1;elsematch='b0;end
endendmodule

状态机 

`timescale 1ns/1ns
module sequence_detect(input clk,input rst_n,input a,output reg match);
parameter idle=0,s1=1,s2=2,s3=3,s4=4,s5=5,s6=6,s7=7,s8=8;
reg[3:0]cs;
reg[3:0]ns;
always@(posedge clk,negedge rst_n)beginif(!rst_n)cs<=idle;else cs<=ns;
end
always@(*)begincase(cs)idle:beginns=(a==0)?s1:idle;ends1:beginns=(a==1)?s2:s1;ends2:beginns=(a==1)?s3:s1;ends3:beginns=(a==1)?s4:s1;ends4:beginns=(a==0)?s5:idle;ends5:beginns=(a==0)?s6:s2;ends6:beginns=(a==0)?s7:s2;ends7:beginns=(a==1)?s8:s1;ends8:beginns=(a==1)?s3:s1;enddefault:ns=idle;endcase
end
always@(posedge clk,negedge rst_n)beginif(!rst_n)match<=0;elsematch<=(cs==s8)?1:0;
end
endmodule

MOORE机中判断的是现态,所以慢一拍

MOORE机中判断次态时,与MEALY机一样,是同步输出的 

输入序列不连续的序列检测

移位寄存器(同一周期内输出,MEALY型)

在输出判断时,由现态与输入信号共同决定

就是在有效时进行移位,然后还要注意,由于是要在同一拍里输出信号,由于移位的更新是在下一位里才进行,所以这个周期里更新的ram,会在下个周期里进行判断,所以就会导致延后,所以输出的判断要结合现态,即MEALY型

`timescale 1ns/1ns
module sequence_detect(input clk,input rst_n,input data,input data_valid,output reg match);
reg[3:0]ram;
always@(posedge clk,negedge rst_n)beginif(!rst_n)beginram=4'b0;endelse if(data_valid)beginram<={ram[2:0],data};endelse beginram<=ram;end
end
always@(posedge clk,negedge rst_n)beginif(!rst_n)beginmatch<=0;endelse beginmatch<=(ram[2:0]==3'b011)&&data&&data_valid;end
end
endmodule

 状态机(MOORE型)

MOORE型的话,只与现态有关,所以输出判断时,用的是ns==,即次态等于什么

而如果是MEALY,就是现态加上输入

`timescale 1ns/1ns
module sequence_detect(input clk,input rst_n,input data,input data_valid,output reg match);parameter idle=0,s0=1,s1=2,s2=3,s3=4;reg[2:0]cs;reg[2:0]ns;always@(posedge clk,negedge rst_n)beginif(!rst_n)begincs<=idle;endelse begincs<=ns;endendalways@(*)begincase(cs)idle:beginif(data_valid)ns=(data==1)?idle:s0;elsens=idle;ends0:beginif(data_valid)ns=(data==1)?s1:s0;else ns=s0;ends1:beginif(data_valid)ns=(data==1)?s2:s0;elsens=s1;ends2:beginif(data_valid)ns=(data==0)?s3:idle;elsens=s2;ends3:beginif(data_valid)ns=(data==0)?s0:idle;endendcaseendalways@(posedge clk,negedge rst_n)beginif(!rst_n)beginmatch<=0;endelse beginmatch<=(ns==s3)?1:0;endend
endmodule

状态机

需要注意,判断次态的MOORE机不满一拍,真正判断那个现态的才是满一拍的

moore机要比Mealy机多一个状态,这个状态表示初始状态

Moore机的输出由当前状态确定,mealy机的输出由当前状态与输入信号共同决定

最后的输出控制由现态单独控制,因此为摩尔机 

蓝色代表输出,摩尔机最后添加了状态S4,从状态转移上看输出节拍会晚一拍,但由于是组合逻辑输出,因此实际上并没有晚一拍

(这个就是说判断次态的MOORE机和MEALY机是一样的输出,即在同一周期内输出,而只有那种真是判断现态的MOORE机才会确实慢一个周期)

摩尔机和米勒机的区别:主要区别在于状态机的输出与当前的状态是否有关,下面用两段式来描述两者的区别。

需要注意的是,如果使用三段式描述法,两者的区别主要聚焦于第三段的判断是基于现态还是次态。

摩尔状态机要比米勒状态机少一个状态,摩尔状态机慢一个周期;米勒状态机使用当前输入和当前状态共同判断,摩尔状态机不需要当前输入。

如果要为moore机的话,那么在输出中,只能判断为次态,即次态是什么;

如果是要mealy机的话,在输出中,要判断为现态与输入信号相结合

这种为Mealy机 ,因为在输出时,输出信号由现态与输入一起控制

二段式 

所谓二段式,实际上就是专门针对MOORE机的写法,因为MOORE机的输出仅取决于现态,然后就是判断现态即可,就判断次态是什么,会晚一个周期输出,而二段式,就是省略了最后一段输出,把它揉进了状态转换里

因为是MOORE机,所以在输出里判断的是次态,不如就直接在状态转换里,确定次态时就确定好了输出

三段式 

次态到现态,用posedge,

在状态转换时,用always@(*)

输出的时候,也用posedge

在第一个和第二个进程中,由于都是同步时序,所以都用<=,在第二个进程里用=

`timescale 1ns/1nsmodule fsm1(input wire clk  ,input wire rst  ,input wire data ,output reg flag
);parameter S0 = 'd0, S1 = 'd1, S2 = 'd2, S3 = 'd3 ;reg [2:0]	current_state;reg [2:0]	next_state;always@(posedge clk or negedge rst)beginif(rst == 1'b0)begincurrent_state <= S0;endelse begincurrent_state <= next_state;endend   always@(*)begincase(current_state)S0:beginnext_state = data ? S1 : S0;endS1:beginnext_state = data ? S2 : S1;endS2:beginnext_state = data ? S3 : S2;endS3:beginnext_state = data ? S0 : S3;enddefault:begin  next_state = S0; endendcaseendalways@(posedge clk or negedge rst)beginif(rst == 1'b0)beginflag <= 1'b0;endelse beginif(current_state == S3)beginif (data) flag <= 1'b1;else flag <= 1'b0;endelse beginflag <= 1'b0;endendendendmodule

这是一个mealy机,

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

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

相关文章

CLion Nova:全新的C/C++ IDE

CLion Nova是一款备受期待的集成开发环境&#xff08;IDE&#xff09;&#xff0c;由JetBrains专门为C/C开发者设计。这款IDE提供了许多新的功能和改进&#xff0c;使用 ReSharper C/Rider C 语言引擎而不是 CLion “传统” 引擎&#xff0c;以满足C/C开发者的需求。目前预览版…

网络层解读

基本介绍 概述 当两台主机之间的距离较远(如相隔几十或几百公里&#xff0c;甚至几千公里)时&#xff0c;就需要另一种结构的网络&#xff0c;即广域网。广域网尚无严格的定义。通常是指覆盖范围很广(远超过一个城市的范围)的长距离的单个网络。它由一些结点交换机以及连接这些…

多输入多输出 | MATLAB实现SSA-CNN麻雀算法优化卷积神经网络多输入多输出预测

多输入多输出 | MATLAB实现SSA-CNN麻雀算法优化卷积神经网络多输入多输出预测 目录 多输入多输出 | MATLAB实现SSA-CNN麻雀算法优化卷积神经网络多输入多输出预测预测效果基本介绍模型背景程序设计参考资料 预测效果 基本介绍 MATLAB实现SSA-CNN麻雀算法优化卷积神经网络多输入…

Mastercam各版本安装指南

Mastercam下载链接 https://pan.baidu.com/s/1OldNR0ERqJFrEN24uu3j0Q?pwd0531 1.鼠标右击【Mastercam2024(64bit)】压缩包&#xff08;win11及以上系统需先点击“显示更多选项”&#xff09;【解压到 Mastercam2024(64bit)】。 2.打开解压后的文件夹&#xff0c;鼠标右击【…

5G阅信助力互联网行业:XX出行-出票通知,案例分析

XX出行日常有大量业务通知短信下发&#xff0c;用户触达频次和用户打开率都比较高&#xff0c;但原短信无法带来附加营销增值&#xff0c;通过阅信增值服务消息将两者结合起来&#xff0c;可实现业务的多渠道引流&#xff0c;开拓了新的渠道和方式。 项目概述&#xff1a; 1. 项…

Github项目推荐-vocal-separate

项目地址 vocal-separate: 项目简述 这是一个音乐和人声分离的项目&#xff0c;基于python开发。有图形化操作界面&#xff0c;看起来还不错。 项目截图

C练习——判断三角形并求面积

题目&#xff1a;从健盘任意输入三角形的三边长为a,b,c,编程判断a,b,c的值能否构成一个三角形&#xff0c;若能构成三角形&#xff0c;则计算并输出三角形的面积&#xff0c;否则提示不能构成三角形。 已知构成三角形的条件是&#xff1a;任意两边之和大于第三边。 解析&#…

再见2023,你好2024

再见2023&#xff0c;你好2024 生活1月 悲伤与治愈2~4月 运动与偏爱5月 体验与美食6月 婚礼与热爱7~8月 就医与别离9~11月 陪伴与暖房12月 体验&新生 运动追剧读书总结 生活 生活是一个修罗场&#xff0c;来世间一场&#xff0c;要经历丰腴有趣的人生。去体验各种滋味&…

Android : 使用GestureDetector 进行手势识别—简单应用

示例图&#xff1a; GestureDetector 介绍&#xff1a; GestureDetector 是 Android 开发中用于识别和处理手势的一个类。它允许开发者检测用户在触摸屏上的各种手势&#xff0c;如滑动、长按、双击等。通过使用 GestureDetector&#xff0c;您可以轻松地为应用程序添加手势识…

【Web API系列】使用异步剪贴板API(async clipboard)的图像的编程复制和粘贴

文章目录 前言一、将数据写入剪切板1. WriteText()2. Write()3. 监听复制事件 二、从剪切板读取数据1.readText()2.read()3. 处理粘贴的文件4. 监听读剪切板事件 三、申请权限政策集成 四、功能检测五、处理多个 MIME 类型 前言 访问系统剪贴板的传统方法是通过 document.exec…

考研后SpringBoot复习1

考研后SpringBoot复习 Hello World入门 复习的版本为SpringBoot2的版本 创建maven项目 在pom文件中导入SpringBoot的依赖同时引入web开发的启动器 <!--声明springboot父项目--><parent><groupId>org.springframework.boot</groupId><artifactId>…

【大模型的前世今生】从自然语言处理说起

自然语言处理&#xff08;Natural Language Processing&#xff0c;简称NLP&#xff09;被誉为人工智能皇冠上的明珠&#xff0c;是计算机科学和人工智能领域的一个重要方向。它主要研究人与计算机之间&#xff0c;使用自然语言进行有效通信的各种理论和方法。简单来说&#xf…

AcWing算法提高课-2.3.1矩阵距离

算法提高课整理 CSDN个人主页&#xff1a;更好的阅读体验 本文同步发表于 CSDN | 洛谷 | AcWing | 个人博客 原题链接 题目描述 给定一个 01 矩阵&#xff0c;求矩阵中每个元素离 1 的最短曼哈顿距离。 输入格式 第一行两个整数 n , m n,m n,m。 接下来一个 n n n 行 …

hadoop hive spark flink 安装

下载地址 Index of /dist ubuntu安装hadoop集群 准备 IP地址主机名称192.168.1.21node1192.168.1.22node2192.168.1.23node3 上传 hadoop-3.3.5.tar.gz、jdk-8u391-linux-x64.tar.gz JDK环境 node1、node2、node3三个节点 解压 tar -zxvf jdk-8u391-linux-x64.tar.gz…

分布式文件系统的介绍

什么是分布式文件系统 跨越多个服务器或者多个位置的文件系统。其中涉及的技术包括数据的复制、数据的分片和路由,由于用户可能存储大文件、图片或者其他类似的需求性文件,因此需要设计不同的系统方便用户访问的存取。 任何设备通过任何网络位置访问文件,就像访问到自己的文…

华清远见作业第十六天

思维导图&#xff1a; 双向循环链表头插入&#xff1a; 代码&#xff1a; Doublelist insert_head(Doublelist head,datatype element) {//创建新节点sDoublelist screate_node();if(NULLs){return head;}s->dataelement;//数据存储//判断链表是否为空if(NULLhead){heads;…

性能测试-jmeter:安装 / 基础使用

一、理解jmeter 官网-Apache JMeter-Apache JMeter™ JMeter是一款开源的性能测试工具&#xff0c;主要用于模拟大量用户并发访问目标服务器&#xff0c;以评估服务器的性能和稳定性。 JMeter可以执行以下任务序号用途描述1性能测试通过模拟多个用户在同一时间对服务器进行请…

limit查询报错问题

分页时候 limit 后面的公式是 (pageNum-1)*pageSize,pageSize 但是在数据库查询时候 当然在.XML中也不能像下面这么写,如果要计算 在业务层或者控制层计算好再传值进来

RAID的介绍和选择

RAID 类型&#xff1a;什么是 RAID 以及哪种 RAID 级别适合您&#xff1f; 一、RAID 简介 在2021年6月11日&#xff0c;亚瑟迪特纳进行了一场关于RAID技术的技术讲座。RAID&#xff0c;即独立磁盘冗余阵列&#xff0c;是将多个硬盘驱动器协同工作的技术。不同的RAID类型各有优…

独立站的设计美学:用户体验的核心要素

随着互联网的普及和发展&#xff0c;独立站已经成为越来越多企业的营销策略之一。独立站的设计美学不仅仅是外观的美观&#xff0c;更是用户体验的核心要素。本文将探讨独立站的设计美学及其对用户体验的影响&#xff0c;并介绍如何通过代码实现美观的网页设计。 一、独立站的设…