Verilog 学习之路(三)——牛客刷题篇

1.输入序列连续的序列检测

  • 题面
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kJH9kHFH-1690301233803)(https://s2.loli.net/2023/07/26/HJPXR2mhbaVCG6d.png)]
  • 思路

对于序列检测题目,常规的解法有两种:状态机法和序列缓存对比法。
状态机法的过程类似于:在初始状态中,先判断第一位是否符合,若符合则进入下一个状态,判断第二位是否符合;若第一位不符合则保持在初始状态,直到第一位匹配。如前两位匹配,则判断第三位是否符合,若第一位匹配,最新输入的数值和目标序列的第二位不匹配,则根据最新一位是否匹配第一位,进入第一位匹配状态或者初始状态。依次类推。
序列缓存对比法,则是将八个时刻的数据缓存,作为一个数组,每个时刻的输入位于数组的末尾,数组其它元素左移,把最早输入的数据移出。然后将数组和目标序列对比,如果数组和目标序列相等,则说明出现目标序列。
序列缓存对比法在实现上比较简单。首先声明一个数组,缓存八个时刻的a输入的数值。移位可以通过位截取操作和位拼接操作实现:a_tem[6:0]表示截取a_tem的低7位,{a_tem[6:0],a}表示把a_tem[6:0]和新输入的数值a拼接,a位于低位。

  • 代码
`timescale 1ns/1ns
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) beginif (!rst_n) beginmatch <=1'b0;endelse if (a_tem == 8'b0111_0001) beginmatch <= 1'b1;endelse beginmatch <= 1'b0;endendalways @(posedge clk or negedge rst_n) beginif (!rst_n) begina_tem <= 8'b0;endelse begina_tem <= {a_tem[6:0],a};endendendmodule

2.含有无关项的序列检测

  • 题面
    在这里插入图片描述
  • 思路

序列缓存对比法,则是将九个时刻的数据缓存,作为一个数组,每个时刻的输入位于数组的末尾,数组其它元素左移,把最早输入的数据移出。然后截取数组的前三位和目标序列011对比,截取数组的后三位和目标序列110对比,如果两段数组都和目标序列相等,则说明出现目标序列。
序列缓存对比法在实现上比较简单,本题采用该方法实现。首先声明一个数组,缓存九个时刻的a输入的数值。移位可以通过位截取操作和位拼接操作实现:a_tem[7:0]表示截取a_tem的低7位,{a_tem[7:0],a}表示把a_tem[7:0]和新输入的数值a拼接,a位于低位。

  • 代码
`timescale 1ns/1ns
module sequence_detect(input clk,input rst_n,input a,output match);reg [8:0] a_tem;reg match_f;reg match_b;always @(posedge clk or negedge rst_n) beginif (!rst_n) beginmatch_f <=1'b0;endelse if (a_tem[8:6] == 3'b011) beginmatch_f <= 1'b1;endelse beginmatch_f <= 1'b0;endendalways @(posedge clk or negedge rst_n) beginif (!rst_n) beginmatch_b <= 1'b0;endelse if (a_tem[2:0] == 3'b110) beginmatch_b <= 1'b1;endelse beginmatch_b <= 1'b0;endendalways @(posedge clk or negedge rst_n) beginif (!rst_n) begina_tem <= 9'b0;end else begina_tem <= {a_tem[7:0],a};endendassign match = match_b && match_f;
endmodule
  • 解法2
`timescale 1ns/1ns
module sequence_detect(input clk,input rst_n,input a,output reg match);reg [8:0] sequence;always @(posedge clk or negedge rst_n) beginif (~rst_n) beginsequence <= 9'b0;endelse beginsequence <= {sequence[7:0],a};endendalways @(posedge clk or negedge rst_n) beginif (~rst_n) beginmatch <= 0;endelse if (sequence[8:6] == 3'b011 && sequence[2:0] == 3'b110) beginmatch <= 1;endelse beginmatch <= 0;endendendmodule
  • 解法3
`timescale 1ns/1ns
module sequence_detect(input clk,input rst_n,input a,output reg match);reg [8:0] val;always @(posedge clk or negedge rst_n) beginif (!rst_n) beginval <= 9'b0;end else beginval <= {val[7:0],a};endendalways @(posedge clk or negedge rst_n) beginif (!rst_n) beginmatch <= 1'b0;end else begincasex (val)9'b011xxx110 : match <= 1'b1;default : match <= 1'b0;endcaseendendendmodule

