题解 | #输入序列连续的序列检测#

输入序列连续的序列检测

https://www.nowcoder.com/practice/d65c2204fae944d2a6d9a3b32aa37b39

思路:既然是8位数据的序列检测,所以很自然地想到定义状态机来完成:S0_IDLE处于等待状态,当检测到a = 0时转到S1,如果为1则继续在S0处等待。在S1状态下检测是否满足a ==1,是则转到下一状态S2。这里有个关键点:!!!如果不满足,由于当前a==2'b00,末尾的0满足了数据帧01110001首位的要求,所以让其继续在S1状态等待,而不是跳回到S0处。之后的状态依次类推,由于match信号在满足要求的情况下延迟一拍输出,所以这里定义了S8状态用于打一拍,并且输出,代码如下;

`timescale 1ns/1ns

module sequence_detect(

    input clk,

    input rst_n,

    input a,

    output reg match

    );

  parameter S0 = 4'b0000,

            S1 = 4'b0001,

            S2 = 4'b0010,

            S3 = 4'b0011,

            S4 = 4'b0100,

            S5 = 4'b0101,

            S6 = 4'b0110,

            S7 = 4'b0111,

            S8 = 4'b1000;

 reg[3:0] state;

always @(posedge clk or negedge rst_n) begin

    if(!rst_n) begin

        match <= 1'b0;

        state <= S0;

    end

    else begin

            case(state)

            S0:begin

                if(a == 0) begin

                    state <= S1;

                    match <= 1'b0;

                end

                else begin

                    state <= S0;

                    match <= 1'b0;

                end

            end

            S1:begin

                if(a == 1)

                    state <= S2;

                else

                    state <= S1;

            end

            S2:begin

                if(a == 1)

                    state <= S3;

                else

                    state <= S1;

            end

            S3:begin

                if(a == 1)

                    state <= S4;

                else

                    state <= S1;

            end

            S4:begin

                if(a == 0)

                    state <= S5;

                else

                    state <= S0;

            end

            S5:begin

                if(a == 0)

                    state <= S6;

                else

                    state <= S2;

            end

            S6:begin

                if(a == 0)

                    state <= S7;

                else

                    state <= S2;

            end

            S7:begin

                if(a == 1) begin

                    state <= S8;

                end

                else

                    state <= S1;

            end

            S8:begin

                    state <= S0;

                    match <= 1'b1;

                end

        endcase

    end

end

endmodule

全部评论

相关推荐

点赞 评论 收藏
分享
后端实习中的&nbsp;“好需求”,核心定义是能支撑面试深度讨论、可向外延伸多维度知识点的需求——&nbsp;本质是能让你在面试官拷打时,有足够空间展现技术积累、解决问题的能力,而非仅完成简单&nbsp;CRUD。结合面试反推逻辑,具体可分为三类,且都具备&nbsp;“可延伸、有讨论点”&nbsp;的共性。本质上是这个需求要支撑你能给面试官吹牛逼。典型的垃圾需求:或许有的同学可能还不理解什么叫做可以吹牛逼的需求,我举一个最简单的反例,很多同学写苍穹外卖的时候,总爱把一个需求写到简历上:&nbsp;&nbsp;基于OSS处理用户上传图片,获取OSS返回URL,实现用户远程上传图片。这就是个最典型的垃圾需求。因为你发现论代码链路,他没什么可讲的。论各种新潮技术,他也...
反装笔大队长:分情况吧。需求分业务需求和技术需求,技术需求你说的是对的。像CRM、OA、NC等等,这些业务系统很多时候对技术要求并不高的,不可否认的是 这些需求还是很不错的。 NC系统的进销存。实际上只是对仓库、库位、库存量、入库出库单价、数据报表等数据的统计与计算。CRM的市场活动、人面画像分析与统计、客户信息管理等,这些无非都是一些增删改查。对于业务需求面试官通常都是问你对业务的理解与过往对该业务的处理方案,并不会死磕技术。技术肯定是多多益善,但在业务开发中 正在有意义的是你的经历。
投递字节跳动等公司10个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务