题解 | #含有无关项的序列检测#

含有无关项的序列检测

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

思路同输入序列连续的序列检测,既可以用移位寄存器,又可以用状态机。

代码

移位寄存器

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

状态机

下面的状态机不够完善,没法检测重复序列,目前也没有简单点的解决方法。

module sequence_detect(
	input clk,
	input rst_n,
	input a,
	output reg match
);
    parameter ZERO=0, ONE=1, TWO=2, THREE=3, FOUR=4, FIVE=5, SIX=6, SEVEN=7, EIGHT=8, NINE=9;
    reg [3:0] state, nstate;
    
    always@(posedge clk or negedge rst_n) begin
        if(~rst_n)
            state <= ZERO;
        else
            state <= nstate;
    end
    
    always@(*) begin
        case(state)
            ZERO   : nstate = a? ZERO : ONE;
            ONE    : nstate = a? TWO  : ONE;
            TWO    : nstate = a? THREE: ONE;
            THREE  : nstate = FOUR;
            FOUR   : nstate = FIVE;
            FIVE   : nstate = SIX;
            SIX    : nstate = a? SEVEN: ONE;
            SEVEN  : nstate = a? EIGHT: ONE;
            EIGHT  : nstate = a? ZERO: NINE;
            NINE   : nstate = a? TWO  : ONE;
            default: nstate = ZERO;
        endcase
    end
    
    always@(posedge clk or negedge rst_n) begin
        if(~rst_n)
            match = 0;
        else
            match = state==NINE;
    end
  
endmodule
Verilog篇题解 文章被收录于专栏

本人对牛客网verilog篇题目一些理解

全部评论
这个状态机如果0110110xx110的情况是不是就不能检测了
点赞 回复 分享
发布于 2022-04-15 12:09
感觉状态机有问题 第6步不能直接根据a的值回到1的。。。。。。。还是要再判断的
点赞 回复 分享
发布于 2022-08-11 14:00
天翼云科技有限公司
校招火热招聘中
官网直投
可以增加一个计数信号,打满三拍后再跳转
点赞 回复 分享
发布于 2023-02-18 21:18 四川

相关推荐

不愿透露姓名的神秘牛友
09-15 12:11
点赞 评论 收藏
分享
刘友牛玥:你看,真测出来了
点赞 评论 收藏
分享
10 1 评论
分享
牛客网
牛客企业服务