序列检测和序列发生器——verilog代码实现

news2024/12/23 13:10:23

文章目录

  • 前言
  • 一、序列检测器
    • 1.1 重复序列检测
      • 1.1.1 序列缓存对比/移位寄存器法
      • 1.1.2 状态机法
    • 1.2 非重复序列检测
  • 二、序列发生器
    • 2.1 移位寄存器法
    • 2.2 反馈法
    • 2.3 计数器法


前言

2023.4.25
2023.4.26 学习打卡,天气转晴


一、序列检测器

1.1 重复序列检测

1.1.1 序列缓存对比/移位寄存器法

把输入的数据缓存到数组,然后与目标进行对比

例1:检测序列0111_0001,满足序列输出为1

在这里插入图片描述

module sequence_detect(
	input clk,
	input rst_n,
	input a,
	output reg match
	);

	reg [7:0] a_tem;
	
	always @(posedge clk or negedge rst_n)
		if (!rst_n) 
			match <= 1'b0;
		else    //检测到目标序列的下一个周期输出高电平
			match <= (a_tem == 8'b0111_0001) ? 1'b1 : 1'b0;   
		
	always @(posedge clk or negedge rst_n)
		if (!rst_n)
			a_tem <= 8'b0;
		else 
			a_tem <= {a_tem[6:0],a};
endmodule

例2:检测序列1101,用移位寄存器实现
在这里插入图片描述

module detect_1101(
	input clk,
	input rst_n,
	input a,
	output data_out
);
	reg [3:0] a_r;
	
	always@(posedge clk or negedge rst_n)begin
		if(!rst_n)
			a_r <= 4'b0;
		else
			a_r <= {a_r[2:0], a};
	end
	
	assign data_out = a_r[3] & a_r[2] & ~a_r[1] & a_r[0];
endmodule

例3含有无关项的序列检测
检测序列001_xxx_110,中间三位不关心,这种题目的话也可以是缓存序列对比

match <= (a_r[8:6]==3'b001 && a_r[2:0]==3'b110) ? 1 : 0;

例4:输入数据使能有效,不是所有输入数据都有效,检测0110序列
data_valid=1的时候缓存数据,同理再进行比较(注意输出match为高电平的周期是什么时候,这里的match相当于和序列同时输出,只要满足就输出了)

在这里插入图片描述

module sequence_detect(
	input clk,
	input rst_n,
	input data,
	input data_valid,
	output reg match
	);

	reg [3:0] data_r;

	always @(posedge clk or negedge rst_n)begin
		if (!rst_n)
			data_r <= 4'b0;
		else 
			data_r <= data_valid ? {data_r[2:0], data} : data_r;	
	end
	
	always @(posedge clk or negedge rst_n)begin
		if (!rst_n) 
			match <= 1'b0;
		else    
			match <=  ({data_r[2:0], data}==4'b0110) ? 1 : 0;
	end
endmodule

1.1.2 状态机法

一般是三段式状态机

  • Moore型:输出信号只取决于当前状态;
  • Mealy型:输出信号不仅取决于当前状态,还取决于输入;
  • 实现相同的功能时,Mealy型比Moore型能节省一个状态(大部分情况下能够节省一个触发器资源),Mealy型比Moore型输出超前一个时钟周期。

例1:用Moore型状态机实现序列“1101”从左至右的不重叠检测。

在这里插入图片描述

module det_moore(
   input                clk   ,
   input                rst_n ,
   input                din   ,
 
   output	reg         Y   
);
    parameter idle=0,s0=1,s1=2,s2=3,s3=4;
    reg [2:0] state,nx;
    
    always@(posedge clk or negedge rst_n)begin
        if(!rst_n)
            state<=idle;
        else
            state<=nx;
    end
    
    always@(*)begin
        case(state)
            idle: nx=din?s0:idle;
            s0: nx=din?s1:idle;
            s1: nx=din?s1:s2;
            s2: nx=din?s3:idle;
            s3: nx=din?s0:idle;
            default: nx=idle;
        endcase
    end
    
    always@(posedge clk or negedge rst_n)begin
        if(!rst_n)
            Y <= 0;
        else 
            Y <= (state==s3) ? 1 : 0;
    end
endmodule

1.2 非重复序列检测

例1:检测输入信号(a)是否满足011100序列, 要求以每六个输入为一组,不检测重复序列,例如第一位数据不符合,则不考虑后五位。一直到第七位数据即下一组信号的第一位开始检测。当信号满足该序列,给出指示信号match。当不满足时给出指示信号not_match。(每六个数为一组进行检查)

分析:和移位寄存器有所不同,这种是缓存六个数据比较后,要清空所有的数据,然后再次缓存新的六个数据比较,所以需要用到计数器

match和not_match仅在cnt==5时才进行更新,且nm状态在cnt == 5以及data==0的时候才会跳转到新的有效状态,否则一直都会是nm。

在这里插入图片描述

module sequence_detect(
	input clk,
	input rst_n,
	input data,
	output reg match,
	output reg not_match
	);

	reg [2:0] state,nx;
	reg [2:0] cnt;
	parameter s0=0,s1=1,s2=2,s3=3,s4=4,s5=5,s6=6,nm=7;

	always@(posedge clk or negedge rst_n)begin
		if(!rst_n)begin
			cnt<=0;
		end
		else if(cnt==5)
			cnt<=0;
		else
			cnt<=cnt+1;
	end


	always@(posedge clk or negedge rst_n)begin
		if(!rst_n)begin
			state<=0;
		end
		else 
			state<=nx;
	end

	always@(*)begin
		case(state)
			s0:nx<=data?nm:s1;
			s1:nx<=data?s2:nm;
			s2:nx<=data?s3:nm;
			s3:nx<=data?s4:nm;
			s4:nx<=data?nm:s5;
			s5:nx<=data?nm:s6;
			s6:nx<=data?s0:nm;
			nm:nx<=(cnt==5 && data==0)?s1:nm;  //只有同时满足两个条件才会跳转,否则一直是nm
			default:nx<=s0;
		endcase
	end

	always@(posedge clk or negedge rst_n)begin
		if(!rst_n)begin
			match<=0;
			not_match<=0;
		end
		else if(cnt==5)begin
			if(nx==s6)begin
				match<=1;
				not_match<=0;
			end
			else begin
				match<=0;
				not_match<=1;
			end
		end
		else begin
			match<=0;
			not_match<=0;
		end
	end
endmodule

二、序列发生器

2.1 移位寄存器法

例1:循环输出序列001011

module sequence_generator(
	input clk,
	input rst_n,
	output reg data
	);
    
    reg [5:0] q;
    
    always@(posedge clk or negedge rst_n)
        if (!rst_n)
            q <= 6'b001011;
        else
            q <= {q[4:0],q[5]};  //序列左移
    
    always@(posedge clk or negedge rst_n)
        if (!rst_n)
            data <= 1'd0;
        else 
            data <= q[5];
endmodule

2.2 反馈法

移位寄存器组合逻辑生成,也是寄存器的某一位输出端输出循环序列,但是使用到的寄存器数目减少了。

  • 根据给定序列信号的循环周期M,确定移位寄存器位数n,2^ (n-1) < M ≤ 2^n。如果发现序列中有状态重复的话,就把n加一。
  • 根据M个不同的状态列出移位寄存器的态序表和反馈函数表,求出反馈函数F的表达式。
  • 各个寄存器的输出需要经过反馈网络,然后才连接到移位寄存器的输入端
  • 检查自启动:电路能从无效状态进入有效状态

序列001011:至少需要3位,列出状态,001-010-101-011-110-100,可以看到寄存器高位Q2输出的数据就是我们想要的序列。

Q2Q1Q0F
0010
0101
1011
0110
1100
1001

根据上面的反馈函数表,画出卡诺图,可以写出F的表达式如下。然后把这些组合逻辑接到Q0的输入端即可。

在这里插入图片描述

F = Q2 & ~Q1 | ~Q2 & Q1 & ~Q0;

可以看到,上面000和111的状态是无关项,可以把其设置为1和0,这样F的表达式可以进一步化简。同时画出状态转移图,是可以自启动的。

F = Q2 & ~Q1 | ~Q2 & ~Q0;

在这里插入图片描述

module generate_001110(
	input clk, 
	input rst_n,
	input [2:0] D,
	output q
	);
	
	reg [2:0] q_r;
	wire Din;
	
	always@(posedge clk or negedge rst_n)begin
		if(!rst_n)
			q_r <= D;
		else
			q_r <= {q_r[1:0], Din};
	end
	
	assign q = q_r[2];
	assign Din = q_r[2] & ~q_r[1] | ~q_r[2] & ~q_r[0];
endmodule	

2.3 计数器法

产生序列:001110,计数器范围为0-5,分别对应输出序列各个值。
由卡诺图化简可以得到Z的最简表达式。

Q2Q1Q0Z
0000
0010
0101
0111
1001
1010
module seq_gen_count(
    input clk,
    input rst_n,
    output seq
    );

	reg [2:0]count;
	always@(posedge clk or negedge rst_n)begin
	    if(!rst_n)
	        count <= 0;
	    else
	        count <= (count == 5) ? 0 : count + 1;
	end

	assign seq = (!count[2] & count[1]) | (count[2] & !count[1] & !count[0]);
endmodule

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

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

相关文章

HTML基础标签

目录 1.html文件结构 2.注释 3.文本标签 4.图片 5.音频与视频 6.超链接 7.表单 8.列表&#xff08;可以嵌套&#xff09; 无序列表 有序列表 定义列表 9.表格 10.语义标签 11.特殊符号 1.html文件结构 <!-- 文档类型声明 --> <!DOCTYPE html> <html>…

学系统集成项目管理工程师(中项)系列12_干系人管理

1. 要管理干系人的期望&#xff0c;更要保证他们的适度参与&#xff0c;而后者是项目成功非常关键的因素之一 1.1. 识别干系人及其信息 1.2. 评估关键干系人的诉求和影响力 1.3. 对干系人分类 1.4. 制定干系人管理计划 1.5. 【19上选56】 2. 识别干系人 2.1. 典型干系人…

如何解决宝塔面板nginx占用80端口的问题

前言: 由于使用Docker部署前端项目老是报错说80端口被占用,所以不得不去查找原因并且解决 上网查了很多资料说修改80端口这对我(有点强迫症)来说修改让我很难受 开始: 我们去找到虚拟机的这个目录 /www/server/panel/vhost/nginx 然后直接修改下面的文件 修改文件的端口 最…

windows中python安装保姆教程

猜你感兴趣 牛逼的python库-使用Pyinstaller将python打包成exe使用python实现自动点击功能python进程&#xff0c;线程&#xff0c;协程简介快速搭建私有pip镜像源 简介 Python 是一种开源的解释型脚本编程语言&#xff0c;Python简单易用&#xff0c;学习成本低&#xff0c;…

ChatGLM-6B的P-Tuning微调详细步骤及结果验证

文章目录 1. ChatGLM-6B1.1 P-Tuning v2简介 2. 运行环境2.1 项目准备 3.数据准备4.使用P-Tuning v2对ChatGLM-6B微调5. 模型评估6. 利用微调后的模型进行验证6.1 微调后的模型6.2 原始ChatGLM-6B模型6.3 结果对比 1. ChatGLM-6B ChatGLM-6B仓库地址&#xff1a;https://githu…

<<c和指针>>温故及问题研讨(第三章)

第三章-数据 1. 前言2. 基本数据类型2.1 整型家族2.2 字面值常量 3. 基本声明3.1 数组的声明以及引用3.2 指针的声明注意事项3.3 隐式声明 4. 常量5. 作用域5.1 代码块作用域5.2 文件作用域5.3 原型作用域 6. 链接属性6.1 链接属性分类以及作用范围6.2 关键字:extern和static6.…

数据库基础篇 《18.MySQL8其它新特性》

第18章_MySQL8其它新特性 1. MySQL8新特性概述 MySQL从5.7版本直接跳跃发布了8.0版本&#xff0c;可见这是一个令人兴奋的里程碑版本。MySQL 8版本在功能上做了显著的改进与增强&#xff0c;开发者对MySQL的源代码进行了重构&#xff0c;最突出的一点是多MySQL Optimizer优化…

GPT详细安装教程-GPT软件国内也能使用

GPT (Generative Pre-trained Transformer) 是一种基于 Transformer 模型的自然语言处理模型&#xff0c;由 OpenAI 提出&#xff0c;可以应用于各种任务&#xff0c;如对话系统、文本生成、机器翻译等。GPT-3 是目前最大的语言模型之一&#xff0c;其预训练参数超过了 13 亿个…

LeetCode:206. 反转链表

&#x1f34e;道阻且长&#xff0c;行则将至。&#x1f353; &#x1f33b;算法&#xff0c;不如说它是一种思考方式&#x1f340; 算法专栏&#xff1a; &#x1f449;&#x1f3fb;123 一、&#x1f331;206. 反转链表 题目描述&#xff1a;给你单链表的头节点 head &#x…

Sharding-JDBC之垂直分库水平分表

目录 一、简介二、maven依赖三、数据库3.1、创建数据库3.2、订单表3.3、用户表 四、配置&#xff08;二选一&#xff09;4.1、properties配置4.2、yml配置 五、实现5.1、实体5.2、持久层5.3、服务层5.4、测试类5.4.1、保存订单数据5.4.2、查询订单数据5.4.3、保存用户数据5.4.4…

Android SeekBar控制视频播放进度(二)——seekTo()不准确

Android SeekBar控制视频播放进度二——seekTo不准确 简介seekTo()视频帧 和 视频关键帧解决办法方法一方法二 简介 上一篇文章中&#xff0c;我们介绍了使用SeekBar控制视频播放&#xff0c;使用过程中发现&#xff0c;对于一些视频&#xff0c;我们拖动SeekBar进度条调节播放…

喜报 | ScanA内容安全云监测获评“新一代信息技术创新产品”

4月20日&#xff0c;在赛迪主办的2023 IT市场年会上&#xff0c;“年度IT市场权威榜单”正式发布。 知道创宇的ScanA内容安全云监测产品荣获“新一代信息技术创新产品”奖项。作为中国IT业界延续时间最长的年度盛会之一&#xff0c;历届IT市场年会公布的IT市场权威榜单已成为市…

备份数据看这里,免费教你苹果手机怎么备份所有数据!

案例&#xff1a;苹果手机怎么算备份成功&#xff1f; 【友友们&#xff0c;手机恢复出厂设置前&#xff0c;怎么样可以备份苹果手机里面的所有数据&#xff1f;】 苹果手机备份数据对于用户来说是非常重要的。在备份数据的同时&#xff0c;还需要学会如何恢复误删的数据。那么…

【微服务笔记22】微服务组件之Sentinel控制台的使用(Sentinel Dashboard)

这篇文章&#xff0c;主要介绍微服务组件之Sentinel控制台的使用&#xff08;Sentinel Dashboard&#xff09;。 目录 一、Sentinel控制台 1.1、下载Dashboard控制台 1.2、搭建测试工程 &#xff08;1&#xff09;引入依赖 &#xff08;2&#xff09;添加配置信息 &#…

微服务生态 -- dubbo -- dubbo3应用级别服务发现(阅读官方文档)

服务发现概述 从 Internet 刚开始兴起&#xff0c;如何动态感知后端服务的地址变化就是一个必须要面对的问题&#xff0c;为此人们定义了 DNS 协议&#xff0c;基于此协议&#xff0c;调用方只需要记住由固定字符串组成的域名&#xff0c;就能轻松完成对后端服务的访问&#x…

236. 二叉树的最近公共祖先【190】

难度等级&#xff1a;中等 上一篇算法&#xff1a; 103. 二叉树的锯齿形层序遍历【191】 力扣此题地址&#xff1a; 236. 二叉树的最近公共祖先 - 力扣&#xff08;Leetcode&#xff09; 1.题目&#xff1a;236. 二叉树的最近公共祖先 给定一个二叉树, 找到该树中两个指定节点…

【MySQL】数据表的增删查改

1、CRUD的解释 C&#xff1a;Create增加 R&#xff1a;Retrieve查询 U&#xff1a;Update更新 D&#xff1a;Deleta删除 2、添加数据 2.1 添加一条记录 添加数据是对表进行添加数据的&#xff0c;表在数据库中&#xff0c;所以还是得先选中数据库&#xff0c;选中数据库还在进行…

STM32F429移植microPython笔记

目录 一、microPython下载。二、安装开发环境。三、编译开发板源码。四、下载验证。 一、microPython下载。 https://micropython.org/download/官网 下载后放在linux中。 解压命令&#xff1a; tar -xvf micropython-1.19.1.tar.xz 二、安装开发环境。 sudo apt-get inst…

MUSIC算法仿真

DOA波达方向估计 DOA&#xff08;Direction Of Arrival&#xff09;波达方向是指通过阵列信号处理来估计来波的方向&#xff0c;这里的信源可能是多个&#xff0c;角度也有多个。DOA技术主要有ARMA谱分析、最大似然法、熵谱分析法和特征分解法&#xff0c;特征分解法主要有MUS…

HTML+CSS+JS 学习笔记(四)———jQuery

&#x1f331;博客主页&#xff1a;大寄一场. &#x1f331;系列专栏&#xff1a;前端 &#x1f331;往期回顾&#xff1a; &#x1f618;博客制作不易欢迎各位&#x1f44d;点赞⭐收藏➕关注​​ 目录 jQuery 基础 jQuery 概述 下载与配置jQuery 2. 配置jQuery jQuery 选…