【Verilog学习日常】—牛客网刷题—Verilog进阶挑战—VL25

ops/2024/10/18 16:50:44/

输入序列连续的序列检测

描述

请编写一个序列检测模块,检测输入信号a是否满足01110001序列,当信号满足该序列,给出指示信号match。

模块的接口信号图如下:

模块的时序图如下:

请使用Verilog HDL实现以上功能,并编写testbench验证模块的功能

输入描述:

clk:系统时钟信号

rst_n:异步复位信号,低电平有效

a:单比特信号,待检测的数据

输出描述:

match:当输入信号a满足目标序列,该信号为1,其余时刻该信号为0

 解题思路

思路一:经典有限状态机三段式

与【Verilog学习日常】—牛客网刷题—Verilog快速入门—VL70-CSDN博客的思路一致;

可设置以下状态:

IDLE(S0):初始状态,表示电路还没有收到任何一个有效数值;

S1:表示电路收到一个有效的“0”;

S2:表示电路收到两个有效的“01”;

S3:表示电路收到三个有效的“011”;

S4:表示电路收到四个有效的“0111”;

S5:表示电路收到五个有效的“01110”;

S6:表示电路收到六个有效的“011100”;

S7:表示电路收到七个有效的“0111000”;

S8:表示电路收到七个有效的“01110001”;

根据输出表述,“当输入信号a满足目标序列时,match信号为1,”因此可画出如下所示的状态转移图状态转移表

格雷码的相关知识

Gray码也称为循环码,其最基本的特性是任何相邻的两组代码中,仅有一位数码不同,因而又称为单位距离码。减少了产生毛刺和一些暂态的可能

Gray码的编码方式有多种,典型的格雷码如下所示:

十进制数二进制码Gray码
B3B2B1B0G3G2G1G0
000000000
100010001
200100011
300110010
401000110
501010111
601100101
701110100
810001100
910011101
1010101111
1110111110
1211001010
1311011011
1411101001
1511111000

从上述表中可以看出,这种编码除了具有单位距离码的特点之外,还有一个特点就是具有反射特性;例如上表中的不同颜色的字体部分(),除最高位互补反射外,其余低位数沿对称轴镜像对称、利用这一反射特性可以方便地构成位数不同的Gray码

Gray码的单位距离特性具有很重要的意义。假如两个相邻的十进制数13和14,相应的二进制码为1101和1110;若使用二进制数进行加1计数时,如果从13变成14,二进制码的最低两位都要改变,但实际上两位改变不可能完全同时发生,若先最低位置0,然后次低位再置1,则中间会出现1101-1100-1110,即出现短暂的1100;由于格雷码只有一位编码,因此完全杜绝了这种错误的发生

