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

输入序列连续的序列检测

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

状态机实现

由于原序列中存在连续0和1,因而可使用计数器减少状态数,最终使用了4个状态实现,进一步精简可仅使用3个状态,代码如下

`timescale 1ns/1ns
module sequence_detect(
	input clk,
	input rst_n,
	input a,
	output reg match
	);
    
    reg [1:0] state;
    reg [1:0] cnt;
    //状态转换
    always @(posedge clk or negedge rst_n) begin
        if(!rst_n)
            state <= 0;
        else begin
            case(state)
            0: begin            //0
                if(!a)
                    state <= 1;
                else
                    state <= 0;
            end
            1: begin            //01110
                if(cnt == 3) begin
                    if(!a)
                        state <= 2;
                    else
                        state <= 0;
                end
                else
                    state <= 1;
            end
            2: begin            //01110001
                if(a) begin
                    if(cnt == 2)
                        state <= 3;
                    else
                        state <= 1;
                end
                else
                    state <= 2;
            end
            3: begin
                state <= 0;
            end
        endcase
        end
    end
    //计数器计数
    always @(posedge clk or negedge rst_n) begin
        if(!rst_n)
            cnt <= 0;
        else begin
            case(state)
                1: begin
                    if(a)
                       cnt <= cnt + 1;
                    else
                       cnt <= 0;
                end
                2: begin
                    if(!a)
                       cnt <= cnt + 1;
                    else        //检测到a == 1必然切换至1或3,若转换至1则因已检测一个高电平故cnt <= 1
                       cnt <= 1;
                end
                default: cnt <= 0;
            endcase
        end
    end
    //输出
    always @(posedge clk or negedge rst_n) begin
        if(!rst_n)
            match <= 0;
        else if(state == 3)
            match <= 1;
        else
            match <= 0;
    end
endmodule
全部评论
一段式状态机尽量还是少写
点赞 回复 分享
发布于 2022-03-08 22:37
这个有意思,不过用两段式状态机会好一些
点赞 回复 分享
发布于 2022-07-21 20:26
还是使用移位寄存器感觉简单点,不过这个计数器有点意思
点赞 回复 分享
发布于 2023-01-09 08:57 四川
这个写的真有意思
点赞 回复 分享
发布于 04-23 10:44 安徽

相关推荐

不愿透露姓名的神秘牛友
10-05 10:13
已编辑
HHHHaos:让这些老登来现在秋招一下,简历都过不去
点赞 评论 收藏
分享
hso_:哈哈哈哈哈哈我没offer一样在同一道题开喷了
投递深圳同为数码等公司10个岗位
点赞 评论 收藏
分享
11 4 评论
分享
牛客网
牛客企业服务