3. 不重叠序列检测

  • 题意
    在这里插入图片描述
    题目描写错误,应该是001110,而题目是011100,差评。
  • 思路

使用数选器选择出来对应的位,再做同或与最后做与运算,资源用的也很少。

  • 代码
`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 cmp;reg  detect_cmp;parameter detect = 6'b011100;always@(posedge clk or negedge rst_n)beginif(! rst_n) cnt  <=  3'd0;else if(cnt == 3'd5)cnt  <=  3'd0;else cnt  <=  cnt  + 3'd1;endalways@(*)begincase(cnt)3'd0: cmp = 1'd0;3'd1: cmp = 1'd1;3'd2: cmp = 1'd1;3'd3: cmp = 1'd1;3'd4: cmp = 1'd0;3'd5: cmp = 1'd0;default: cmp = 1'd0;endcaseendalways@(posedge clk or negedge rst_n) beginif(! rst_n)detect_cmp <= 1'd1;else if(cnt == 3'd5)detect_cmp  <=  1'd1;elsedetect_cmp <= detect_cmp && (~( cmp^ data));endalways@(posedge clk or negedge rst_n) beginif(! rst_n)match <= 1'd0;else if((detect_cmp )&&(cnt == 3'd5))match <= 1'd1;elsematch <= 1'd0;endalways@(posedge clk or negedge rst_n) beginif(! rst_n)not_match <= 1'd0;else if((!detect_cmp)&&(cnt == 3'd5))not_match <= 1'd1;elsenot_match <= 1'd0;end
endmodule

4. 简易秒表

  • 题意

image-20230725181116009

  • 思路

首先确定second的取值逻辑:当minute=60时停止计数,即保持second为0;当second=60时,下一个周期second置为1。其余情况second 等于前一时刻的值加一。 然后明确minute的取值逻辑:当second=60,minute等于前一时刻的值加一。其余情况,minute保持不变。

  • 代码
`timescale 1ns/1nsmodule count_module(input clk,input rst_n,output reg [5:0]second,output reg [5:0]minute);always @(posedge clk or negedge rst_n) beginif (!rst_n) beginminute <= 6'd0;end else if (second == 6'd60) beginminute <= minute + 1;endelse beginminute <= minute;endendalways @(posedge clk or negedge rst_n) beginif (!rst_n) beginsecond <= 6'd0;end else if (second == 6'd60) beginsecond <= 6'd1;endelse if (minute == 60) beginsecond <=0;end else second <= second + 1'd1;end
endmodule

5. 可置位计数器

  • 题意
    在这里插入图片描述
  • 思路

​ 首先明确number的取值逻辑,声明number变量为4位无符号数,数值每个时钟加一,则每次数值达到15,下一个时钟因为位宽的限制,自动变为1,可以实现十六进制计数。当set信号为1时,将set_num的值赋给number。

然后确定zero的取值逻辑,在默认情况下为0,当number=0时,zero值为1。

因为判断number4’d0需要一个时钟,zero信号为1,总是滞后number0一个时钟周期。所以可以考虑将number延迟一个时钟再输出。使用num变量代替上述的number,再通过以下语句实现number延迟一个时钟输出。【因为number是寄存器类型,无法通过组合逻辑进行阻塞赋值同时匹配。 如果直接使用number进行zero的判断来说,zero肯定是比number过“0”时刻慢一拍的; 所以不妨使用num_reg,进行延迟; 因为zero肯定是比num_reg慢一拍的,所以再通过num_reg延迟一拍给number,则number与zero同步输出匹配;】

  • 代码