代码如下
`timescale 1ns/1ns
module sequence_detect(input clk,input rst_n,input a,output reg match);reg [3:0] current_state, next_state;
//格雷码
parameter [3:0] IDLE = 4'b0000;
parameter [3:0] S1 = 4'b0001;
parameter [3:0] S2 = 4'b0011;
parameter [3:0] S3 = 4'b0010;
parameter [3:0] S4 = 4'b0110;
parameter [3:0] S5 = 4'b0111;
parameter [3:0] S6 = 4'b0101;
parameter [3:0] S7 = 4'b0100;
parameter [3:0] S8 = 4'b1100;always @(posedge clk or negedge rst_n) beginif (!rst_n)	current_state <= IDLE;else		current_state <= next_state;
endalways @(*) begincase(current_state)IDLE: if (a == 1'b0) next_state = S1; else next_state = IDLE;S1:   if (a == 1'b1) next_state = S2; else next_state = S1;S2:   if (a == 1'b1) next_state = S3; else next_state = S1;S3:	  if (a == 1'b1) next_state = S4; else next_state = S1;S4:   if (a == 1'b0) next_state = S5; else next_state = IDLE;S5:   if (a == 1'b0) next_state = S6; else next_state = S2;S6:   if (a == 1'b0) next_state = S7; else next_state = S2;S7:   if (a == 1'b1) next_state = S8; else next_state = S1;S8:   if (a == 1'b0) next_state = S1; else next_state = S3;default: next_state = IDLE;endcase
endalways @(posedge clk or negedge rst_n) beginif (!rst_n) match <= 1'b0;else begincase (current_state) IDLE: match = 1'b0;S1:   match = 1'b0;S2:   match = 1'b0;S3:   match = 1'b0;S4:   match = 1'b0;S5:   match = 1'b0;S6:   match = 1'b0;S7:   match = 1'b0;S8:   match = 1'b1;default:   match = 1'b0;endcaseend
end
endmodule

思路二:使用移位寄存器

移位寄存器可以用来实现数据的串并转换,也可以构成移位行计数器,进行计数、分,还可以构成序列码发生器、序列码检测器等,它也是数字系统中应用非常广泛的时序逻辑之一;

代码如下:

根据检测序列位数确定寄存器的位数

`timescale 1ns/1ns
module sequence_detect(input clk,input rst_n,input a,output reg match);//代码二
//使用8位移位寄存器
reg [7:0] shift_q;
//注意:必须使用非阻塞赋值语句(若使用 "="会报错)
always @(posedge clk or negedge rst_n) beginif (!rst_n) begin shift_q <= 8'b0000_0000; match <= 1'b0; endelse beginshift_q [7:0] <= {shift_q[6:0], a};if (shift_q == 8'b0111_0001) match <= 1'b1;else	match <= 1'b0;end
end
endmodule


http://www.ppmy.cn/ops/122521.html

相关文章

用Sklearn和Statsmodels来做linear_regression和Logistic_regression注意事项

用Sklearn和Statsmodels来做linear_regression和Logistic_regression注意事项&#xff0c;区别。主要在于 intercept 项&#xff0c;和 regularization。 X np.array([-1, 0, 1]) # 自变量 Y np.array([-2, 0, 5]) # 因变量一、Linear regression 的截距项 又叫 intercep…

操作系统_名词_文件下载_反弹SHELL_防火墙绕过

操作系统 操作系统-用途&命令&权限&用户&防火墙 1、个人计算机&服务器用机 2、windows&Linux常见命令 3、文件权限&服务权限&用户权限 4、系统用户&用户组&服务用户等分类 5、自带防火墙出站&入站规则策略协议 实用案例1&#x…

Leetcode—152. 乘积最大子数组【中等】

2024每日刷题&#xff08;174&#xff09; Leetcode—152. 乘积最大子数组 C实现代码 class Solution { public:int maxProduct(vector<int>& nums) {int n nums.size();int mx nums[0];int mn nums[0];int ans mx;for(int i 1; i < n; i) {const int prem…

认知战认知作战:认知战与安全挑战中方企业在海外的应对策略分析

认知战认知作战&#xff1a;认知战与安全挑战中方企业在海外的应对策略分析 关键词&#xff1a;认知战, 中方企业, 恐怖袭击, 安全挑战, 信息传播, 社会责任, 风险管理, 国际合作,认知作战,新质生产力,人类命运共同体,认知战,认知域,认知战研究中心,认知战争,认知战战术,认知战…

Redis——分布式锁

在一个分布式系统中&#xff0c;只要涉及到多个节点访问同一个公共资源的时候&#xff0c;就需要加锁来实现互斥&#xff0c;从而达到线程安全的问题。 但是呢&#xff0c;分布式系统不同一些&#xff0c;因为分布式系统部署在不同的服务器上&#xff0c;很可能大量的请求打到…

City Builder Urban 城市都市街道建筑场景模型

目前拥有178项优质资产。 城市建设者:Urban一个高质量的资产包,专为快速的纽约式城市建设而设计,与所有渲染管道兼容。 资产 56个带LOD的街道和屋顶道具 13个可堆叠的建筑部件与LOD混合搭配 10个不同尺寸的建筑装饰/分离器,总共40个装饰 请参阅秋季列表的技术细节 1个带有C…

【分布式微服务云原生】8分钟探索RPC:远程过程调用的奥秘与技术实现

摘要 在分布式系统中&#xff0c;RPC&#xff08;Remote Procedure Call&#xff0c;远程过程调用&#xff09;技术是连接各个组件的桥梁。本文将深入探讨RPC的概念、技术实现原理、以及请求处理的详细过程。通过清晰的结构、流程图、代码片段和图表&#xff0c;我们将一起揭开…

二分查找一>寻找旋转排序数组中的最小值

1.题目&#xff1a; 2.解析&#xff1a; 代码&#xff1a; 方法一&#xff1a;以最后一个元素为参照物int left 0, right nums.length-1;int n nums.length-1;while(left < right) {int mid left(right-left)/2;if(nums[mid] > nums[n]) left mid1;else right mid…