【Verilog刷题篇】硬件工程师进阶1|序列检测

这篇具有很好参考价值的文章主要介绍了【Verilog刷题篇】硬件工程师进阶1|序列检测。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

  • 硬件工程师近年来也开始慢慢吃香,校招进大厂年薪总包不下30-40w的人数一大把!而且大厂人数并没有饱和!
    - 本期是【Verilog刷题篇】硬件工程师进阶1|序列检测,有不懂的地方可以评论进行讨论!
  • 推荐给大家一款刷题、面试的神器,我也是用这一款神器进行学习Verilog硬件代码的!
  • ~链接如下:刷题面试神器跳转链接
  • 也欢迎大家去牛客查看硬件工程师招聘职位的各类资料,并进行提前批投递面试!
  • 小白新手可以通过该神器进行日常的刷题、看大厂面经、学习计算机基础知识、与大牛面对面沟通~ 刷题的图片已经放在下面了~

verilog刷题,算法小记,fpga开发

Q1:输入序列连续的序列检测

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

模块的接口信号图如下:
verilog刷题,算法小记,fpga开发
模块的时序图如下:
verilog刷题,算法小记,fpga开发

输入描述:
clk:系统时钟信号
rst_n:异步复位信号,低电平有效
a:单比特信号,待检测的数据

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

案例代码:

`timescale 1ns/1ns
module sequence_detect(
	input clk,
	input rst_n,
	input a,
	output reg match
	);
    parameter zero = 4'd0;
       parameter one = 4'd1;
       parameter two = 4'd2;
       parameter three = 4'd3;
       parameter four = 4'd4;
       parameter five = 4'd5;
       parameter six = 4'd6;
       parameter seven = 4'd7; 
    parameter    eight=4'd8;
   
    reg [3:0] cu_st;
    always@(posedge clk or negedge rst_n)
        begin
            if(!rst_n)begin
                cu_st<=zero;
                match<=1'b0;end
            else begin
                case(cu_st)
                    zero:if(a==1'b0)begin
                                cu_st<=one;
                                match<=1'b0;end                   
                         else begin
                                 cu_st<=zero;
                                 match<=1'b0; end
                    one:if(a==1'b1)begin
                                cu_st<=two;
                                match<=1'b0;end                   
                         else begin
                                 cu_st<=one;
                                 match<=1'b0; end
                    two:if(a==1'b1)begin
                                cu_st<=three;
                                match<=1'b0;end                   
                         else begin
                                 cu_st<=one;
                                 match<=1'b0; end
                    three:if(a==1'b1)begin
                                cu_st<=four;
                                match<=1'b0;end                   
                         else begin
                                 cu_st<=one;
                                 match<=1'b0; end
                    four:if(a==1'b0)begin
                                cu_st<=five;
                                match<=1'b0;end                   
                         else begin
                                 cu_st<=zero;
                                 match<=1'b0; end
                    five:if(a==1'b0)begin
                                cu_st<=six;
                                match<=1'b0;end                   
                         else begin
                                 cu_st<=two;
                                 match<=1'b0; end
                    six:if(a==1'b0)begin
                                cu_st<=seven;
                                match<=1'b0;end                   
                         else begin
                                 cu_st<=two;
                                 match<=1'b0; end
                    seven:if(a==1'b1)begin
                                cu_st<=eight;
                                match<=1'b0;end                   
                         else begin
                                 cu_st<=one;
                                 match<=1'b0; end
                    eight:if(a==1'b1)begin
                                cu_st<=three;
                                match<=1'b1;end                   
                         else begin
                                 cu_st<=one;
                                 match<=1'b1; end
                    default:begin cu_st<=zero;
                        match<=1'b0;end
                endcase
                
                
            end
        end
 
endmodule

Q2: 含有无关项的序列检测

问题描述:请编写一个序列检测模块,检测输入信号a是否满足011XXX110序列(长度为9位数据,前三位是011,后三位是110,中间三位不做要求),当信号满足该序列,给出指示信号match。

程序的接口信号图如下:
verilog刷题,算法小记,fpga开发
程序的功能时序图如下:
verilog刷题,算法小记,fpga开发

输入描述:
clk:系统时钟信号
rst_n:异步复位信号,低电平有效
a:单比特信号,待检测的数据

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

案例代码:

`timescale 1ns/1ns
module sequence_detect(
	input clk,
	input rst_n,
	input a,
	output reg match
	);
    reg [8:0] a_temp;
    always@(posedge clk or negedge rst_n)
        begin
            if(!rst_n)
                a_temp<=9'b0;
            else
                a_temp<={a_temp[7:0],a};
            
        end
    always@(posedge clk or negedge rst_n)
        begin
            if(!rst_n)
                match<=1'b0;
            else if(a_temp[8:6]==3'b011&&a_temp[2:0]==3'b110)
                match<=1'b1;
            else
                match<=1'b0;
                end
               