`timescale 1ns/1nsmodule count_module(input clk,input rst_n,input set,input [3:0] set_num,output reg [3:0]number,output reg zero);reg [3:0] num;always @(posedge clk or negedge rst_n) beginif (!rst_n) beginzero = 1'd0;end else if (num == 4'd0) beginzero <= 1'b1;end else beginzero <= 1'b0;endendalways @(posedge clk or negedge rst_n) beginif (!rst_n) beginnum <= 4'b0;endelse if (set) beginnum <= set_num;endelse beginnum <= num + 1'd1;endendalways @(posedge clk or negedge rst_n) beginif (!rst_n) beginnumber <= 1'd0;endelse beginnumber <= num;endend
endmodule

6. 加减计数器

  • 题意
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-njD5fjwg-1690301397147)(https://s2.loli.net/2023/07/26/sOD1nVqmpaLbWyC.png)]

  • 思路

​ 首先确定zero的取值逻辑,在默认情况下为0,当number=0时,zero值为1。 always @(posedge clk or negedge rst_n)

​ 然后将mode的值作为if-else的判断条件,当mode为1时,number每个时钟周期加一,当mode为0时,number每个时钟周期减一。

​ 按照以上代码,因为判断number4’d0需要一个时钟,zero信号为1,总是滞后number0一个时钟周期。所以可以考虑将number延迟一个时钟再输出。使用num变量代替上述的number,再通过以下语句实现number延迟一个时钟输出。

  • 代码
`timescale 1ns/1nsmodule count_module(input clk,input rst_n,input mode,output reg [3:0]number,output reg zero);reg [3:0] num;always @(posedge clk or negedge rst_n) beginif (!rst_n) beginzero <= 1'd0;endelse if (num == 4'd0) beginzero <= 1'b1;endelse beginzero <= 1'b0;endendalways @(posedge clk or negedge rst_n) beginif (!rst_n) beginnum <= 4'b0;end else if (mode) beginif (num == 9) num <= 0;else num <= num + 1'd1;end else if (!mode) beginif (num == 0) num <= 9;else num <= num - 1'd1;endelse num <= num ;endalways @(posedge clk or negedge rst_n) beginif (!rst_n) beginnumber <= 4'd0;end else beginnumber <= num;endend
endmodule

7.RAM的简单实现

  • 题意

image-20230725182928583

  • 思路

要实现RAM,首先要声明数据的存储空间,例如:[3:0] rom [7:0];变量名称ram之前的[3:0]表示每个数据具有多少位,指位宽;变量名称ram之后的[7:0]表示需要多少个数据,指深度,注意这里深度为8,应该是使用[7:0],而不是[2:0];

​ 声明存储变量之后,需要对ram进行初始化,写入数据,当write_en有效,向write_addr写入write_data,当read_en有效,根据输入的read_addr输出read_data。需要注意的是,题目要求实现真双端口RAM,即可以同时写入和读出,所以需要使用两个always语句块实现写入和读出逻辑,不可以在同一个always块中使用if-else if-else if结果。

  • 代码
