verilog手撕代码3——序列检测和序列发生器

news2024/12/22 20:03:49

文章目录

  • 前言
  • 一、序列检测器
    • 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/464471.html

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

相关文章

SpringBoot整合EasyExcel上传下载前后端

SpringBoot整合EasyExcel上传下载前后端 需求&#xff0c;在项目启动时加载表格里的数据初始化&#xff0c;前端可以上传全部部门的表格数据&#xff0c;后台根据部门名字解析归类数据和根据表格的部门下载部门数据1.后端1.1创建一个SpringBoot项目&#xff0c;引入依赖1.2 在r…

推荐几个可以免费体验GPT-4的网站

想要体验GPT-4除了每月花20美刀还有别的办法吗&#xff1f;&#xff08;甚至现在有钱都花不了&#xff09; 问就是有的&#xff0c;我搜罗了一些可以免费使用GPT-4的网站&#xff08;注意需要魔法&#xff09;&#xff0c;体验之后觉得还行&#xff0c;推荐给大家。 有别的大…

JavaWeb学习笔记

文章目录 一. HTML二. CSS三. JavaScript1. 引入2.语法/输出语句3. 变量/数据类型4. 运算符5. 流程控制语句6. 函数7. 对象8. 事件监听 四. Servlet1.执行流程2. 生命周期3. 常用方法4. 体系结构5. 配置Servlet 五. JSP1. 简介2. JSP原理3.脚本4.JSP缺点5. EL表达式6. JSTL标签…

AI+HPC?人工智能高性能计算方向就业新路子

刚刚过去的3月&#xff0c;GPT-4刷屏了。吃瓜群众一边津津乐道&#xff0c;一边瑟瑟发抖。随后国产大模型紧随其后&#xff0c;百度的“文心一言”、阿里的“通义千问”、复旦大学的“MOSS”、商汤的“商量”竞赛般的亮家伙&#xff0c;有点全民练模型&#xff0c;人人GPT的味道…

【最新】Jetson Agx Xavier烧录环境到TensorRT加速(高集成,快速简单有效)

一.下载烧录好的基础镜像 1. 基础环境 当前镜像包是ubuntu18.08,镜像。镜像包已安装jetpack 4.6,python3.6 &#xff0c;torch1.7, opencv, tensorrt等&#xff0c;运行模型的基本环境都已搭建。jetpack 是4.6 对应L4T是32.6.1。如下图&#xff1a; (1).下载当前文件包&…

OSCP-Escape(gif绕过)

目录 扫描 WEB 扫描 sudo nmap 192.168.233.113 -p- -sS -sVPORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0) 80/tcp open http Apache httpd 2.4.29 ((Ubuntu)) 8080/tcp open http Apache…

Golang中的一些关键字(defer、:=、go func())

作者&#xff1a;非妃是公主 专栏&#xff1a;《Golang》 博客主页&#xff1a;https://blog.csdn.net/myf_666 个性签&#xff1a;顺境不惰&#xff0c;逆境不馁&#xff0c;以心制境&#xff0c;万事可成。——曾国藩 文章目录 defervar与 : 的区别var:二者区别 go func de…

antDesignPro6项目:供应链系统—实战问题解决汇总

系统使用的技术&#xff1a;antDesignPro6 Umi4 antDesign antDesignProComponents 其他技术 1、如何设置ModalForm组件&#xff0c;销毁时&#xff0c;自动重置表单&#xff1f; modalProps{{ destroyOnClose: true }} // 重置表单 答&#xff1a;给ModalForm组件添加mo…

智加科技+舍弗勒,首发量产正向开发的智能重卡冗余转向

对于自动驾驶赛道来说&#xff0c;感知、规划和控制&#xff0c;除了计算平台、算法等核心上层软硬件支持&#xff0c;底盘控制系统同样是关键一环。事实上&#xff0c;从Demo到规模化量产&#xff0c;更好的车身控制能力以及冗余备份&#xff0c;也是自动驾驶公司迈入2.0阶段的…

中介作用分析流程