endmodule

Q3:不重叠序列检测

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

模块的接口信号图如下:
verilog刷题,算法小记,fpga开发
模块的时序图如下:
verilog刷题,算法小记,fpga开发

输入描述:
clk:系统时钟信号
rst_n:异步复位信号,低电平有效
a:单比特信号,待检测的数据

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

案例代码:

`timescale 1ns/1ns
module sequence_detect(
	input clk,
	input rst_n,
	input data,
	output reg match,
	output reg not_match
	);
	reg [5:0]cs;
	reg [5:0]ns;
	
	reg [5:0]count;
	always@(posedge clk or negedge rst_n)
	   if(!rst_n)
	   count<=0;
	   else if (count>=5)
	     count<=0;
	    else
	    count<=count+1;
	   
	
	always@(posedge clk or negedge rst_n)
	if(!rst_n)begin
	   ns<=0;
	   cs<=0;
	   end
	else 
	   cs<=ns;
	parameter IDLE=0,s1=1,s2=2,s3=3,s4=4,s5=5,s6=6;
	parameter NOT_MATCH=7;
	

always@(*)
	  case(cs)
	    IDLE:ns = (data==0)? s1:NOT_MATCH;
	    s1:ns =   (data==1)? s2:NOT_MATCH;
	    s2:ns =   (data==1)? s3:NOT_MATCH;
	    s3:ns =   (data==1)? s4:NOT_MATCH;
	    s4:ns =   (data==0)? s5:NOT_MATCH;
	    s5:ns =   (data==0)? s6:NOT_MATCH;
	    s6:ns =   (data==0)? s1:NOT_MATCH;
	    NOT_MATCH:ns = (data==0&&count == 5)? s1:NOT_MATCH;
	endcase
	
	always@(posedge clk or negedge rst_n)
	  if(!rst_n)begin
	    match<=0;
	    not_match<=0;
	    end
    else if (count == 5)begin
        
        if(ns==s6)begin
	        match<=1;
	        not_match<=0;
	     end
	    else begin
            match<=0;
	       not_match<=1;  
	      end
    end
     else begin
        match <= 1'b0;
        not_match <= 1'b0;
    end
        
    endmodule

Q4:输入序列不连续的序列检测

问题描述:请编写一个序列检测模块,输入信号端口为data,表示数据有效的指示信号端口为data_valid。当data_valid信号为高时,表示此刻的输入信号data有效,参与序列检测;当data_valid为低时,data无效,抛弃该时刻的输入。当输入序列的有效信号满足0110时,拉高序列匹配信号match。

模块的接口信号图如下:
verilog刷题,算法小记,fpga开发
模块的时序图如下:
verilog刷题,算法小记,fpga开发

输入描述:
clk:系统时钟信号
rst_n:异步复位信号,低电平有效
data:单比特信号,待检测的数据
data_valid:输入信号有效标志,当该信号为1时,表示输入信号有效

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

案例代码:

`timescale 1ns/1ns
module sequence_detect(
	input clk,
	input rst_n,
	input data,
	input data_valid,
	output reg match
	);
    parameter [3:0] data_ref = 4'b0110;
    reg [3:0] data_in;
    always @(posedge clk or negedge rst_n)
        if(!rst_n) data_in <= 4'b0000;
        else if(data_valid) data_in <= {data_in[2:0],data};

    always @(posedge clk or negedge rst_n) begin
        if(!rst_n) match <= 1'b0;
        else if((data_in[2:0] == 3'b011) && (!data))  match <= 1'b1;
        else match <= 1'b0;

    end
    
endmodule

Q5:信号发生器

问题描述:请编写一个信号发生器模块,根据波形选择信号wave_choise发出相应的波形:wave_choice=0时,发出方波信号;wave_choice=1时,发出锯齿波信号;wave_choice=2时,发出三角波信号。

模块的接口信号图如下:
verilog刷题,算法小记,fpga开发
模块的时序图如下:
verilog刷题,算法小记,fpga开发

输入描述:
clk:系统时钟信号
rst_n:异步复位信号,低电平有效
wave_choise:2比特位宽的信号,根据该信号的取值不同,输出不同的波形信号

输出描述:
wave:5比特位宽的信号,根据wave_choise的值,输出不同波形的信号

案例代码:

`timescale 1ns/1ns
module signal_generator(
	input clk,
	input rst_n,
	input [1:0] wave_choise,
	output reg [4:0]wave
	);

    reg [4:0] cnt;
    reg k;
    always @(posedge clk or negedge rst_n) begin
        if(!rst_n) begin
            cnt <= 5'd0;
            wave <= 5'd0;
        end
        else begin
            case(wave_choise)
                2'd0:begin
                    if(cnt == 5'd19) begin
                        cnt <= 5'd0;
                        wave <= 5'd0;
                    end
                    else if(cnt>=5'd9 && cnt<5'd19)begin
                        cnt <= cnt + 1'b1;
                        wave <= 5'd20;
                    end
                    else begin
                        cnt <= cnt + 1'b1;
                        wave <= 5'd00;
                    end
                end
                2'd1:begin
                    if(wave >= 5'd20)
                        wave <= 5'd0;
                    else
                        wave <= wave + 1'b1;
                end
                2'd2:begin
                    if(wave == 5'd0) begin
                        k <= 1'b0;
                        wave <= wave + 1'b1;
                    end
                    else if(wave == 5'd20) begin
                        k <= 1'b1;
                        wave <= wave - 1'b1;
                    end
                    else if(k == 1'b0 && wave < 5'd20)
                        wave <= wave + 1'b1;
                    else if(k == 1'b1 && wave > 5'd0)
                        wave <= wave - 1'b1;
                    else
                        wave <= wave - 1'b1;
                end
                default:begin wave <= wave;end
            endcase
        end
    end
  
endmodule

总结:小白跟大牛都在用的平台

  • 硬件工程师近年来也开始慢慢吃香,校招进大厂年薪总包不下30-40w的人数一大把!而且大厂人数并没有饱和!
    - 本期是【Verilog刷题篇】硬件工程师从0到入门3|组合逻辑复习+时序逻辑入门,有不懂的地方可以评论进行讨论!

快来点击链接进行跳转注册,开始你的保姆级刷题之路吧!刷题打怪码神之路

另外这里不仅仅可以刷题,你想要的这里都会有,十分适合小白和初学者入门学习~
1、算法篇(398题):面试必刷100题、算法入门、面试高频榜单
2、数据结构篇(300题):都是非常经典的链表、树、堆、栈、队列、动态规划等
3、语言篇(500题):C/C++、java、python入门算法练习
4、SQL篇(82题):快速入门、SQL必知必会、SQL进阶挑战、面试真题
5、大厂笔试真题:字节跳动、美团、百度、腾讯…掌握经验不在惧怕面试!

verilog刷题,算法小记,fpga开发文章来源地址https://www.toymoban.com/news/detail-777341.html

到了这里,关于【Verilog刷题篇】硬件工程师进阶1|序列检测的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 关于一个硬件测试工程师的若干思考

    关于一个硬件测试工程师的若干思考

    前段时间生病停更了一段时间,中间请了很长时间的病假在家养病,闲暇之余对工作产生了一丝丝思考。作为一个工作了1609天的入门硬测工程师,一时觉得工作枯燥无味,一时又对工作充满希望。硬件测试工程师!懂得都懂!大部分的工作是枯燥乏味的,在一家公司工作时间

    2024年02月02日
    浏览(13)
  • 硬件工程师成长之路(11)——职业规划

    硬件工程师成长之路(11)——职业规划

    系列文章目录 1.元件基础 2.电路设计 3.PCB设计 4.元件焊接 5.板子调试 6.程序设计 7.算法学习 8.编写exe 9.检测标准 10.项目举例 11.职业规划 送给大学毕业后找不到奋斗方向的你(每周不定时更新) 【牛客网】构建从学习到职业的良性生态圈 中国计算机技术职业资格网 上海市工

    2024年02月17日
    浏览(15)
  • 【华为HCIP | 高级网络工程师】刷题日记(8)

    【华为HCIP | 高级网络工程师】刷题日记(8)

    个人名片: 🐼 作者简介:一名大二在校生 🐻‍❄️ 个人主页:落798. 🐼 个人WeChat:落798. 🕊️ 系列专栏: 零基础学java ----- 重识c语言 ---- 计算机网络 🐓 每日一句: 看淡一点在努力,你吃的苦会铺成你要的路! 1、在IPsec中,能够用哪一个协议来实现数据的完整性?

    2024年02月13日
    浏览(8)
  • 硬件工程师学习-硬件的单元测试(UT)(1)电源与时钟的测试

    硬件工程师学习-硬件的单元测试(UT)(1)电源与时钟的测试

    调试功能基本OK后,进入单元测试阶段。 单元测试,一般是指基于开发人员自行开展的功能测试及各个功能单元的单元测试,是硬件信号级的测试,分为基本测试和信号完整性测试。也被称作硬件的白盒测试。 1、单元测试开始前,全项目组人员一起学习《硬件单元测试规范

    2024年02月06日
    浏览(12)
  • 硬件系统工程师宝典(12)-----EMC应该知道的事

    硬件系统工程师宝典(12)-----EMC应该知道的事

    各位同学大家好,欢迎继续做客电子工程学习圈,今天我们继续来讲这本书,硬件系统工程师宝典。上篇我们说到在做电源完整性分析时去耦电容要遵循的规则,大电容的去耦半径大,小电容的去耦半径小,电容焊盘扇出时,双过孔可以减少寄生电感等。今天我们开始学习

    2023年04月23日
    浏览(10)
  • 硬件工程师必会电路模块之MOS管应用

    硬件工程师必会电路模块之MOS管应用

    MOS管开关电路 学习过模拟电路的人都知道三极管是流控流器件,也就是由基极电流控制集电极与发射极之间的电流;而MOS管是压控流器件,也就是由栅极上所加的电压控制漏极与源极之间电流。 MOSFET管是FET的一种,可以被制造为增强型或者耗尽型,P沟道或N沟道共四种类型,

    2024年02月10日
    浏览(12)
  • 硬件系统工程师宝典(17)-----你的PCB符合工艺要求吗?

    硬件系统工程师宝典(17)-----你的PCB符合工艺要求吗?

    各位同学大家好,欢迎继续做客电子工程学习圈,今天我们继续来讲这本书,硬件系统工程师宝典。上篇我们说到PCB设计中板子要符合EMC,信号的走线要平顺,信号回流阻抗尽量小。今天我们开始看看板子在生产制造时的工艺问题。 DFX全称是Design for X(面向产品生命周期各环

    2024年02月04日
    浏览(12)
  • 硬件工程师需要掌握的PCB设计常用知识点

    硬件工程师需要掌握的PCB设计常用知识点

          一个优秀的硬件工程师设计的产品一定是既满足设计需求又满足生产工艺的,某个方面有瑕疵都不能算是一次完美的产品设计。规范产品的电路设计,工艺设计,PCB设计的相关工艺参数,使得生产出来的实物产品满足可生产性、可测试性、可维修性等的技术规范要求,

    2023年04月20日
    浏览(10)
  • 硬件系统工程师宝典(15)-----PCB上的EMC设计,“拿捏了”

    硬件系统工程师宝典(15)-----PCB上的EMC设计,“拿捏了”

    各位同学大家好,欢迎继续做客电子工程学习圈,今天我们继续来讲这本书,硬件系统工程师宝典。上篇我们说到PCB常用的多层板叠层结构,综合成本、性能、需求考虑选择不同的叠层结构。今天我们来看看为提高EMC性能,在PCB设计上能有哪些处理。 做过EMC设计的都知道,滤

    2023年04月19日
    浏览(30)
  • 【经验分享】硬件工程师需要知道的DFM可制造性设计

    【经验分享】硬件工程师需要知道的DFM可制造性设计

    最近,有硬件工程师朋友找我讨论DFM,也就是可制造性设计。Design for Manufacturability。 什么是可制造性设计,看一张图很容易明白: 过大的PCB,无法上产线批量生产,极大的PCB面积浪费,自然是失败的可制造性设计了。 当然人家只是为了搞笑,真的可制造性设计在这里: 作

    2023年04月20日
    浏览(22)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包