`timescale 1ns/1ns
module ram_mod(input clk,input rst_n,input write_en,input [7:0]write_addr,input [3:0]write_data,input read_en,input [7:0]read_addr,output reg [3:0]read_data
);reg [3:0] myRAM [7:0];reg [8:0] i;always @(posedge clk or negedge rst_n) beginif (!rst_n) beginfor (i = 0;i < 256;i = i+1)myRAM[i] = 0;endelse beginmyRAM[write_addr] <= write_en ? write_data:myRAM[write_addr];endendalways @(posedge clk or negedge rst_n) beginif (~rst_n) beginread_data <= 0;endelse read_data <= read_en?myRAM[read_addr]:read_data;end
endmodule

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

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

相关文章

概率论和随机过程的学习和整理--番外16,N合1的合成问题的求平均个数,次数,阶数

目录 1 问题 2 用条件期望&#xff0c;求合成的次数 2.1 思路1 2.2 思路2 3 用条件期望&#xff0c;求合成的个数 3.1 令X表示用材料1往上合成时&#xff0c;合成材料2的个数 3.2 令Y表示用材料1往上合成时&#xff0c;合成材料3的个数 4 用条件期望&#xff0c;求合成…

现行业供应链数字化转型难的最根本原因是什么?

由于各种原因&#xff0c;行业供应链的数字化转型可能充满挑战。然而&#xff0c;最根本的原因之一是供应链本身固有的复杂性和碎片化。以下是造成这一困难的一些关键因素&#xff1a; 1.缺乏标准化&#xff1a;供应链通常涉及多个组织、系统和流程&#xff0c;这些组织、系统…

删除主表 子表外键没有索引的性能优化

整个表147M&#xff0c;执行时一个CPU耗尽&#xff0c; buffer gets 超过1个G&#xff0c; 启用并行也没有用 今天开发的同事问有个表上的数据为什么删不掉&#xff1f;我看了一下&#xff0c;也就不到100000条数据&#xff0c;表上有外键&#xff0c;等了5分钟hang在那里&…

网络安全系统教程+学习路线(自学笔记)

一、什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防两面…

Upload-Labs通关

问题 记录BUG—在uploadlabs第三关中—关于phpstudy中修改httpd.conf依旧无法解析.php3d等问题_upload第三关常见错误_dfzy$_$的博客-CSDN博客 我们首先先来了解一下什么是文件上传 首先 很简单 文件上传就是 需要用户进行上传文件 图片或视频等信息但是如果用户恶意上传木马…

C++中的数学问题---进制转换

二进制转十六进制 string binToHex(string bin){string hex"";if(bin.size()%4!0){for(int i0;i<(4-bin.size()%4);i){bin"0"bin;}}for(int i0;i<bin.size();i4){string tmpbin.substr(i,4);bitset<4>b(tmp);hexb.to_ulong()<10?char(b.t…

解决报错:Can‘t connect to HTTPS URL because the SSL module is not available.

本人今天准备打开安装一个label-studio包&#xff0c;试了很多次&#xff0c;接连报如下错误&#xff0c;因此我就去找了一些解决方案&#xff0c;现在总结如下&#xff1a; 1、报错信息如下 2、解决方案如下&#xff1a; github上有对应的解决方案&#xff0c;链接&#xff…

操作系统18:磁盘I/O速度、磁盘可靠性、数据一致性

目录 1、提高磁盘I/O速度的途径 &#xff08;1&#xff09;磁盘高速缓存(Disk Cache) 1.1 - 数据交付(Data Delivery)方式 1.2 - 置换算法 1.3 - 周期性地写回磁盘 &#xff08;2&#xff09;提高磁盘I/O速度的其它方法 2.1 - 提前读 2.2 - 延迟写 2.3 - 优化物理块的…

安全渗透--正则表达式

什么是正则表达式&#xff1f; 正则表达式是一组由字母和符号组成的特殊文本&#xff0c;它可以用来从文本中找出满足你想要的格式的句子。 一个正则表达式是一种从左到右匹配主体字符串的模式。 “Regular expression”这个词比较拗口&#xff0c;我们常使用缩写的术语“regex…

吴恩达ChatGPT《LangChain Chat with Your Data》笔记

文章目录 1. Introduction2. Document Loading2.1 Retrieval Augmented Generation&#xff08;RAG&#xff09;2.2 Load PDFs2.3 Load YouTube2.4 Load URLs2.5 Load Notion 3. Document Splitting3.1 Splitter Flow3.2 Character Splitter3.3 Token Splitter3.4 Markdown Spl…

Ubuntu-解决包依赖关系

Ubuntu-解决包依赖关系的办法 安装软件包的时候&#xff0c;有时会遇到类似下图的依赖问题&#xff0c;无法正常安装&#xff0c;下面提供三种方法解决依赖问题。 1.可以尝试用下面方法处理依赖问题&#xff0c;紧跟前一条安装命令后面输入下面命令&#xff0c;然后再执行安装…

TSN -促进IT/OT 融合的网络技术

时间敏感网络&#xff08;tsn&#xff09;技术是IT/OT 融合的一项关键的基础网络技术&#xff0c;它实现了在一个异构网络中&#xff0c;实现OT的实时数据和IT系统的交互数据的带宽共享。 TSN允许将经典的高确定性现场总线系统和IT应用&#xff08;如大数据传输&#xff09;的功…

了解 3DS MAX 3D摄像机跟踪设置:第 2 部分

推荐&#xff1a; NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 1. 项目设置 步骤 1 打开“后效”。 打开后效果 步骤 2 转到合成>新合成以创建新合成。 将“宽度”和“高度”值分别设置为 1280 和 720。将帧速率设置为 25&#xff0c;将持续时间设置为 12 秒。单…

windows系统安装指定的vue/cli、node和npm;vue/cli脚手架搭建项目所涉及的vue/cli、node、npm依赖版本等问题

文章目录 前言一、安装vue/cli脚手架1.安装指定版本脚手架&#xff0c;我是用的3.12.0版本2.查看版本是否安装成功&#xff0c;成功有版本号2.1问题&#xff1a;安装失败2.2解决方案2.3 安装成功 二、安装指定node和npm1.为什么需要安装指定node和npm版本&#xff0c;同时匹配v…

脑电信号处理与特征提取——2.脑电的神经起源与测量(夏晓磊)

目录 二、脑电的神经起源与测量 2.1 脑电的神经起源 2.2 脑电的测量 二、脑电的神经起源与测量 2.1 脑电的神经起源 脑电起源于大脑皮层大量神经元的同步突触活动&#xff0c;主要贡献来自锥体细胞。 静息电位&#xff1a;内负外正&#xff0c;K内流。 动作电位&…

elementui plus 图标循环加载

今天在学习vue3时&#xff0c;在用Element Plus布局页面时&#xff0c;遇到了一个图标循环加载的问题。开始不知道如何渲染图标&#xff0c;以为像ElementUI 一样可以通过class进行渲染图标&#xff0c;发现无法使用&#xff0c;让后我发现引用的图标是组件&#xff0c;组件的话…

V1.4基站仓储三代标签操作指导

一、管理系统使用 1、启动v1.4基站 插上电源&#xff0c;用网线连接基站和电脑。基站默认ip为192.168.1.200&#xff0c;所以需要修改电脑的IP地址为192.168.1.x&#xff0c;例如&#xff1a;192.168.1.100 ​ 注&#xff1a;当基站第二个灯&#xff08;绿色&#xff09;闪烁…

Leetcode 111. 二叉树的最小深度

题目描述 题目链接&#xff1a;https://leetcode.cn/problems/minimum-depth-of-binary-tree/description/ 思路 DFS 代码实现 class Solution {public int minDepth(TreeNode root) {return Depth(root);}public int Depth(TreeNode root){if(rootnull){return 0;}int lef…

赛多利斯Sartorius天平java后端对接

业务场景 要将赛多利斯天平的数据读出来解析并且显示到对应的数字框,支持一台设备连接多种精度的天平 后端实现 通过协议解析数据,然后将数据存储 详细代码就不贴了,感兴趣的可以私聊我

Jupyter 安装、简单操作及工作路径更换

一、Jupyter下载安装 pip install jupyterAnaconda是Python另一个非常流行的发行版&#xff0c;它之后有着自己的叫做“conda”的安装工具。用户可以使用它来安装很多第三方包。然而&#xff0c;Anaconda会预装很多包&#xff0c;包括了Jupyter Notebook,所以若已经安装了Anac…