中介作用分析流程 一、案例背景 家庭氛围对于学生成长具有重要的意义。好的家庭氛围能够增强学生的家庭幸福感&#xff0c;促进学生良好性格的形成。在这个过程中&#xff0c;父子沟通与母子沟通对于家庭氛围和家庭幸福感都具有显著影响作用。现在有一项研究想要探究父子沟通和…

企业级信息系统开发讲课笔记3.2 基于Java配置类整合SSM框架实现用户登录

文章目录 零、本节学习目标一、采用MVC架构二、用户登录运行效果三、基于Java配置类整合SSM框架实现用户登录&#xff08;一&#xff09;创建数据库与表1、创建数据库2、创建用户表3、在用户表里插入记录 &#xff08;二&#xff09;创建Maven项目&#xff08;三&#xff09;添…

带你打开GCC的大门

START hi&#xff0c;大家好&#xff01; 今天带大家了解一下GCC。 首先说一句&#xff1a;大写的GCC和小写的gcc不是一个东西呦&#xff0c;下面我们慢慢道来... 1. GCC是什么&#xff1f; GNU Compiler Collection (GCC)是GNU项目开发的编译工具集&#xff0c;支持各种编…

abaqus和ansys做仿真哪个更好

当你要模拟仿真一个机械模型时&#xff0c;通常会听到ABAQUS或ANSYS&#xff0c;最常见的问题是哪个更好&#xff1f;无论是工程设计师还是初学者&#xff0c;通常会问这个问题或类似的问题。在本文中介绍了 Abaqus 与 Ansys&#xff0c;您将了解这些问题的答案。 1-ANSYS&…

数据库8之嵌套查询

上一篇文章讲到连接查询&#xff0c;连接查询就是一个一个去查找相匹配的行&#xff0c;再返回给用户看。当我们数据量少的时候我们用连接查询没有太大问题&#xff0c;可是&#xff0c;当数据量大的时候&#xff0c;连接查询效率显然不高。这个时候我们可以用嵌套查询&#xf…

Oracle跨服务器取数——DBlink 初级使用

前言 一句话解释DBlink是干啥用的 实现跨库访问的可能性. 通过DBlink我们可以在A数据库访问到B数据库中的所有信息,例如我们在加工FDS层表时需要访问ODS层的表,这是就需要跨库访问 一、DBlink的分类 private&#xff1a;用户级别&#xff0c;只有创建该dblink的用户才可以使…

Maven 下载及配置详细步骤

1、Maven 下载 Maven 官网地址:https://maven.apache.org/download.cgi(opens new window) 进入 Maven 官网,点击 archives 下载版本 3.6.2 找到下载的压缩包并解压

传统协议大比拼之IP协议

文章目录 一、引言二、IP协议的基本特点2.1 IP协议的作用和基本功能2.2 地址管理手动分配IP动态主机配置协议(DHCP)网络地址转换(NAT)IPv6 2.2 路由选择RIP(距离向量型的协议)OSPF(链路状态类型协议)BGP(边界网关协议) 2.3 IP协议的特点&#xff1a; 三、IP地址的组成3.1 IP地址…

kong(6):身份认证

1 Basic Auth身份认证配置 Basic Auth插件 # 在服务上配置插件 curl -X POST http://127.0.0.1:8001/services/{service}/plugins --data "namebasic-auth" --data "config.hide_credentialstrue"#在路由上配置插件 curl -X POST http://127.0.0.1:8001/…

上海亚商投顾:沪指全天震荡微跌 新能源赛道股集体反弹

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 市场情绪 大小指数今日走势分化&#xff0c;沪指探底回升小幅下跌&#xff0c;创业板指盘中涨超2%&#xff0c;午后涨幅有所…

基于centos7:Harbor-2.7.2部署和安装教程

基于centos7&#xff1a;Harbor-2.7.2部署和安装教程 1、软件资源介绍 Harbor是VMware公司开源的企业级DockerRegistry项目&#xff0c;项目地址为https://github.com/vmware/harbor。其目标是帮助用户迅速搭建一个企业级的Dockerregistry服务。它以Docker公司开源的registry…