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

verilog移位寄存器实现序列检测

题目来源:牛客VL26

  请编写一个序列检测模块,检测输入信号a是否满足011XXX110序列(长度为9位数据,前三位是011,后三位是110,中间三位不做要求),当信号满足该序列,给出指示信号match。
程序的接口信号图如下:
在这里插入图片描述  序列检测常用的两种方法,一种就是状态机(FSM) 另一种是 移位寄存器 ,由于本题序列较多,而且默认是重复序列检测,因此考虑到重复性,需要对X进行分类讨论(有可能存在含X构成的重复序列),这样的状态机会异常复杂,而使用移位寄存器的方法,会简单许多。
  而移位寄存器,是一种类似于数据结构中的队列,有着 先入先出(FIFO) 的关系。本题需要检测的序列总共9位,因此将移位寄存器设置为9位,clk触发,rst_n复位的同步电路。其框图如下。
在这里插入图片描述  数据以数据流的形式随着时钟的上升沿进入/移出移位寄存器。寄存器中存入的数据就表示当前连续9bit的内容,将对应位与需要检测的数据进行比较,如果满足要求则输出检测到序列的标志。
实现代码如下

`timescale 1ns/1ns
module sequence_detect(
	input clk,
	input rst_n,
	input a,
	output reg match
	);
reg [8:0] buff_s;
always @(posedge clk or negedge rst_n) begin
    if(~rst_n)
        buff_s<=9'b0_0000_0000;//清除队列
    else
        buff_s<={a,buff_s[8:1]};//寄存器移位
end
always@(posedge clk or negedge rst_n)begin//比较器部分
    if(~rst_n)
        match<=0;
    else
        begin
        if((buff_s[8:6]==3'b011)&&(buff_s[2:0]==3'b110))//if语句用于屏蔽x输入类型
            match<=1;
        else
            match<=0;
        end
end
  
endmodule

不重叠序列检测的情况

题目来源:牛客VL27

  请编写一个序列检测模块,检测输入信号(a)是否满足011100序列, 要求以每六个输入为一组,不检测重复序列,例如第一位数据不符合,则不考虑后五位。一直到第七位数据即下一组信号的第一位开始检测。当信号满足该序列,给出指示信号match。当不满足时给出指示信号not_match
在这里插入图片描述
  不重叠序列检测的核心就是定时检测,将序列划分成一组一组。例如对于9位的移位寄存器,可以设置一个检测计数器,每次计数到9时,表明上一组数据已经全部移出移位寄存器,可以进行一次新的数据比较器的检测操作。框图如下
在这里插入图片描述实现代码如下

	`timescale 1ns/1ns
module sequence_detect(
	input clk,
	input rst_n,
	input data,
	output reg match,
	output reg not_match
	);
reg [5:0] shift_reg;
reg [2:0] count;
always @(posedge clk or negedge rst_n) begin
    if(~rst_n)
        shift_reg<=6'b00_0000;//清空队列
    else
        shift_reg<={data,shift_reg[5:1]};//移位
end
//计数模块
always @(posedge clk or negedge rst_n) begin
    if(~rst_n)
        count<=3'b0;
    else
        if(count==3'b101)
            count<=3'b0;
        else    
            count<=count+1;
end
always @(posedge clk or negedge rst_n) begin
    if(~rst_n)
        begin
        match<=0;
        not_match<=0;
        end
    else
        begin
          if(count==3'b101)
            if(shift_reg==6'b011100)
                begin
                    match<=1;
                    not_match<=0;
                end
            else
                begin
                    match<=0;
                    not_match<=1;
                end              
          else
          begin
            match<=0;
            not_match<=0;
          end
        end
end
endmodule

相关文章:

  • 前端性能优化方法与实战02 性能瓶颈点:从 URL 输入到页面加载整过程分析
  • 34.0、C语言——C语言预处理(2) - 预编译(预处理)详解(2)
  • ES优化实战 - 小操作节省百分之三十以上的磁盘空间
  • [Go WebSocket] 多房间的聊天室(五)用多个小锁代替大锁,提高效率
  • 我在windows环境下的YOLOV3环境搭建过程
  • bat goto 还是 call
  • JVM垃圾回收系列之垃圾收集算法
  • 计算机毕业设计选题推荐 40个高质量计算机毕设项目分享【源码+论文】(三)
  • BDD - SpecFlow BDD 测试实践 SpecFlow + MSTest
  • CRM项目记录(四)
  • React组件的生命周期函数
  • FFmpeg源码分析:avformat_open_input()打开媒体流
  • 深入理解关键字 一(auto,register,static,sizeof)
  • 基于Springboot+vue的停车场管理系统(Java毕业设计)
  • 详解CAN总线:CAN总线报文格式—数据帧
  • ES6指北【2】—— 箭头函数
  • android图片蒙层
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • HTTP那些事
  • Javascripit类型转换比较那点事儿,双等号(==)
  • laravel with 查询列表限制条数
  • Lucene解析 - 基本概念
  • Mysql数据库的条件查询语句
  • redis学习笔记(三):列表、集合、有序集合
  • underscore源码剖析之整体架构
  • Webpack入门之遇到的那些坑,系列示例Demo
  • XForms - 更强大的Form
  • Yii源码解读-服务定位器(Service Locator)
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 从零搭建Koa2 Server
  • 翻译:Hystrix - How To Use
  • 搞机器学习要哪些技能
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 前端之Sass/Scss实战笔记
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 试着探索高并发下的系统架构面貌
  • 通过几道题目学习二叉搜索树
  • 线性表及其算法(java实现)
  • 《码出高效》学习笔记与书中错误记录
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • ​ArcGIS Pro 如何批量删除字段
  • ​HTTP与HTTPS:网络通信的安全卫士
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • #Linux(帮助手册)
  • #QT(一种朴素的计算器实现方法)
  • #Ubuntu(修改root信息)
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • (十) 初识 Docker file
  • (转载)从 Java 代码到 Java 堆
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .NET Core WebAPI中封装Swagger配置
  • .NetCore Flurl.Http 升级到4.0后 https 无法建立SSL连接